当前位置: 首页 > 知识库问答 >
问题:

理解CDI会话作用域Bean

燕鸿波
2023-03-14

MyCart.java

这个MyCart Bean是每个HTTP会话实例化的名为CDI的Bean。

package cdv.project.bean;
import cdv.project.api.*;
 
@Named("cart")
@SessionScoped
public class MyCart extends MyCartAbstract {
       private String value;
 @Override
 public String getValue() {
        System.out.println("Getting Value Value to : "+ this.value);
        return "FromBeanClass: "+this.value;
  }
 
 @Override
 public void setValue(String a) {
     System.out.println("Setting Value to : "+ a);
        this.value = a;
         System.out.println("Setting Value to ddd: "+ this.value);
  }
}

抽象类

package cdv.project.api;
public abstract class MyCartAbstract {
public abstract String getValue();
public abstract void setValue(String a);
} 

问题描述

仅用于理解会话范围的CDI。我有两个JSP文件,如下所示

SetCDIBeanValue.jsp其中,我将获得命名会话CDI Bean(MyCart)的实例将It String属性的值设置为String值FROM_FIRST_JSP

因为这个会话的作用域是有限的,所以我想应该只有一个会话被实例化。

GetCDIBeanValue。在jsp中,我将检索从第一个jsp设置的Bean属性值,并在段落中显示它。但是,我将使用不同的名称获取Bean实例(有关更多信息,请参阅下文)

getFromSecondJsp。getValue()始终返回NULL

SetCDIBeanValue.jsp

<%@ page import="cdv.project.api.*" %>
<%@taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@taglib prefix="h" uri="http://java.sun.com/jsf/html"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 
<%
MyCartAbstract SetFromFirstJsp = (MyCartAbstract) UIBeanLocator.getBeanByName("cart");
# Getting the Session Instantiated Bean by its Name
SetFromFirstJsp.setValue("FROM_FIRST_JSP");
%>

GetCDIBeanValue.jsp

<%@ page import="cdv.project.api.*" %>
<%@taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@taglib prefix="h" uri="http://java.sun.com/jsf/html"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 <%@include file="SetCDIBeanValue.jsp"%>
<%
MyCartAbstract getFromSecondJsp = (MyCartAbstract) UIBeanLocator.getBeanByName("cart");
%>
<html>
    <head></head>
    <body>
<p><%out.print("Get Bean Property Value From FirstJSP : " + SetFromFirstJsp.getValue());%></p>
<p><%out.print("Get Bean Property Value From SecondJSP: " + getFromSecondJsp.getValue());%></p>
    </body>
</html>

现在在Glassfish服务器中部署该项目,并浏览GetCDIBeanValue。jsp

并且它总是在浏览器中显示以下内容

从FirstJSP获取Bean属性值:FromBeanClass:FROM_FIRST_JSP

从SecondJSP:FromBeanClass:null获取Bean属性值

获取BeanInstance的代码

public static Object getBeanByName(String name) {
        BeanManager bm = getBeanManager();
        Set<Bean<?>> beans  = bm.getBeans(name);
        Bean bean = beans.iterator().next();
        CreationalContext ctx = bm.createCreationalContext(bean);
        Object o = bm.getReference(bean, bean.getBeanClass(), ctx);
        return o;
    }

问题是我没有从两个JSP获得相同的MyCart Bean类实例。表示对象SetFromFirstJsp getFromSecondJsp

它不是访问同一个Bean实例,还是每个JSP实例化MyCart CDIBean类的不同实例?我知道,有一些错误,我没有很好地理解这个概念。但是有没有可能有人让我知道我在哪里犯了错误。谢谢

同样的作品完美,如果改变以下从

    @Named("cart")
    @SessionScoped
    public class MyCart extends MyCartAbstract {

    @Named("cart")
    @ApplicationScoped
    public class MyCart extends MyCartAbstract {

共有1个答案

葛炯
2023-03-14

我的坏,我错了,发现我使用JSF托管Bean导入而不是CDI Bean的问题...将导入更改为CDI Bean后,它按预期工作.........意味着我的注释导入出错了,我正在加载JSF而不是CDI。

 类似资料:
  • 恐怕这个问题会有点模糊,但这是... 我们注意到我们的JEE7 web应用程序中存在一些非常奇怪的、偶然的行为。有时,用户页面会突然开始显示来自完全不同用户会话的数据!到目前为止,我还没有能够复制这种现象,也没有在日志中找到任何问题的迹象,但是似乎一个用户的页面开始显示存储在@SessionScoped CDIBean中的数据,该CDIBean应该属于另一个用户的会话。 这种行为对任何人都有影响吗

  • 我有一个CDI bean,定义如下: 现在,我想以编程方式将其从会话范围中删除: 但是变量始终为空。如何检索实例并销毁它?

  • 我有一个关于会话范围的CDIBeans的生命周期的问题 据我所知,会话范围的CDIBean在会话启动时由容器构造,在会话结束时由容器销毁。在销毁bean之前,将调用@PreDestroy方法,如下所述https://docs.oracle.com/javaee/6/tutorial/doc/gmgkd.html.它还说用这种方法释放资源 在JSF应用程序中,我构建时遇到内存泄漏,因为bean似乎没

  • 我正在学习j2ee,如果问题看起来很基本请原谅。 在httpsession中,会话ID存储在客户端,与之相关的数据存储在服务器端。 现在,当我在POJO上使用CDI@SessionScoped时,这是否意味着EJB容器(?)在会话中存储pojo。(Session.SetAttribute(POJO)) CDI可以区分SFB、SLB和POJO吗?

  • 问题内容: 我将JSF 2用于视图,将Spring用于业务逻辑。我正在尝试使用注解(@Scope(“ session”))将会话范围设置为我的一个Spring bean,但是却遇到了这个异常: 我知道RequestContextListener。在我的web.xml中。我还添加了RequestContextFilter: 似乎没有任何作用。我究竟做错了什么?谢谢! 问题答案: 尝试使用aop:sc

  • 我正在尝试在我的应用程序中实现注销,因此我做了以下操作: 但是当我检查用户是否登录时,它说是: 我错过什么了吗?在使会话无效后,我是否应该获得一个新的AuthorizedUser实例(sessionScoped)? 编辑:如果有人需要,添加getHandler;)