当前位置: 首页 > 面试题库 >

JSF 2.0:为什么即使仍在同一View上也要重新创建ViewScope Bean

谢旭
2023-03-14
问题内容

在我的.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_SAVINGfalse

也可以看看:

  • JSF 2.0中的通信-@ViewScoped在标记处理程序中失败


 类似资料:
  • 问题内容: 想象一下以下课程: 我想重新启动线程以防万一。这不起作用。因为线程只能启动一次。第一个问题。为什么是这样? 据我所知,我必须重新创建的每个实例并调用以再次启动线程。如果是s,这不是很实际。我必须读取旧值的当前值,创建一个新值,并使用旧值在新对象中设置参数。第二个问题:这可以用更聪明,更轻松的方式完成吗? 问题答案: 之所以以这种方式实现threading.Thread,是为了保持线程对

  • 我已经完成了一些Java教程,它们都说在调用类时创建一个新变量。这是为什么?我已经测试了一些代码,但它没有这样做。我已经使用python很长一段时间了,所以我习惯于使用动态语言。 请看下面我一直在玩的一些代码: 谢谢你的时间。

  • 问题内容: 由于从未声明@A,因此sql server应该抛出错误,但是不会。这是为什么? 谢谢 问题答案: SQL Server没有块级变量作用域。 每批/存储的过程等 从MSDN(我的粗体) 变量的范围是可以引用该变量的Transact-SQL语句的范围。变量的范围从声明的点一直持续到声明它的 批处理 或 存储过程 的末尾。

  • 标题本身就是我的问题,每当我打开MainActivity,然后导航到汉堡包/抽屉菜单中可用的另一个片段,然后按/刷回以返回它重新创建的主屏幕(第一个片段)。导航组件有没有办法使其不重新创建第一个片段?我正在使用Android Studio生成的Jetpack导航模板,这似乎是默认行为。 这是主要活动 这是主片段(主活动中的第一个片段),其中包含子片段Asset片段 这是父片段托管的ViewPage

  • 每一个国家的都有其特殊国情,主要是原因是中国的网络太慢,及中国存在大量老旧的计算机,它们预装着window XP,IE浏览器最高只能升级到IE8, 出于这两方面的原因,我们需要一个体积更少,兼容性更好的React。并且之前facebook也闹过LICENSE问题,更是促进中国互联网公司决定自主研发框架,努力摆脱对外国框架的依赖。 对于我们公司而言,一个旅游公司, 在线上订火车票,飞机票, 景点门票

  • 问题内容: 这是我非常简单的表格(Postgres): 如果我尝试使用FROM数据库下面的命令插入String,那么一切都会按预期工作,不足为奇的是,数据库中会出现一个新行。 但是,如果我想通过JDBC插入字符串,则不会插入任何内容,尽管prepareStatement.executeUpdate()始终返回1。 下面是我的方法应该起作用,但是没有起作用。请告诉我是否缺少明显的东西。我想补充一点,