POST REDIRECT GET如何在commandButton上的JSF中工作

时间:2014-05-29 15:16:35

标签: java jsf jsf-2

我正在测试JSF的几个新功能,我遇到了Post Redirect Get。 我想从我的第一页重定向说first.xhtml到second.xhtml。

我在两个托管bean中都有一个数字作为属性,我想使用请求参数将它从第一个bean传递给第二个bean。

这是我的第一页

        <html xmlns="http://www.w3.org/1999/xhtml"
            xmlns:ui="http://java.sun.com/jsf/facelets"
            xmlns:h="http://java.sun.com/jsf/html"
            xmlns:f="http://java.sun.com/jsf/core">


        <head>
            <title>Landing Page</title>
        </head>

        <body>
        <h3>Enter Number</h3>
        <h:form>
            <h:inputText id="input" name="number" value="#{postRedirectGet.number}" />
            <h:commandButton value="redirect to result" 
    action="resultPage?faces-redirect=true&amp;includeViewParams=true">
            </h:commandButton>
        </h:form>
        </body>
        </html>

在第二页我有

  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core">
<f:metadata>
    <f:viewParam name="number" value="#{postRedirectResult.number}"/>
</f:metadata> 

<head>
    <title>Result Page</title>
</head>

<body>
<h:form>
    <h:outputText value="Number #{postRedirectGet.number}" />
    <h:outputText value="Number #{postRedirectResult.number}" />
    <h:commandButton value="Redirect to index" action="/index?faces-redirect=true" />
</h:form>
</body>
</html>

现在页面正在使用commandButton进行POST,然后从第一页重定向到第二页,但它在URL中传递number = 0。如果我改变

,它会起作用
<f:viewParam name="number" value="#{postRedirectResult.number}"/>

<f:viewParam name="number" value="#{postRedirectGet.number}"/>

但我认为viewParam用于将值设置为bean,而不是用于传递URL中的值。有人可以解释我们如何进行POST并在下一页设置托管bean的属性。

问题是f:viewParam在两种情况下以两种不同的方式使用。在h:link中,它用于设置目标bean的属性,在h:commandButton中,它用于计算GET URL,然后可以使用@ManagedProperty设置目标bean属性。我的理解是正确的还是可以f:viewParam用于在h:commandButton POST重定向中设置属性。

2 个答案:

答案 0 :(得分:2)

您似乎缺少的是includeViewParams所做的事情。让我引用this非常翔实的文章(你应该阅读所有文章):

  

另一个特殊查询字符串参数includeViewParams告诉导航处理程序在执行导航时包含视图参数。但是应该包含哪些视图参数?执行导航时要包括的视图参数在to-view-id页面上声明。

因此,JSF会查看您的resultpage.xhtml以确定要传递的参数。然后尽职地继续传递postRedirectResult#number的当前值(此时未设置/ 0)。

要在您的bean中反映GET number参数,请将其作为真实参数传递:

<h:commandButton value="redirect to result" 
        action="resultPage?faces-redirect=true&amp;number=4" />

另见:

答案 1 :(得分:1)

有四种方法可以将数据从JSF页面传输到Backing Bean。 我们可以使用

  1. f:param
  2. f:setPropertyActionListener
  3. f:attribute
  4. 方法表达式(JSF 2.0)。
  5. 您可以尝试f:setPropertyActionListener作为..

    <h:commandButton value="redirect to result" 
            action="resultPage?faces-redirect=true">
        <f:setPropertyActionListener target="#{postRedirectResult.number}" value=4 />
    </h:commandButton>
    

    以下是this的链接。