【问题标题】:How does the POST REDIRECT GET works in JSF on commandButtonPOST REDIRECT GET 如何在 JSF on commandButton 上工作
【发布时间】: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&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 重定向中的属性。

【问题讨论】:

  • 不相关,但您可能想要 h:bodyh:head 而不是 HTML 等价物(这让 JSF 很高兴并且能够包含很多它的 JS 代码)。

标签: java jsf jsf-2


【解决方案1】:

您似乎缺少的是includeViewParams 所做的。让我引用this 内容丰富的文章(你应该阅读所有内容):

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

所以 JSF 会查看您的 resultpage.xhtml 以确定要传递哪些参数。然后尽职尽责地继续传递postRedirectResult#number 的当前值(此时为 unset/0)。

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

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

另见:

【讨论】:

  • &lt;f:param name="number" value="4" /&gt; 不会将值作为 GET 传递给 resultPage,因为它将在当前页面上发布,然后重定向到 resultPage 。
  • 你是对的,使用 f:param 无法在重定向中存活。我的错。我测试了一个小样本并编辑了我的答案,以包含一种在 PRG 下工作的方法。请注意,这将生成一个 static 参数:您不能传递用户在同一页面上输入的值。获取值并将其存储为 bean(以便可以通过目标页面上的f:viewParam 转发)。
【解决方案2】:

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

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

这里你可以试试f:setPropertyActionListener as..

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

这是this的链接。

【讨论】:

  • 您的答案将解决问题,因为您在 postRedirectResult bean 中设置属性,但它也会在第 1 页加载我的 bean。我可以以某种方式使用 GET 进行重定向并在第二页上设置属性吗?
  • 所以你可以做的是...... 1)将你的参数与 URL 传输到下一页 2)比在 之后的页面加载你可以调用一个方法 public void init() { // 做一些事情 } 并编写代码来获取 URL 并获取参数 HttpServletRequest request = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest(); String clipId = request.getParameter("id");您可以将其设置为您的本地变量并在下一页中使用该变量/...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多