如果最终是持有状态的 HttpSession,为什么还要使用会话 bean
Why use session bean at all if ultimately its the HttpSession that holds the state
我是 EJB 的新手,所以请不要介意问题中的任何愚蠢内容。
我有疑问,希望有人能解决。
我有以下有状态 Bean:
@Stateful
public class SessionBean implements SessionBeanRemote {
private int count = 0;
@Override
public int getCount(){
count++;
return count;
}
}
这是调用 Bean (Servlet) 的客户端
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
InitialContext ctx;
HttpSession session = null;
SessionBeanRemote obj;
try {
if (session.getAttribute("myBean") == null) {
ctx = new InitialContext();
obj = (SessionBeanRemote) ctx.lookup("SessionBean/remote");
session.setAttribute("myBean", obj);
} else {
obj = (SessionBeanRemote) session.getAttribute("myBean");
}
System.out.println(obj.getCount());
} catch (NamingException ex) {
Logger.getLogger(TestServlet.class.getName()).log(Level.SEVERE, null, ex);
}
}
现在我想知道是否最终是 HttpSession 必须保存会话 bean 那么为什么要使用 EJB,为什么不直接将我们想要的任何内容存储在会话中而不是先将其存储在会话 bean 中然后然后将该 bean 存储在会话中。
而且我想知道是否可以说我将我的 @Stateful 注释更改为 @Stateless 然后在客户端执行相同的代码并将 bean 存储在会话中然后我也可以从会话中提取相同的 bean那么无状态和有状态之间有什么区别,我知道当完成新查找时,有可能将相同的无状态 bean 返回给我,而与有状态 bean 一样,当我们进行查找时它总是新的。但就是这样吗?
P.S。正如我前面提到的,我是EJB的新手,所有的疑惑都是基于我从网上的一些教程和一些关于SO的问题中了解到的。我也在本地尝试 运行,但不幸的是,由于以下错误 "Exception while loading the app : EJB Container initialization error",我无法在 GlassFish 上部署该应用程序。我正在尝试调查它。
它们是两个不相关的概念。
如果你分开关注,你应该。然后 HTTP 会话和 EJB 会话在逻辑上不同的层上运行。 http 会话用于保存单个 Web 浏览器和用户状态。 EJB 会话用于在企业应用程序客户端的上下文中保存事务性、可伸缩性和容错性以及 "transparently"(可能还有远程)引用。
您正在使用 EJB 来提供 Web 内容这一事实并不意味着您不能也使用这些相同的 EJB 来为 JFC/Swing(或 JavaFX)客户端提供服务。
EJB 会话
EJB 中的会话是通过服务器的 JVM 使用 SessionBean 维护的。您设计的 bean 可以包含业务逻辑或计算或动态页面,并且可以由客户端使用。您有两个不同的会话 bean:有状态的和无状态的。
Stateful: 以某种方式与单个客户端(每个 bean 的对象)连接。它维护该客户端的状态,只能由该客户端使用,当客户端 "dies" 时,会话 bean 为 "lost"。 Stateful bean 的生命周期与客户端绑定。 (在基于角色的情况下非常有用applications/systems)
无状态: 无状态会话 Bean 不维护任何状态,并且不能保证同一个客户端将使用同一个无状态 bean,即使在其他。无状态会话 EJB 的生命周期与有状态会话 EJB 的生命周期略有不同。 EJB 容器是否有责任准确了解如何跟踪每个会话并将请求从客户端重定向到会话 Bean 的正确实例以及每个会话的相同作业。
其中:
HTTPSession: 通过request对象获取。您不能真正实例化一个新的 HttpSession 对象,它不包含任何业务逻辑或计算,但更多的是存储对象的地方(对于客户端作为输出或服务器作为输入),以及用于两个或多个系统的通信通过网络。
我会尽量给你一个简单的答案。
是的,您必须在某处存储对 SFSB 的引用,以防在 http 会话中使用 Web 应用程序,但正如 Elliott 所写,您也可能有不同的客户端类型。
会话 bean 与 POJO 的一些优势:
- 容器事务管理
- 容器安全实施
- 可能通过远程接口进行远程访问
- 允许作为单独的模块 (EJB) 进行部署,以提高可重用性。
如果您的会话 bean 依赖于状态,那么将状态保存在 bean 中比在每个方法调用中传递所有状态信息更合乎逻辑。
您的示例非常简单,您没有使用事务、持久性、安全性,因此根本没有使用 SFSB 甚至 EJB 的意义。
SFSB 被认为是相当重量级的,通常应该避免使用,我想说大多数 Web 应用程序不使用它们(实际上取决于应用程序要求)。所以你应该将你的服务设计成无状态的,并且宁愿使用无状态的 bean 而不是有状态的,这样你就会有更好的性能和更容易的可重用性。
因此,如果您打算使用我提供的某些功能,您可能会受益于 EJB,否则您可能只对 POJO 中的 Http 会话和业务逻辑感到满意。
我是 EJB 的新手,所以请不要介意问题中的任何愚蠢内容。
我有疑问,希望有人能解决。
我有以下有状态 Bean:
@Stateful
public class SessionBean implements SessionBeanRemote {
private int count = 0;
@Override
public int getCount(){
count++;
return count;
}
}
这是调用 Bean (Servlet) 的客户端
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
InitialContext ctx;
HttpSession session = null;
SessionBeanRemote obj;
try {
if (session.getAttribute("myBean") == null) {
ctx = new InitialContext();
obj = (SessionBeanRemote) ctx.lookup("SessionBean/remote");
session.setAttribute("myBean", obj);
} else {
obj = (SessionBeanRemote) session.getAttribute("myBean");
}
System.out.println(obj.getCount());
} catch (NamingException ex) {
Logger.getLogger(TestServlet.class.getName()).log(Level.SEVERE, null, ex);
}
}
现在我想知道是否最终是 HttpSession 必须保存会话 bean 那么为什么要使用 EJB,为什么不直接将我们想要的任何内容存储在会话中而不是先将其存储在会话 bean 中然后然后将该 bean 存储在会话中。
而且我想知道是否可以说我将我的 @Stateful 注释更改为 @Stateless 然后在客户端执行相同的代码并将 bean 存储在会话中然后我也可以从会话中提取相同的 bean那么无状态和有状态之间有什么区别,我知道当完成新查找时,有可能将相同的无状态 bean 返回给我,而与有状态 bean 一样,当我们进行查找时它总是新的。但就是这样吗?
P.S。正如我前面提到的,我是EJB的新手,所有的疑惑都是基于我从网上的一些教程和一些关于SO的问题中了解到的。我也在本地尝试 运行,但不幸的是,由于以下错误 "Exception while loading the app : EJB Container initialization error",我无法在 GlassFish 上部署该应用程序。我正在尝试调查它。
它们是两个不相关的概念。
如果你分开关注,你应该。然后 HTTP 会话和 EJB 会话在逻辑上不同的层上运行。 http 会话用于保存单个 Web 浏览器和用户状态。 EJB 会话用于在企业应用程序客户端的上下文中保存事务性、可伸缩性和容错性以及 "transparently"(可能还有远程)引用。
您正在使用 EJB 来提供 Web 内容这一事实并不意味着您不能也使用这些相同的 EJB 来为 JFC/Swing(或 JavaFX)客户端提供服务。
EJB 会话
EJB 中的会话是通过服务器的 JVM 使用 SessionBean 维护的。您设计的 bean 可以包含业务逻辑或计算或动态页面,并且可以由客户端使用。您有两个不同的会话 bean:有状态的和无状态的。
Stateful: 以某种方式与单个客户端(每个 bean 的对象)连接。它维护该客户端的状态,只能由该客户端使用,当客户端 "dies" 时,会话 bean 为 "lost"。 Stateful bean 的生命周期与客户端绑定。 (在基于角色的情况下非常有用applications/systems)
无状态: 无状态会话 Bean 不维护任何状态,并且不能保证同一个客户端将使用同一个无状态 bean,即使在其他。无状态会话 EJB 的生命周期与有状态会话 EJB 的生命周期略有不同。 EJB 容器是否有责任准确了解如何跟踪每个会话并将请求从客户端重定向到会话 Bean 的正确实例以及每个会话的相同作业。
其中:
HTTPSession: 通过request对象获取。您不能真正实例化一个新的 HttpSession 对象,它不包含任何业务逻辑或计算,但更多的是存储对象的地方(对于客户端作为输出或服务器作为输入),以及用于两个或多个系统的通信通过网络。
我会尽量给你一个简单的答案。
是的,您必须在某处存储对 SFSB 的引用,以防在 http 会话中使用 Web 应用程序,但正如 Elliott 所写,您也可能有不同的客户端类型。
会话 bean 与 POJO 的一些优势:
- 容器事务管理
- 容器安全实施
- 可能通过远程接口进行远程访问
- 允许作为单独的模块 (EJB) 进行部署,以提高可重用性。
如果您的会话 bean 依赖于状态,那么将状态保存在 bean 中比在每个方法调用中传递所有状态信息更合乎逻辑。
您的示例非常简单,您没有使用事务、持久性、安全性,因此根本没有使用 SFSB 甚至 EJB 的意义。
SFSB 被认为是相当重量级的,通常应该避免使用,我想说大多数 Web 应用程序不使用它们(实际上取决于应用程序要求)。所以你应该将你的服务设计成无状态的,并且宁愿使用无状态的 bean 而不是有状态的,这样你就会有更好的性能和更容易的可重用性。
因此,如果您打算使用我提供的某些功能,您可能会受益于 EJB,否则您可能只对 POJO 中的 Http 会话和业务逻辑感到满意。