我正在测试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&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重定向中设置属性。
答案 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&number=4" />
另见:
答案 1 :(得分:1)
有四种方法可以将数据从JSF页面传输到Backing Bean。 我们可以使用
f:param
f:setPropertyActionListener
f:attribute
您可以尝试f:setPropertyActionListener
作为..
<h:commandButton value="redirect to result"
action="resultPage?faces-redirect=true">
<f:setPropertyActionListener target="#{postRedirectResult.number}" value=4 />
</h:commandButton>
以下是this的链接。