Jndi和会话bean

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查询并引用绑定对象

  1. 创建一个“Java project”工程,工程名为“jndiClient”。
  2. 在工程名上点击右键,在弹出的快捷菜单中选择“Build Path”->“Configure Bulid Path”,弹出如下对话框:

    点击“Add External JARS...”按钮,将JBoss安装目录中“client”目录中的所有Jar文件添加(jndi的客户端类库)。     
        iii.添加一个类“Client”,代码如下:       
    
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)。

  iv. 两个接口内容如下:
    
    
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);
}

 

 

v.编写会话类: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世界!!";
	}

}

  

    


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 

posted @ 2013-04-26 15:42  再见,少年  Views(637)  Comments(0Edit  收藏  举报