我正在尝试将JSF页面之间的参数传递给另一个,从bean到另一个。我知道这是一个常见的问题,事实上我在写下来之前尝试了几种方法。 为此,我将两个bean放在会话范围中,并在第一个bean中添加以下内容:
<p:commandButton value="Submit" type="submit"
actionListener="#{sourceBean.save}" action="success">
<f:setPropertyActionListener
target="#{targetBean.foo}" value="#{sourceBean.foo}" />
</p:commandButton>
问题是我不希望这些bean在会话范围内但在视图范围内。 所以我试着把第一页放进去:
<p:commandButton value="Submit" type="submit"
actionListener="#{sourceBean.save}" action="success">
<f:param name="foo" value="#{sourceBean.foo}"/>
</p:commandButton>
在第二页:
<f:metadata>
<f:viewParam id="foo" name="foo" value="#{targetBean.foo}"
/>
</f:metadata>
问题是传递的String为null,显然,我从转换器中得到一个错误。
我想我在托管bean的配置中遗漏了一些东西。我是否必须以某种方式链接目标和源bean? 此刻我有这个配置:
<managed-bean>
<managed-bean-name>targetBean</managed-bean-name>
<managed-bean-class>guiBeans.TargetBean</managed-bean-class>
<managed-bean-scope>view</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>sourceBean</managed-bean-name>
<managed-bean-class>guiBeans.SourceBean</managed-bean-class>
<managed-bean-scope>view</managed-bean-scope>
</managed-bean>
另一个问题:在我的应用程序中,我在转换过程中使用的值foo.id是在我保存对象时由数据库自动设置的,所以当我调用时:
actionListener="#{sourceBean.save}"
转换器获取id并将其转换为String(反之亦然)。 所以,我想知道在JSF中是先调用actionListener还是设置参数的函数。
这可能是我获得null String的原因吗?非常感谢。
答案 0 :(得分:1)
在呈现表单期间评估<f:param>
,而不是在提交表单期间。您的问题表明#{sourceBean.foo}
值仅在提交表单时设置,因此在呈现表单时不可用。
您基本需要将action="success"
替换为action="#{bean.action}"
public String action() {
return "success?foo=" + foo.getId();
}
或者,如果您正在使用导航案例
<navigation-case>
<from-outcome>success</from-outcome>
<to-view-id>/some.xhtml</to-view-id>
<redirect>
<view-param>
<name>foo</name>
<value>#{sourceBean.foo.id}</value>
</view-param>
</redirect>
</navigation-case>
无关具体问题,<f:param>
doesn't完全支持converter
属性。您必须直接访问所需的属性(在上例中为id
)。