【问题标题】:Understanding CDI Session Scoped Bean了解 CDI 会话作用域 Bean
【发布时间】:2015-06-13 13:55:55
【问题描述】:

MyCart.java

这个 MyCart Bean 是 CDI 命名的 bean,每个 HTTP 会话都实例化。

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);
} 

问题描述

仅用于了解 Session Scoped CDI。 我有两个 JSP 文件如下

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

由于这个 Session 范围是我猜应该只有一个 Session 实例化。

GetCDIBeanValue.jsp 其中,我将检索从 First 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 获取 Bean 属性值:FromBeanClass: null

获取 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 CDI Bean 类实例。 ? 我知道,有一些错误,我还没有很好地理解这个概念。 但是有没有可能有人让我知道我在哪里犯了错误。 谢谢。


注意

如果更改以下内容,同样可以完美运行

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

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

【问题讨论】:

    标签: jsp jakarta-ee cdi


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2011-01-06
      • 1970-01-01
      • 1970-01-01
      • 2012-01-20
      • 2015-11-03
      • 2014-07-17
      • 2016-07-10
      • 1970-01-01
      • 2012-05-11
      相关资源
      最近更新 更多