了解CDI Session Scoped Bean

时间:2015-04-08 14:26:32

标签: jsp java-ee cdi

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 Property的值设置为String值“FROM_FIRST_JSP”

由于这个会话作用域,我猜应该只有一个会话实例化。

GetCDIBeanValue.jsp 其中,我将检索从First JSP设置的Bean属性值,并在Paragraph中显示它。 但是我会使用不同的名称获取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 {

1 个答案:

答案 0 :(得分:1)

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