JSF 2.0:为什么即使仍在同一View上也要重新创建ViewScope Bean
在我的.xhtml页面中,我具有以下形式:
<ui:composition xmlns:ui="http://java.sun.com/jsf/facelets"
template="./../template/CustomerTemplate.xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.prime.com.tr/ui">
<ui:define name="formContent">
<h:form>
<p:dataGrid var="item" value="#{mrBean.items}" columns="3">
<p:column>
<p:panel header="#{item.name}">
<h:panelGrid columns="1" style="width:100%">
...
<h:commandButton value="Add To Cart" actionListener="#{cartBean.addItem(item.id)}" />
...
</h:panelGrid>
</p:panel>
</p:column>
</p:dataGrid>
</h:form>
</ui:define>
</ui:composition>
CustomerTemplate.xhtml是:
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.prime.com.tr/ui">
<h:head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
... // import css, js files
</h:head>
<h:body>
... // Other things on the page
<div class="grid_9 content">
<ui:insert name="contentTitle"></ui:insert>
<ui:insert name="formContent"></ui:insert>
</div>
...
</h:body>
</html>
这是我的ManagedBean:
@ManagedBean
@ViewScoped
public class MrBean {
...
private List<ItemState> items;
...
@PostConstruct
public void prepareItemList() {
...
Map<String,String> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
partnerID = Long.parseLong(params.get("partnerID"));
...
}
}
如您所见,我的MrBean是ViewScoped
ManagedBean。我希望@PostContruct函数只会在页面第1次呈现时被调用一次。但是,当我单击该Add To
Cart
按钮时,Long.parseLong(params.get("partnerID"))
即使我仍在同一视图上,我也遇到了该行中的null异常。
如果有人能给我有关如何解决此问题的建议,我将不胜感激。
更新: 我设法通过包装标签commandButton
内的功能使函数正常工作,ajax
如下所示:
...
<f:ajax listener="#{cartManagedBean.addItem(item.id)}">
<h:commandButton value="Add To Cart" />
</f:ajax>
....
-
这样做有很多可能的原因,所有这些最终归结为JSF问题1492中描述的鸡蛋问题。您正在使用
<h:someHtmlComponent binding="...">
绑定的UI组件到视图范围内管理bean的属性,或者你正在结合就像一个标签处理器的属性<c:if test="...">
,<ui:include src="...">
等等,以期范围内管理bean属性。计划在JSF
2.2中修复此问题。在此之前,您最好的选择是寻找替代方法或将context参数设置javax.faces.PARTIAL_STATE_SAVING
为false
。也可以看看:
-
Java Spring重新创建特定的Bean
2021-01-30 关注 0 浏览129 1答案
-
为什么在重新启动线程时需要重新创建实例?
2021-01-29 关注 0 浏览81 1答案
-
Django 1.7迁移不会重新创建删除的表,为什么?
2021-01-29 关注 0 浏览73 1答案
-
Android SQLite-为什么每次都要重新创建我的数据库?
2021-05-10 关注 0 浏览74 1答案
-
在每个请求中都会重新创建复合组件中的支持Bean
2021-01-30 关注 0 浏览68 1答案
-
拖放并重新创建一个表(在Heroku上)
2021-05-10 关注 0 浏览45 1答案
-
为什么NetBeans在部署时会重新创建“旧”软件包的文件夹?
2021-02-01 关注 0 浏览129 1答案
-
为什么我新创建的docker没有摘要?
2021-02-01 关注 0 浏览113 1答案
-
从 IEnumerable 重新创建字典>
2022-07-28 关注 0 浏览17 1答案
-
创建错的表格我可以删除重新创建。
2022-05-22 关注 0 浏览14 1答案