【发布时间】:2014-05-29 15:16:34
【问题描述】:
我在测试 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 重定向中的属性。
【问题讨论】:
-
不相关,但您可能想要
h:body和h:head而不是 HTML 等价物(这让 JSF 很高兴并且能够包含很多它的 JS 代码)。