EJB---->Session Beans
一、 无状态Session Bean
第一步:要定义一个会话Bean,首先需要定义一个包含他所有业务方法的接口。
package com.foshanshop.ejb3; public interface HelloWorld { public String SayHello(String name); }
第二步:实现上面的接口并加入两个注释@Stateless , @Remote,第一个注释定义这是一个无状态会话Bean,第二个注释指明这个无状态Bean 的remote 接口。
package com.foshanshop.ejb3.impl; import com.foshanshop.ejb3.HelloWorld; import javax.ejb.Remote; import javax.ejb.Stateless; @Stateless @Remote ({HelloWorld.class}) public class HelloWorldBean implements HelloWorld { public String SayHello(String name) { return name +"说:你好!世界,这是我的第一个EJB3哦."; } }
test.jsp
<%@ page contentType="text/html; charset=GBK"%> <%@ page import="com.foshanshop.ejb3.HelloWorld, javax.naming.*, java.util.Properties"%> <% Properties props = new Properties(); props.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory"); props.setProperty("java.naming.provider.url", "localhost:1099"); props.setProperty("java.naming.factory.url.pkgs", "org.jboss.naming"); InitialContext ctx; try { ctx = new InitialContext(props);//如果客户端和jboss运行在同一个jvm,不需要传入props HelloWorld helloworld = (HelloWorld) ctx.lookup("HelloWorldBean/remote"); out.println(helloworld.SayHello("佛山人")); } catch (NamingException e) { out.println(e.getMessage()); } %>
开发只存在Local 接口的无状态会话Bean 的步骤和上节开发只存在Remote 接口的无状态会话Bean 的步骤相同,
两者唯一不同之处是,前者下面是只存在Local 接口的无状态会话Bean 代码。
二、有状态Bean
有状态Bean 是一个可以维持自身状态的会话Bean。每个用户都有自己的一个实例,在用户的生存期内,Stateful
Session Bean 保持了用户的信息,即“有状态”;一旦用户灭亡(调用结束或实例结束),Stateful Session Bean 的
生命期也告结束。即每个用户最初都会得到一个初始的Stateful Session Bean。
Stateful Session Bean 的开发步骤与Stateless Session Bean 的开发步骤相同。
Session Bean 保持了用户的信息,即“有状态”;一旦用户灭亡(调用结束或实例结束),Stateful Session Bean 的
生命期也告结束。即每个用户最初都会得到一个初始的Stateful Session Bean。
Stateful Session Bean 的开发步骤与Stateless Session Bean 的开发步骤相同。
先定义接口
package com.foshanshop.ejb3;
package com.foshanshop.ejb3; import java.io.Serializable; import java.util.List; public interface Cart extends Serializable { public void AddBuyItem(String productName); public List<String> getBuyItem(); }
stateful session bean 必须实现Serializable 接口,这样EJB 容器才能在她们不再使用时序列化存储她们的状态信息.
package com.foshanshop.ejb3.impl; import java.util.ArrayList; import java.util.List; import javax.ejb.Remote; import javax.ejb.Stateful; import com.foshanshop.ejb3.Cart; @SuppressWarnings("serial") @Stateful @Remote(Cart.class) public class CartBean implements Cart{ private List<String> buyitem = new ArrayList<String>(); public void AddBuyItem(String productName) { buyitem.add(productName); } public List<String> getBuyItem() { return buyitem; } }
通过@Stateful 注释定义这是一个有状态会话Bean,@Remote注释指明有状态Bean 的remote 接口。@SuppressWarnings("serial") 注释屏蔽缺少serialVersionUID 定义的警告。
StatefulBeanTest.jsp
<%@ page contentType="text/html; charset=GBK"%> <%@ page import="com.foshanshop.ejb3.*,java.util.*,javax.naming.*"%> <% try { InitialContext ctx = new InitialContext(); Cart cat = (Cart)session.getAttribute("cat"); if(cat==null){//创建一个购物车 cat = (Cart) ctx.lookup("CartBean/remote"); session.setAttribute("cat", cat); } cat.AddBuyItem("《EJB3.0实例教程》"); List<String> buyitem = cat.getBuyItem(); out.println("购物车的商品列表:<br>"); for(String name : buyitem){ out.println(" "+ name+ "<br>"); } } catch (Exception e) { out.println(e.getMessage()); } %>