从 JSF2 中的操作导航时如何传递视图参数?

Posted

技术标签:

【中文标题】从 JSF2 中的操作导航时如何传递视图参数?【英文标题】:How do you pass view parameters when navigating from an action in JSF2? 【发布时间】:2011-04-06 00:52:02 【问题描述】:

从我的 bean 中的一个动作,我试图重定向到另一个需要视图参数的页面。在 JSF2 中推荐的方法是什么?

例如,假设我的源页面是: http://localhost/page1.xhtml

它有一个调用动作的命令按钮:

<h:commandButton value="submit" action="#myBean.submit" />

我的 bean 的样子:

@ManagedBean
@RequestScoped
public class MyBean 

private int id;

public String submit() 
    //Does stuff
    id = setID();
    return "success";

现在,我希望“提交”操作返回导航到 http://localhost/page2.xhtml?id=2

我尝试在导航案例中使用视图参数来执行此操作,但结果很奇怪。 faces-config sn-p 如下所示:

<navigation-rule>
    <from-view-id>/page1.xhtml</from-view-id>
    <navigation-case>
        <from-outcome>success</from-outcome>
        <to-view-id>/page2.xhtml</to-view-id>
        <redirect>
            <view-param>
                <name>id</name>
                <value>#myBean.id</value>
            </view-param>
        </redirect>
    </navigation-case>
</navigation-rule>

奇怪的行为是,即使 myBean 设置为请求范围,它也只会在我第一次加载我的应用程序时调用 myBean.getId(),并为所有后续调用重用相同的值,从而为 page2 生成不正确的视图参数。

所以我正在寻找一种更好的方法来做到这一点,或者为什么每次都没有从我的 bean 请求视图参数的原因/解决方案。

【问题讨论】:

【参考方案1】:

在 JSF 中传递参数的不直观之处在于您不决定发送什么(在操作中),而是决定您希望接收什么(在目标页面中)。

当您执行以重定向结束的操作时,将加载目标页面元数据并读取所有必需的参数并将其作为参数附加到 url。

请注意,这与任何其他 JSF 绑定的机制完全相同:您不能从一个地方读取 inputText 的值并将其写入其他地方。 viewParam 中定义的值表达式用于读取(重定向之前)和写入(重定向之后)。

用你的 bean 你就可以:

@ManagedBean
@RequestScoped
public class MyBean 

private int id;

public String submit() 
    //Does stuff
    id = setID();
    return "success?faces-redirect=true&includeViewParams=true";


// setter and getter for id

如果接收方有:

    <f:metadata>
        <f:viewParam name="id" value="#myBean.id" />
    </f:metadata>

它会做你想做的事。

【讨论】:

用它做了一个小测试,我认为它可以按照我的意愿工作。谢谢!虽然大概,你的意思是 "success?faces-redirect=true&includeViewParams=true";和 是的,对不起。我从一个工作项目中粘贴了两段代码以避免拼写错误,这里是:第一个来自 xml 模板(其中 & 符号必须被转义)并且不完整,另一个有不同的变量名。我马上修改。 @fdreger 当您使用 h:commandButton 时,您会将元数据放在哪里? @Kevin:正如答案:元数据始终在目标页面中。您在源页面(h:commandButton 所在的位置)上使用什么并不重要。 @BillR: 1) 这是一个错字,抱歉 2) 没有“发送 bean”或“接收 bean” - 有一个 viewParam 既绑定到表达式又能够接收来自查询参数的数据。它的工作原理几乎与普通的 inputText 完全一样。如果您想创建查询参数(更改 viewParam 的值),只需将一些 【参考方案2】:

如果没有更好的解决方案,我发现工作只是在 bean 返回中构建我的查询字符串:

public String submit() 
    // Do something
    return "/page2.xhtml?faces-redirect=true&id=" + id;

不是最灵活的解决方案,但似乎可以按我的意愿工作。

同样使用这种方法来清理构建查询字符串的过程: http://www.warski.org/blog/?p=185

【讨论】:

你还在使用 faces-config 这样做吗?【参考方案3】:

看看这些:

http://andyschwartz.wordpress.com/2009/07/31/whats-new-in-jsf-2/#get http://mkblog.exadel.com/2010/07/learning-jsf2-page-params-and-page-actions/

你会需要类似的东西:

<h:link outcome="success">
  <f:param name="foo" value="bar"/>
</h:link>

...和...

<f:metadata>
  <f:viewParam name="foo" value="#bean.foo"/>
</f:metadata>

从this page来看,这样的事情可能更容易:

 <managed-bean>
   <managed-bean-name>blog</managed-bean-name>
   <managed-bean-class>com.acme.Blog</managed-bean-class>
   <managed-property>
      <property-name>entryId</property-name>
      <value>#param['id']</value>
   </managed-property>
 </managed-bean>

【讨论】:

这个问题是我不会直接进入下一页。我的问题与从 bean 动作导航有关。第 1 页调用 bean 动作,bean 动作做事,返回“成功”,现在我想导航成功,但添加一个带有重定向的视图参数。 对不起,我误解了你的帖子。我认为java.dzone.com/articles/bookmarkability-jsf-2 可能会得到你想要的。这个例子正是你正在寻找的,我认为:http://domain/blog/entry.jsf?id=9 感谢您的回复,但我不确定我的问题是否仍然被正确理解。我不清楚您在那篇文章中指的是哪个示例,因为它没有讨论从动作导航。文章中最接近的是将视图参数传递到下一页,但我想要的不是将相同的视图参数从一个页面传递到另一个页面,而是我想将一个新的视图参数传递到页面中从动作导航。让我试着改写我原来的问题,看看我能不能说得更清楚。 嗯...你想插入一个 new 视图参数吗?那么与whatever.jsf?id=2 有什么不同吗?这需要一些有趣的 JSF 工作。【参考方案4】:

您可以像这样使用 Primefaces 来做到这一点:

<p:button 
      outcome="/page2.xhtml?faces-redirect=true&amp;id=#myBean.id">
</p:button>

【讨论】:

【参考方案5】:

只需将 seen 属性添加到重定向标签,如下所示:

<redirect include-view-params="true">
    <view-param>
        <name>id</name>
        <value>#myBean.id</value>
    </view-param>
</redirect>

【讨论】:

【参考方案6】:

不参考 Bean 的解决方案:

<h:button value="login" 
        outcome="content/configuration.xhtml?i=1" />

在我的项目中,我需要这种方法:

<h:commandButton value="login" 
        action="content/configuration.xhtml?faces-redirect=true&amp;i=1"  />

【讨论】:

在这里使用命令按钮的错误选择。使用普通按钮:***.com/questions/13070537/…(PrimeFaces p:button 也是如此)

以上是关于从 JSF2 中的操作导航时如何传递视图参数?的主要内容,如果未能解决你的问题,请参考以下文章

加速器合金传递参数

Obj-C:从导航控制器中的 detailViewController 传回参数

如何使用 AJAX 将数据从视图传递到控制器

将模型和额外参数从视图传递到 MVC 中的操作

如何将参数从我的表单操作传递到视图?姜戈

如何将复杂的键值参数表单视图传递给mvc中的控制器?