JNDI及会话Bean
环境要求:
1)服务器:JBoss6.0以上
2)集成开发环境:myEclipse 8.5 或更高
一、在Eclipse中配置JBoss
1) 下载JBoss-6.0.0.CR1,并解压;
2) 添加环境变量“JBoSS_HOME”为JBoss的安装目录
3) 启动myEclipse,在下方的“Server”选项卡中点击右键,在快捷菜单中选择“Configuer Server Connector”,打开如下对话框:
4) 在左侧列表中选择“Servers”列表中的“JBoss”->“JBoss v6.x”,然后在右侧面板中的“JBoss server”中选择“Enable”,并在“JBoss home directory”中指明你JBoss的安装目录。然后点击“ok”按钮。
二、JNDI的使用
1) 在JBoss下绑定将资源绑定到JNDI。
i.创建一个“web project”工程名为“jndi”。
ii.创建一个jsp页面“index.jsp”,并编写如下内容:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="javax.naming.*" %> <%@ page import="javax.swing.*" %> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JNDI Demo</title> </head> <body> <% //创建命名服务上下文 Context ctx = new InitialContext(); //创建一个对象mWin JFrame mWin = new JFrame("Test"); //将对象绑定到JNDI服务器,JNDI绑定名为“testName” ctx.rebind("testName",mWin); out.println("绑定成功...."); %> </body> </html>
iii.将此工程发布到JBoss上,然后启动JBoss。
iv.打开另一个浏览器窗口,访问一次刚发布的jdni的index.jsp页面,若看到“绑定成功.... ”,表示JNDI名已经绑定成功。
2) 通过JNDI查询并引用绑定对象
- 创建一个“Java project”工程,工程名为“jndiClient”。
- 在工程名上点击右键,在弹出的快捷菜单中选择“Build Path”->“Configure Bulid Path”,弹出如下对话框:
点击“Add External JARS...”按钮,将JBoss安装目录中“client”目录中的所有Jar文件添加(jndi的客户端类库)。
import javax.naming.*; import javax.swing.*; import java.util.*; public class Client { public static void main(String args[]) throws Exception{ Hashtable ht = new Hashtable(); //设置上下文类工厂 ht.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory"); //设置JNDI服务提供者地址 ht.put(Context.PROVIDER_URL,"jnp://localhost:1099"); //创建JNDI上下文 Context ctx = new InitialContext(ht); //通过JNDI绑定名查询绑定对象 JFrame jWin = (JFrame)ctx.lookup("testName"); jWin.setBounds(20,20,400,300); jWin.setVisible(true); } }
|
1.运行上面代码,应该看到如图窗口:
三、编写会话Bean
1) 无状态会话Bean
i.创建一个“EJB Project”工程“MyEJB”,界面如下图。
取消“Add Support for Entity beans”的选择,然后点击“Finish”按钮。
ii.创建一个包:“cn.bean”用于保存EJB的类和其对应的接口文件。
iii.创建一个叫SayHi的“EJB3 Session Bean”,如下图:
选中“Create Interface”的“Local”和“Remote”,即为此类创建远程接口和本地接口,对应类文件为:SayHiLocal.java和SayHiRemote.java。“Session Type”(会话类型):Stateless(无状态会话Bean)。
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); } |
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世界!!"; } }
|
vi.部署EJB:
在前面创建的JBoss Server的图标上点击右键,在弹出的快捷菜单中选择“Add Deployment....”,弹出对话框如下图:
在“Project”中选择当前工程“MyEJB”。
vii.启动JBoss。
2) 编写远程客户端
i.创建一个“Java Project”工程,名为“EJBClient”。
ii.编辑“Build Path”将JBoss目录中Client中的所有的JAR包添加到工程的类路径上。
iii.编辑“Build Path”,在“Projects”选项卡中将“MyEJB”工程添加的列表(如图),或复制上面EJB工程中的远程接口文件SayHIRemote包括整个包,到本工程中。
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(); } } }
|
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 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 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工程。在工程列表中的cart工程上点击右键,在弹出的快捷菜单中选择“ ”,弹出如下对话框:
选择导出目标为“Java”->“JAR file”,点击“Next”按钮,显示如下:
所有选择使用默认值,在“JAR file”中指明导出JAR文件的路径;点击“Finish”按钮,完成导出。
b、导出Web工程
同EJB工程,在工程名上点击右键,在快捷菜单中选择“Export....”,在弹出的对话框中选择目标为:“Java EE”->“WAR file(MyEclipse)”,点击“Next”按钮,显示如下:
在“WAR file”中指明要导出的目标位置,点击“Finish”按钮完成导出。
第二步:启动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