2014-01-07 3 views
0

Mojarra 2.1.26е: viewParam с запросом POST и перенаправлять

У меня есть очень простой страницы:

hello.xml:

<h:head></h:head> 

<f:metadata> 
    <f:viewParam name="name"></f:viewParam> 
</f:metadata> 

<h:body> 
    <h1>Hello #{param.name} !!!</h1> 
</h:body> 

И еще одна страница index.html. На этой странице у меня есть командаLink, которая вызывает запрос POST:

<h:commandLink value="Go to hello page" action="/pages/hello.xhtml" > 
    <f:param name="name" value="Hubert" /> 
</h:commandLink> 

Это работает. Я могу видеть заявление: Привет, Юбер!

Вопрос:

Это, к сожалению, не работает с перенаправлением:

<h:commandLink value="Go to hello page" action="/pages/hello.xhtml?faces-redirect=true" > 
    <f:param name="name" value="Hubert" /> 
</h:commandLink> 

Может кто-нибудь объяснить мне, почему, пожалуйста?

+1

Вы пытались добавить в свой параметр действия '& includeViewParams = true'? – LaurentG

+0

@LaurentG, спасибо за подсказку. Это помогло мне решить мою проблему. – Hubert

ответ

2

Чтобы ответить на этот вопрос, нам нужно знать, как работает перенаправление.

Перенаправление

запрос клиента 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&amp;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("&amp;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 
... 

Вот что нам нужно.

Смежные вопросы