簡體   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