Чтобы ответить на этот вопрос, нам нужно знать, как работает перенаправление.
Перенаправление
запрос клиента HTTP получен. Отказ в этом запросе создается. Это всегда выглядит одинаково. Код 302 возвращается, а заголовок Состояние. Например:
HTTP/1.1 302 Moved Temporarily
Server: Apache-Coyote/1.1
Location: http://stackoverflow.com
...
Когда клиент получил этот ответ, он выполняет другой запрос. На этот раз GET-запрос к URI от Местонахождение Заголовок.
пример Вопрос объяснение
ч: commandLink triggres запрос POST. Создается ответ. Этот ответ содержит URI от действия:
HTTP/1.1 302 Moved Temporarily
Server: Apache-Coyote/1.1
Location: http://localhost:8080/myapp/pages/hello.xhtml
...
Имя параметра включено, но оно находится в теле сообщения.
Когда клиент получает код 302 и местоположение, он делает то же самое, что и всегда. Создает запрос GET:
GET /myapp/pages/hello.xhtml HTTP/1.1
Просто тело ответа POST игнорируется. Нет причин получать контент из тела и прикладывать его к запросу GET. Вот почему пример из вопроса работает неправильно.
Раствор 1:(основано на LaurentG suggstion)
includeViewParams могут быть использованы. Но он включает только значения из элементов f: viewParam.Так что на той же странице с CommandButton мы должны добавить такой элемент:
<h:head></h:head>
<f:metadata>
<f:viewParam name="name"></f:viewParam>
</f:metadata>
<h:body>
<h:form>
<h:commandLink value="Go to hello page" action="/pages/hello.xhtml?faces-redirect=true&includeViewParams=true" >
<f:param name="name" value="Hubert" />
</h:commandLink>
</h:form>
</h:body>
Итак, мы имеем F: viewParam элемент на странице hello.xhtml и эту страницу, которая перенаправляет на страницу hello.xhtml.
Раствор 2:
Если значение параметра от контроллера, то можно удалить элемент F: viewParam со страницы с ч: CommandButton. Трюк может быть сделано внутри метода действия:
<h:form>
<h:commandLink value="Go to hello page" action="#{controller.action}" />
</h:form>
И действие():
public String action() {
String outcome = "/pages/hello?faces-redirect=true";
try {
outcome += String.format("&name=%s", URLEncoder.encode(name, "UTF-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return outcome;
}
Решение 1 и 2 критяне ответ:
HTTP/1.1 302 Moved Temporarily
Server: Apache-Coyote/1.1
Location: http://localhost:8080/myapp/pages/hello.xhtml?name=Hubert
...
Вот что нам нужно.
Вы пытались добавить в свой параметр действия '& includeViewParams = true'? – LaurentG
@LaurentG, спасибо за подсказку. Это помогло мне решить мою проблему. – Hubert