了解 CDI 会话作用域 Bean
Understanding CDI Session Scoped Bean
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);
}
}
摘要Class
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 value "FROM_FIRST_JSP"
由于这个 Session 作用域,所以我猜应该只有一个 Session Instantiated。
GetCDIBeanValue.jsp
其中,我将检索从 First JSP 设置的 Bean 属性 值,并将其显示在段落中。
但是我会使用不同的名称获取 Bean 实例(有关更多信息,请参见下文)
getFromSecondJsp.getValue() always return 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 Server 中部署项目,并浏览 GetCDIBeanValue.jsp
并且它总是在浏览器中显示以下内容
Get Bean Property Value From FirstJSP : FromBeanClass: FROM_FIRST_JSP
Get Bean Property Value From SecondJSP: 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 Class 实例?
指对象
SetFromFirstJsp
getFromSecondJsp
是否访问同一个Bean Instance,或者
每个 JSP 实例化不同的 MyCart CDI Bean 实例 Class。 ?
我知道,有一些错误,我还没有很好地理解这个概念。
但是有没有可能有人让我知道我在哪里犯了错误。
谢谢。
注意
如果从
更改以下内容,同样完美
@Named("cart")
@SessionScoped
public class MyCart extends MyCartAbstract {
至
@Named("cart")
@ApplicationScoped
public class MyCart extends MyCartAbstract {
糟糕,我错了,发现问题是我使用 JSF 托管 Bean 导入而不是 CDI Bean...将导入更改为 CDI Bean 后,它按预期工作......意味着我的注释导入很糟糕,我正在加载 JSF 而不是 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);
}
}
摘要Class
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 value "FROM_FIRST_JSP"
由于这个 Session 作用域,所以我猜应该只有一个 Session Instantiated。
GetCDIBeanValue.jsp 其中,我将检索从 First JSP 设置的 Bean 属性 值,并将其显示在段落中。 但是我会使用不同的名称获取 Bean 实例(有关更多信息,请参见下文)
getFromSecondJsp.getValue() always return 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 Server 中部署项目,并浏览 GetCDIBeanValue.jsp
并且它总是在浏览器中显示以下内容
Get Bean Property Value From FirstJSP : FromBeanClass: FROM_FIRST_JSP
Get Bean Property Value From SecondJSP: 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 Class 实例? 指对象 SetFromFirstJsp getFromSecondJsp
是否访问同一个Bean Instance,或者 每个 JSP 实例化不同的 MyCart CDI Bean 实例 Class。 ? 我知道,有一些错误,我还没有很好地理解这个概念。 但是有没有可能有人让我知道我在哪里犯了错误。 谢谢。
注意
如果从
更改以下内容,同样完美 @Named("cart")
@SessionScoped
public class MyCart extends MyCartAbstract {
至
@Named("cart")
@ApplicationScoped
public class MyCart extends MyCartAbstract {
糟糕,我错了,发现问题是我使用 JSF 托管 Bean 导入而不是 CDI Bean...将导入更改为 CDI Bean 后,它按预期工作......意味着我的注释导入很糟糕,我正在加载 JSF 而不是 CDI。