2014-01-07 66 views
0

钻嘴鱼科2.1.26F: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。在这个页面上,我有一个触发POST请求的commandLink:

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

This works。我可以看到声明:你好Hubert!

问:

这遗憾的是不与重定向工作:

<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地址头。

问题示例说明

H: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 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:页hello.xhtml上viewParam元素,这个页面重定向到页hello.xhtml

解决方案2:从页面ħviewParam:的commandButton

如果参数值是从控制器那么我们就可以除去元件F。技巧可以操作方法中完成:

<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 
... 

这正是我们需要的。