为了账号安全,请及时绑定邮箱和手机立即绑定

使用JSF 2.2时,在每个回发请求上都会重新创建@ViewScoped bean

/ 猿问

使用JSF 2.2时,在每个回发请求上都会重新创建@ViewScoped bean

慕的地8271018 2019-11-19 15:31:12

我遇到的问题与此帖子相似,并且来自@BalusC,提供3种解决方案,但:


我没有使用提到的EL表达式

我不想采用第二种解决方案(对于我来说,它足够复杂)

并将部分状态保存设置为false。

我的代码如下:


index.xhtml:


<?xml version="1.0" encoding="windows-1256" ?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"

      xmlns:h="http://java.sun.com/jsf/html"

      xmlns:p="http://primefaces.org/ui"

      xmlns:ui="http://java.sun.com/jsf/facelets"

      xmlns:f="http://java.sun.com/jsf/core">

    <h:head>

        <title>Insert title here</title>

    </h:head>

    <h:body>

        <h:form>

            <p:panelMenu id="westMenu">

                <p:submenu id="sub1" label="System Monitor">

                    <p:menuitem id="menu1" value="live monitoring" 

                            action="#{menusBean.activateMenu('sub1_menu1')}" 

                            update=":centerPane,westMenu" 

                            disabled="#{menusBean.active['sub1_menu1']}" />

                    <p:menuitem id="menu2" value="reports" 

                            action="#{menusBean.activateMenu('sub1_menu2')}"

                            update=":centerPane,westMenu" 

                            disabled="#{menusBean.active['sub1_menu2']}" />

                </p:submenu>

                <p:submenu id="sub2" label="Charging System Nodes" />

                <p:submenu id="sub3" label="Additional Nodes" />

            </p:panelMenu>

        </h:form>

        <h:panelGroup id="centerPane">

            ...

        </h:panelGroup>

    </h:body>

</html>

MenusBean.java:


package menus;


import java.io.Serializable;

import java.util.HashMap;

import java.util.Map;


import javax.faces.bean.ManagedBean;

import javax.faces.bean.SessionScoped;

import javax.faces.view.ViewScoped;


@ManagedBean

@ViewScoped

执行后,我得到:


MenusBean已创建

MenusBean已创建

MenusBean已创建

这是怎么引起的,我该如何解决?


查看完整描述

3 回答

?
MMMHUHU

这个,


import javax.faces.view.ViewScoped;

是JSF 2.2引入的特定于CDI的注释,旨在与特定于CDI的bean管理注释结合使用@Named。


但是,您正在使用特定于JSF的bean管理注释@ManagedBean。


import javax.faces.bean.ManagedBean;

然后,您应该使用同一javax.faces.bean包提供的任何作用域。右边@ViewScoped在那:


import javax.faces.bean.ManagedBean;

import javax.faces.bean.ViewScoped;


@ManagedBean

@ViewScoped

public class MenusBean implements Serializable{

如果使用错误的组合,则该Bean的行为类似于@RequestScopedBean,并在每次调用时重新创建。


或者,如果您的环境支持CDI(带有Weld的GlassFish / JBoss / TomEE,OpenWebBeans等),则也可以替换@ManagedBean为@Named:


import javax.inject.Named;

import javax.faces.view.ViewScoped;


@Named

@ViewScoped

public class MenusBean implements Serializable{

建议改用CDI。特定于JSF的Bean管理注释是在将来的JSF / Java EE版本中不推荐使用的注释,因为一切都在朝着CDI缓慢/统一发展。


查看完整回答
反对 回复 2019-11-19
?
森栏

无法在Mojarra 2.2.4上的Tomcat 7.0.47上重现它,并且不能以问题的当前形式发布该问题的确切代码。您是否熟悉基本HTTP以及有关传递请求参数,Cookie等的信息?在Chrome中按F12键,然后点击“ 网络”标签即可查看。它应该提供有关该问题的线索(例如,缺少会话cookie)

查看完整回答
反对 回复 2019-11-19
?
莫回无

老实说,我不知道CDI是什么,但是我没有包javax.inject,所以我想它是由JSF管理的(抱歉,这里的菜鸟不多)。是我的项目; 我清除了FF中的缓存,并尝试使用eclipse内置浏览器,它们都给出了相同的结果。

查看完整回答
反对 回复 2019-11-19

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信