• 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 

  • 相关阅读:
    bzoj 4606: [Apio2008]DNA【dp】
    UOJ #206. 【APIO2016】Gap【交互题】
    bzoj 4071: [Apio2015]巴邻旁之桥【splay】
    bzoj 4069: [Apio2015]巴厘岛的雕塑【dp】
    bzoj 4070: [Apio2015]雅加达的摩天楼【spfa】
    洛谷 P3625 [APIO2009]采油区域【枚举】
    bzoj 1178: [Apio2009]CONVENTION会议中心(少见做法掉落!)【贪心+二分】
    bzoj 1179: [Apio2009]Atm【tarjan+spfa】
    洛谷 P3621 [APIO2007]风铃【贪心】
    bzoj 4898: [Apio2017]商旅【Floyd+分数规划+二分】
  • 原文地址:https://www.cnblogs.com/lxk2010012997/p/3044874.html
Copyright © 2020-2023  润新知