繁体   English   中英

f:viewParam与POST请求并重定向

[英]f:viewParam with POST request and redirect

Mojarra 2.1.26

我有一个非常简单的页面:

的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 在此页面上,我有一个commandLink触发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>

有人可以解释一下为什么吗?

要回答这个问题,我们需要知道重定向的工作原理。

重定向

收到客户端HTTP请求。 创建对此请求的响应。 它总是看起来一样。 返回代码302,并设置标头Location 例如:

HTTP/1.1 302 Moved Temporarily
Server: Apache-Coyote/1.1
Location: http://stackoverflow.com
...

客户收到此响应后,它将发出另一个请求。 这次从Location标头向URI发出GET请求。

问题示例说明

h:commandLink触发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的建议)

可以使用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:

如果参数值来自控制器,则可以使用h:commandButton从页面中删除元素f:viewParam 可以在动作方法内完成技巧:

 <h:form>
        <h:commandLink value="Go to hello page" action="#{controller.action}" />
 </h:form>

和action():

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

那就是我们所需要的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM