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

使用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

TA贡献1834条经验 获得超8个赞

这个,


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
?
森栏

TA贡献1810条经验 获得超5个赞

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

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

TA贡献1865条经验 获得超7个赞

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

查看完整回答
反对 回复 2019-11-19
  • 3 回答
  • 0 关注
  • 559 浏览
慕课专栏
更多

添加回答

举报

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