EJB初探
EJB初探
无状态会话Bean
1.创建一个“EJB Project”工程“MyEJB”,界面如下图。

取消“Add Support for Entity beans”的选择,然后点击“Finish”按钮。
2.创建一个包:“cn.bean”用于保存EJB的类和其对应的接口文件。
3.创建一个叫SayHi的“EJB3 Session Bean”,如下图:

选中“Create Interface”的“Local”和“Remote”,即为此类创建远程接口和本地接口,对应类文件为:SayHiLocal.java和SayHiRemote.java。“Session Type”(会话类型):Stateless(无状态会话Bean)。
4.两个接口内容如下:
SayHiLocal内容
package cn.iface;
import javax.ejb.Local;
@Local //指定接口为本地调用
public interface SayHiLocal {
public String sayHi(String name);
}
SayHiRemote内容:
package cn.iface;
import javax.ejb.Remote;
@Remote //指定接口为远程调用
public interface SayHiRemote {
public String sayHi(String name);
}
5.编写会话类:SayHi,并实现以上两个接口。其内容如下:
package cn.bean;
import javax.ejb.Stateless;
import cn.iface.SayHiLocal;
import cn.iface.SayHiRemote;
@Stateless //注解,此Bean为无状态会话Bean
public class SayHi implements SayHiLocal, SayHiRemote {
public String sayHi(String name) {
return name +"欢迎你进入EJB世界!!";
}
}
6.部署EJB:
在前面创建的JBoss Server的图标上点击右键,在弹出的快捷菜单中选择“Add Deployment....”,弹出对话框如下图:

在“Project”中选择当前工程“MyEJB”。
7.启动JBoss。
1) 编写远程客户端
1.创建一个“Java Project”工程,名为“EJBClient”。
2.编辑“Build Path”将JBoss目录中Client中的所有的JAR包添加到工程的类路径上。
编辑“Build Path”,在“Projects”选项卡中将“MyEJB”工程添加的列表(如图),或复制上面EJB工程中的远程接口文件SayHIRemote包括整个包,到本工程中。

注:勿忘引入JBoss中的Client包

3)创建一个类Client,代码如下:
import java.util.*;
import javax.naming.*;
import cn.iface.*;
public class Client {
public static void main(String[] args) {
Hashtable<String, String> ht=new Hashtable<String, String>();
ht.put("java.naming.factory.initial",
"org.jnp.interfaces.NamingContextFactory");
ht.put("java.naming.provider.url","localhost:1099");
Context ctx;
try{
//创建上下文环境
ctx = new InitialContext(ht);
SayHiRemote s =(SayHiRemote)ctx.lookup("SayHi/remote");
System.out.println(s.sayHi("Tome"));
}catch(Exception e){
e.printStackTrace();
}
}
}
结果
客户端:

服务器端:

EJB中执行的过程是在服务器端完成的然后可以将执行的结果返回到客户端,客户端仅仅接受服务器返回的结果;
2)有状态会话Bean
(1)编写一个有状态会话Bean完成购物车的功能。
新建一个名叫“CartBean”的EJB3 Session Bean,对话框如下:

CartBean类的代码如下:
package cn.bean;
import java.util.ArrayList;
import java.util.HashMap;
import javax.ejb.Stateful;
@Stateful(mappedName="cart")//指明JNDI名为cart
public class CartBean implements CartBeanLocal, CartBeanRemote {
//商品信息列表,信息包括:gdID(编号),name(商品名),price(单价),number(购买数量)
private ArrayList<HashMap<String,Object>> goodsList = new ArrayList<HashMap<String,Object>>();
//添加商品
public void add(HashMap<String,Object> goods){
boolean found = false;
for(HashMap<String,Object> gd:goodsList){
if(gd.get("gdID") == goods.get("gdID")){
int num = (Integer) gd.get("number");
gd.put("number", num + 1);
found = true;
break;
}
}
if(!found){
goods.put("number", 1);
goodsList.add(goods);
}
}
//删除商品
public void delete(String gdID){
for(HashMap<String,Object> gd:goodsList){
if(gd.get("gdID").toString().equals(gdID)){
goodsList.remove(gd);
break;
}
}
}
//清空购物车
public void clearCart(){
goodsList.clear();
}
//获得商品清单
public ArrayList<HashMap<String,Object>> getGoodsList(){
return goodsList;
}
}
两个接口的代码:
local:
@Local
public interface CartBeanLocal {
public void add(HashMap<String,Object> goods);
public void delete(String gdID);
public void clearCart();
public ArrayList<HashMap<String,Object>> getGoodsList();
}
remote:
@Remote
public interface CartBeanRemote {
public void add(HashMap<String,Object> goods);
public void delete(String gdID);
public void clearCart();
public ArrayList<HashMap<String,Object>> getGoodsList();
}
(2)创建一个Web工程作为CartBean的客户端。
创建一个名为“cart”的Web工程,复制上边EJB3工程的中的本地接口文件(CartBeanLocal)——包括包名到本工程中。创建几个JSP页面完成商品的购买(放入购物车)、查看购物车、清除购物车的功能。
index.jsp:功能显示商品列表及添加到购物车的链接,代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>My JSP 'index.jsp' starting page</title>
</head>
<body>
<%
//下面代码模拟生成商品列表,各位可以通过数据库获取
ArrayList<HashMap<String,Object>> gds;
gds = (ArrayList<HashMap<String,Object>>)session.getAttribute("gds");
if(gds == null){
gds = new ArrayList<HashMap<String,Object>>();
HashMap<String,Object> tmp = new HashMap<String,Object>();
tmp.put("gdID","sp0001");
tmp.put("name","新编大学英语教程");
tmp.put("price",23.5);
gds.add(tmp);
tmp = new HashMap<String,Object>();
tmp.put("gdID","sp0002");
tmp.put("name","J2EE权威指南");
tmp.put("price",63.5);
gds.add(tmp);
tmp = new HashMap<String,Object>();
tmp.put("gdID","sp0003");
tmp.put("name","太阳泪");
tmp.put("price",21.5);
gds.add(tmp);
tmp = new HashMap<String,Object>();
tmp.put("gdID","sp0004");
tmp.put("name","新编大学文化教程");
tmp.put("price",28.5);
gds.add(tmp);
session.setAttribute("gds",gds);
}
%>
<table width="600" border="1" cellpadding="5" align="center">
<caption>商品列表</caption>
<tr>
<th width="100">商品编号</th>
<th width=300">商品名称</th>
<th width="80">单价</th>
<th width="120">操作</th>
</tr>
<c:forEach items="${gds}" var="gd">
<tr>
<td>${gd.gdID }</td>
<td>${gd.name }</td>
<td>${gd.price }</td>
<td>
<a href="add.jsp?gdID=${gd.gdID }">添加到购物车</a>
</td>
</tr>
</c:forEach>
</table>
<h3 align="center"><a href="cart.jsp">查看购物车</a></h3>
</body>
</html>
add.jsp: 将指定商品添加到购物车
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="javax.naming.*, java.util.*,cn.bean.CartBeanLocal"%>
<%
CartBeanLocal cart;
cart = (CartBeanLocal)session.getAttribute("cart");
if(cart == null){
InitialContext ctx = new InitialContext();
cart = (CartBeanLocal) ctx.lookup("CartBean/local");
session.setAttribute("cart",cart);
}
String gid = request.getParameter("gdID");
ArrayList<HashMap<String,Object>> gds = (ArrayList<HashMap<String,Object>>)session.getAttribute("gds");
for(HashMap<String,Object> gd:gds){
if(gd.get("gdID").equals(gid)){
cart.add(gd);
}
}
response.sendRedirect("index.jsp");
%>
cart.jsp: 显示购物车中的商品列表
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="javax.naming.*, java.util.*,cn.bean.CartBeanLocal"%>
<%@ 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">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
try {
CartBeanLocal cart;
Object cartTmp = session.getAttribute("cart");
if(cartTmp == null){
InitialContext ctx = new InitialContext();
cart = (CartBeanLocal) ctx.lookup("CartBean/local");
session.setAttribute("cart",cart);
}
else{
cart = (CartBeanLocal)cartTmp;
}
ArrayList<HashMap<String,Object>> goodsList = cart.getGoodsList();
pageContext.setAttribute("gdlist",goodsList);
} catch (NamingException e) {
out.println(e.getMessage());
}
%>
<table width="600" border="1" cellpadding="5" align="center">
<caption>商品列表</caption>
<tr>
<th width="100">商品编号</th>
<th width=300">商品名称</th>
<th width="100">单价</th>
<th width="100">数量</th>
</tr>
<c:forEach items="${gdlist}" var="gd">
<tr>
<td>${gd.gdID }</td>
<td>${gd.name }</td>
<td>${gd.price }</td>
<td>${gd.number }</td>
</tr>
</c:forEach>
</table>
<h3 align="center"><a href="clearCart.jsp">清空购物车</a></h3>
</body>
</html>
clearCart.jsp:清空购物车
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="javax.naming.*, java.util.*,cn.bean.CartBeanLocal"%>
<%
CartBeanLocal cart = (CartBeanLocal)session.getAttribute("cart");
cart.clearCart();
response.sendRedirect("cart.jsp");
%>
(3)部署
使用前面的无状态会话Bean的部署方法,在MyEclipse中直接部署本部分内容可能会不能正常运行,在此必须脱离MyEclipse将两个工程直接部署到独立的JBoss服务器中。
第一步:将两个工程导出
a、导出EJB工程。在工程列表中的MyEJB工程上点击右键,在弹出的快捷菜单中选择“
”,弹出如下对话框:

选择导出目标为“Java”->“JAR file”,点击“Next”按钮,显示如下:

所有选择使用默认值,在“JAR file”中指明导出JAR文件的路径;点击“Finish”按钮,完成导出。
b、导出Web工程
同EJB工程,在工程名上点击右键,在快捷菜单中选择“Export....”,在弹出的对话框中选择目标为:“Java EE”->“WAR file(MyEclipse)”,点击“Next”按钮,显示如下:

第二步:启动JBoss并进行部署
执行JBoss的安装目录中bin目录下的run.bat,启动JBoss。
在浏览器的地址栏中输入:localhost:8080,得到如下界面:

点击“Administration Console”进入JBoss管理系统的登录界面,如图

Username和Password均为“admin”,登录进入管理界面如下图:

在左侧的栏目中选择“Applications”->“EJB3 JARS”,部署EJB工程——MyEJB.jar,界面如图:

点击“Add a new resource”,得到如下界面:

点击“浏览...”选择上面导出的EJB工程的jar文件,然点击“Continue”按钮完成部署。成功后可看到下图:

看到列表中出现了“MyEJB.jar”表示部署成功。
然后点击“Applications”中的“Web Application (WAR)s”,看到如下图,进行Web工程的部署;

点击“Add a new resource”按钮,得到和部署EJB时相似的界面,选择要部署的Web工程的导出文件cart.war,并点击“Continue”按钮完成部署,最后看到如下图:

表示部署成功。
第三部:测试
在浏览器地址栏中输入:localhost:8080/Cart
结果:


浙公网安备 33010602011771号