首页 > 代码库 > Ejb in action(四)——购物车实例演示有状态会话Bean
Ejb in action(四)——购物车实例演示有状态会话Bean
前面。我们介绍了一个入门实例。事实上那就是无状态回话Bean的经常使用情况。
上一篇文章中。我们介绍了无状态会话Bean和有状态会话Bean的相关概念。为了加深大家对它们的理解,我们一起来实现一个有状态会话Bean的样例——模拟购物车。
这个样例很经典:一个client购物的过程中。服务端会创建一个SessionBean保存着这一client的状态。client买的东西,都会在服务端进行存储。
也就是说。自始至终,一直存在一个有状态会话Bean对象。与该client进行交互。
以下来看详细实现:
1、准备环境
开发环境:Eclipse
jdk:1.6
jboss:Jboss5.0
2、服务端
接口:
package com.ejb.remote; import java.util.List; public interface IStatefulSessionBean { public void put(String bookName); public List<String> list(); }
实现:
package com.ejb.remote.impl; import java.util.ArrayList; import java.util.List; import javax.ejb.Remote; import javax.ejb.Stateful; import com.ejb.remote.IStatefulSessionBean; @Remote @Stateful public class StatefulSessionBeanImpl implements IStatefulSessionBean { private List<String> bookList; public StatefulSessionBeanImpl() { bookList = new ArrayList<String>(); } @Override public void put(String bookName) { bookList.add(bookName); } @Override public List<String> list() { return bookList; } }
3、client
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <%@page import="javax.naming.NamingException"%> <%@page import="javax.naming.InitialContext"%> <%@page import="java.util.Properties"%> <%@page import="com.ejb.remote.IStatefulSessionBean"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Insert title here</title> </head> <body> <% try { IStatefulSessionBean statefulBean = null; //假设是 if (session.getAttribute("statefulBean") == null) { //配置属性,他们是创建InitialContext的实例条件 Properties props = new Properties(); //JDNI工厂 props.setProperty("java.naming.factory.initial","org.jnp.interfaces.NamingContextFactory"); //JNDI查找包 props.setProperty("java.naming.factory.url.pkgs","org.jboss.naming"); //JNDI服务地址 props.setProperty("java.naming.provider.url","localhost:1099"); InitialContext ctx = new InitialContext(props); statefulBean = (IStatefulSessionBean) ctx.lookup("StatefulSessionBeanImpl/remote"); session.setAttribute("statefulBean", statefulBean); } else { statefulBean = (IStatefulSessionBean) session.getAttribute("statefulBean"); } String name = request.getParameter("name"); if (name != null) { name = new String(name.getBytes("ISO8859_1"), "utf-8"); statefulBean.put(name); } out.println("您已购买:"+statefulBean.list()); } catch (NamingException e) { e.printStackTrace(); } %> <table border="1"> <tr> <td>书名</td> <td>购买</td> </tr> <tr> <td>西游记</td> <td><a href="http://www.mamicode.com/sessionbean4.jsp?name=西游记">购买</a></td> </tr> <tr> <td>水浒传</td> <td><a href="http://www.mamicode.com/sessionbean4.jsp?name=水浒传">购买</a></td> </tr> <tr> <td>红楼梦</td> <td><a href="http://www.mamicode.com/sessionbean4.jsp?name=红楼梦">购买</a></td> </tr> <tr> <td>三国演义</td> <td><a href="http://www.mamicode.com/sessionbean4.jsp?name=三国演义">购买</a></td> </tr> </table> </body> </html>
执行结果:
4、在开发的过程中。有一些注意问题,须要在此提醒:
1、使用注解时。注视使用javax.ejb.*包中的工具类;
2、因为存在client与server两端的开发,我们要注意,在开发完服务端后。须要将其部署到server,供client调用;
3、不同的client调用时。依赖包不太一样。像普通的java项目,我们须要引入Jboss(这里拿Jboss应用server做个例如)的Client包。这里的包为我们开发者准备了Ejb执行的一些工具类,而Webclient则无需引入Client包。
4、不管什么client,都须要引入服务端的接口。由于client须要使用JNDI。依据接口实例化实现。
这些包假设不引入,部署到server不会报错(server都有这些包),可是在开发期间是会报错的。
通过本人实例。相信你已经了解了有状态会话Bean的应用情况,在项目中。你能够依据实际情况。酌情选择使用。
Ejb in action(四)——购物车实例演示有状态会话Bean