题
从一个行动在我的豆,我试图重定向到另一个网页期待一个图参数。有什么推荐的方式来做到这一JSF2?
E.g., 说我源网页是:http://localhost/page1.xhtml
它有一个命令按钮,呼吁行动:
<h:commandButton value="submit" action="#{myBean.submit}" />
在那里我的豆看起来像:
@ManagedBean
@RequestScoped
public class MyBean {
private int id;
public String submit() {
//Does stuff
id = setID();
return "success";
}
现在,我想的"提交"行动的返回导航 http://localhost/page2.xhtml?id=2
我已经试图这样做与一种看-param在我的导航情况,但奇怪的结果。脸-config段如下:
<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.
所以我在寻找一个更好的方式来做到这一点,或一个原因/解为什么看-param不是被要求从我的豆每次。
解决方案
有关JSF传递参数直观的事情是,你不决定发送什么(在动作),而是希望接收(在目标页面)的东西。
在做到这一点与重定向端部,目标页面元数据被加载和所有必需的参数被读出,附加到URL作为PARAMS的动作。
请注意,这是完全一样的机制与任何其他JSF绑定:你不能从一个地方阅读的inputText的值,并将它写在其他地方。在viewParam定义的值表达既用于(前的重定向)读取和(后重定向)写入。
通过您的豆你只是做:
@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>
这将不正是你想要的。
其他提示
如果没有更好的解决办法,我发现工作是简单地建立我的查询字符串中的豆回报:
public String submit() {
// Do something
return "/page2.xhtml?faces-redirect=true&id=" + id;
}
这不是最灵活的解决方案,但似乎工作,我怎么想。
同样使用这种方法来清理构建查询串的处理: http://www.warski.org/blog/?p=185
查看这些:
- 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>
从判断 这页, ,这样可能比较容易:
<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>
您可以使用Primefaces这个样子做:
<p:button
outcome="/page2.xhtml?faces-redirect=true&id=#{myBean.id}">
</p:button>
只需添加看出属性重定向代码如下:
<redirect include-view-params="true">
<view-param>
<name>id</name>
<value>#{myBean.id}</value>
</view-param>
</redirect>
这里是几个导航例子。
不参考的溶液到一个Bean:
<h:button value="login"
outcome="content/configuration.xhtml?i=1" />
在我的项目,我需要这样的方法:
<h:commandButton value="login"
action="content/configuration.xhtml?faces-redirect=true&i=1" />