我有一个视图范围的JSF 托管 bean,它支持一个xhtml视图,我使用f:viewParam从 URL 读取一个参数。
视图向用户呈现一个表单。但是,当用户通过按下p:commandButton提交表单时,似乎重新创建了视图范围的 bean(我添加了一个@PostConstruct注释来验证这一点),因此不记得从f:viewParam读取的实例变量(下面代码中的invId)。
我最初使用包含URL参数的GET导航到视图,但是当用户按下p:commandButton时发送的POST消息不包含URL参数。所以我在想,当 JSF 运行时在POST上看不到 URL 参数时,它认为这是一个不同的视图,并且正在重新创建 JSF 管理的 bean。当我将视图范围更改为会话范围时,代码有效。
这是代码:
看法
<f:metadata>
<f:viewParam name="invId" value="#{registerBean.invId}"/>
</f:metadata>
<h:form id="registrationForm">
....
<p:commandButton value="register" action="#{registerBean.register}"
icon="ui-icon ui-icon-newwin" ajax="false"/>
</h:form>
后备豆
@ManagedBean
@ViewScoped
public class RegisterBean implements Serializable {
@ManagedProperty(value="#{invId}")
private String invId;
...
更新
事实证明,这根本与 URL 参数无关。按照下面的BalusC建议,我删除了我的视图使用的c:when标记(依赖渲染属性而不是相同的效果),现在不再重新创建视图范围的 bean,并且正确保留了invId字段。