我有一个视图范围的 JSF托管bean,支持xhtml视图,我使用f:viewParam从URL读取一个参数.
该视图向用户呈现表单.但是,当用户通过按p:commandButton提交表单时,似乎重新创建了视图范围的bean(我添加了@PostConstruct注释来验证这一点),因此不记得从f:viewParam读取的实例变量(见下面的代码).
我最初使用GET导航到视图,其中包含URL参数,但是当用户按下p时发送的POST消息:commandButton不包含URL参数.所以我认为当JSF运行时没有在POST上看到URL参数时,它认为这是一个不同的视图,并且正在重新创建JSF管理的bean.当我将视图范围更改为session-scoped时,代码可以正常工作.
这是代码:
<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>
Run Code Online (Sandbox Code Playgroud)
@ManagedBean
@ViewScoped
public class RegisterBean implements Serializable {
@ManagedProperty(value="#{invId}")
private String invId;
...
Run Code Online (Sandbox Code Playgroud)
事实证明,这与URL参数根本没有关系.在下面的BalusC建议之后,我删除了c:when我的视图使用的标签(依赖于渲染的属性而不是相同的效果),现在不再重新创建视图范围的bean并正确保留invId字段.
这个问题是不是在迄今为止发布的代码可见,但它是JSF 2.0/2.1的已知问题,一个视图作用域时,它的一个属性被绑定到像JSTL一个taghandler的属性bean将被重新创建<c:if>或Facelets的<ui:include>或查看JSF组件的构建时间属性,例如id和binding,同时启用部分状态保存(默认情况下).
背景说明是在构建和恢复视图期间执行这些属性中的任何EL表达式.由于视图范围bean存储在视图中,因此仅在恢复视图后可用,因此这样的EL表达式评估将导致创建全新且独立的视图范围bean.这基本上是鸡蛋问题.它已在即将推出的JSF 2.2中得到修复.
基本上有3种解决方案:
<c:if>/ <c:choose>通过rendered.| 归档时间: |
|
| 查看次数: |
2554 次 |
| 最近记录: |