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



我在测试JSF的几个新特性时遇到了Post Redirect Get。我想从第一页重定向到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重定向中的属性?

您似乎错过的是includeViewParams所做的。让我引用这篇内容丰富的文章(你应该通读):

另一个特殊的查询字符串参数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" />

参见:

  • 什么可以和& lt; f: viewAction>被用于?

将数据从JSF Page传输到Backing Bean有4种不同的方法。我们可以用

  1. f:param
  2. f:setPropertyActionListener
  3. f:attribute
  4. 方法表达式(JSF 2.0)。

在这里你可以尝试f:setPropertyActionListener作为…

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

相关内容

  • 没有找到相关文章

最新更新