JSPCN主页 | JSP空间 | 网站制作 | JSP下载 | JSP论坛 | JSP教程 | 关于JSPCN | 联系我们
JSP虚拟主机,jsp空间,java空间,java虚拟空间,详细请点击进入
做最专业的JSP中文网站 当前位置首页--JSP技术--JSP其他  
文章搜索:
关键字 标题
  
JSP中文网内容管理系统(JCMS)
JSP虚拟主机
网络笔记本
网摘,图片,笔记收藏
虚拟服务器

JSPCN文章目录分类
JSP配置[219]JSP基础[136]
中文问题[69]上传问题[27]
JAVABEAN[46]数据库[212]
文件操作[126]图片声音[17]
JSP其他[57]时间相关[16]
JAVAMAIL[72]STRUTS[144]
开发工具[28]教程系列[157]
JSP实例[89]
JAVA基础[421]APPLET[78]
JAVA网络[179]Applica[115]
Servlet[98]XML[163]
J2ME[257]J2EE[374]
考试相关[63]JAVA线程[90]
EJB[261]Swing[26]
Java API[141]声音图片[28]
异常处理[33]JAVA实例[290]
JAVA类[139]SUN[89]
Hibernate[6]JMX[8]
Spring[34]
本版推荐文章 
本版热点文章 
相关文章链接 
 
基于SLSB(无状态SessionBean)的一种架构
作者:     文章来源:
访问次数:41次     加入时间:2007年03月10日
首发:http://blog.csdn.net/killme2008/archive/2006/04/21/671401.aspx

我们知道,在EJB中最有价值的部分是无状态Session Bean(SLSB)和MDB(消息驱动Bean)。最近公司交给我一个模块来完成,是过去的系统,典型的使用EJB的方式,利用SLSB作为一个门面,业务逻辑封装在普通javabean里面,持久层使用公司自己的一个基础框架。分析如下:

首先是一个公用的SLSB,做为业务层的门面(Facade),如:

远程接口:

import javax.naming.NamingException;
import java.sql.SQLException;
import java.util.Hashtable;
/**
 * Remote interface for Enterprise Bean: Test_common
 */
public interface Test_common extends javax.ejb.EJBObject {
 /**
  *公用业务调用方法
  *@param 调用的代码定义
  *@param 调用的参数
  *@return 返回Hashtable 
  */
 public Hashtable getBusiness(String vs_code, Hashtable vt_cs)
  throws NamingException, SQLException, java.rmi.RemoteException;
}

其中的vs_code指的是调用的模块代码,而vs_cs是一个HashMap,用来传递参数到业务层。

HOME接口:

public interface Test_commonHome extends javax.ejb.EJBHome {
 /**
  * Creates a default instance of Session Bean: IQS_common
  */
 public iqsEjb.common.Test_common create()
  throws javax.ejb.CreateException, java.rmi.RemoteException;
}

很明显,不废话,接下来就是BEAN部分,这才是关键:

import testejb.model1.Test1;

import testejb.model2.Test2;

import java.sql.SQLException;
import java.util.Hashtable;
import java.util.StringTokenizer;

import javax.naming.NamingException;

/**
 * Bean implementation class for Enterprise Bean:Test_common
 */
public class Test_commonBean implements javax.ejb.SessionBean {
 private javax.ejb.SessionContext mySessionCtx;
 /**
  * getSessionContext
  */
 public javax.ejb.SessionContext getSessionContext() {
  return mySessionCtx;
 }
 /**
  * setSessionContext
  */
 public void setSessionContext(javax.ejb.SessionContext ctx) {
  mySessionCtx = ctx;
 }
 /**
  * ejbCreate
  */
 public void ejbCreate() throws javax.ejb.CreateException {
 }
 /**
  * ejbActivate
  */
 public void ejbActivate() {
 }
 /**
  * ejbPassivate
  */
 public void ejbPassivate() {
 }
 /**
  * ejbRemove
  */
 public void ejbRemove() {
 }
 /**
  *公用业务调用方法
  *@param 调用的代码定义
  *@param 调用的参数
  *@return 返回Hashtable 
  */
 public Hashtable getBusiness(String vs_code, Hashtable vt_cs)
  throws NamingException, SQLException {
  Hashtable tab = null;
  int i = 0;
  String xt = "";
  int oper = 0;
  vs_code = vs_code.toLowerCase();
  StringTokenizer tok = new StringTokenizer(vs_code, "@");
  while (tok.hasMoreTokens()) {
   if (i == 0)
    xt = tok.nextToken();
   if (i == 1)
    oper = Integer.parseInt(tok.nextToken());
   i++;
  }

  if (xt.equals("testejb_model1_test")) {
   //模块1
   Test1 test=new Test1(oper,vt_cs);   //注意了,传入参数和所调用逻辑方法的代码

     tab = test.getResult();
  } else if (xt.equals("testejb_model2_test")) {
   //模块2
Test2 test=new Test2(oper,vt_cs);

     tab = test.getResult();

  }

  return tab;

  }

}

在业务逻辑方法里面,我们首先解析传进来的模块代码,然后进行判断,调用相应的普通javabean。我们传入的模块代码像这样:("testejb_model1_test@1,1代表此模块的某一业务逻辑方法的代码。是不是有点晕?呵呵,等我下面再详细谈。好了,门面最好了,接下来就是具体的业务逻辑了,比如模块1的Test1逻辑:

package testejb.model1;

public class Test1 {

 private Hashtable tab = new Hashtable(); //返回的结果集
 private Hashtable cs = null; //传入的参数集

 public Test1(int vi_oper, HashMap vs_cs) {
  cs = vt_cs;
  switch (vi_oper) { //根据逻辑方法代码,调用相应方法
   case 1 :
    {
     HelloWorld(); //方法一
     break;
    }
   case 2 :
    {
     HelloWorld2(); //方法2
     break;
    }
   default :
    break;
  }
 }

 public void Helloworld() {
  tab.put("1", "Hello World!"+(String)cs.get("name")); /

 /返回结果HelloWorld+姓名,1是给这个结果一个标记,好在servlet中取得
 }

 public void Helloworld2() {
  tab.put("1", "Shit Hello World!"+(String)cs.get("name"));
  //返回结果Shit HelloWorld+姓名,1是给这个结果一个标记,好在servlet中取得
 }

 public Hashtable getResult() { //返回结果集
  return tab;
 }

}
如你所见,我们把业务逻辑写在这个普通的javabean里面,这是模块1的业务逻辑,你当然可以照着写模块2,每增加一个模块,就在Test_commonBean增加一个:

else if(xt.equals(模块名)){   创建业务逻辑对象,返回结果集}

好了,SLSB和业务逻辑都写好了,该怎么调用呢?假设我们在servlet中调用此SLSB,典型的代码如下:

Hashtable tab = new Hashtable();   //作为即将传入的参数集合,在这个例子中就是名字咯

try {

 Context context = new InitialContext();
 Test_commonLocalHome home =
  (Test_commonLocalHome) context.lookup("java:comp/env/testcommonbean");
 Test_commonLocal remote = home.create();
 PrintWriter out = resp.getWriter();
 String vs_name = req.getParameter("vs_name"); //获得界面传入的name值
 tab.put("name", vs_name); //没忘了吧?我们在Test1中通过cs.get("name")获得参数

  String vs_result =
   (String) remote.getBusiness(//传入参数集和模块代码,注意这个1,我们调用case 1对应的方法
 "testejb_model1_test@1", tab).get("1");
 out.print(vs_result);
 out.flush();
 out.close();

} catch {
 ...}
 

注意上面的注释,应该很清楚了吧:)输出结果为HelloWorld+你传入的姓名,如果把testejb_model1_test@1改成testejb_model1_test@1就调用case 2对应的方法,即HelloWorld2()方法,如果改成testejb_model2_test@1那就意味着调用模块2中的业务逻辑了。传入和返回的信息都是用HashMap封装。

呵呵,自己分析了下,对那个项目的理解更深入了点,这也应该是使用SLSB的一个典型方法了。值的学习。

JSP虚拟主机 | JSP空间 | JSP主机 | JSP双线虚拟主机 | JAVA空间 | JAVA虚拟主机 | 虚拟服务器 | JSP 虚拟服务器 | VPS
Virtual Private Server | JAVA虚拟服务器 | VM服务器 | VHOST | 虚拟操作系统 | JSP论坛 | JAVA论坛 | JSP站点论坛
Copyright © 2002-2005 JSPCN.net. All rights reserved.
JSP中文网    备案序号:蜀ICP备05001583号
成都恒海科技发展有限公司    成都市一环路南二段6号新瑞楼三楼8号