动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
电脑书籍下载:程序设计书籍 | 数据库教程书籍 | 平面与多媒体书籍 | 网络通讯书籍 | 系统管理书籍 | 网络安全书籍 | 认证考试书籍
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ Java教程 ]的信息



本月文章推荐
.dom4j中文问题解决方法。.
.Java技术进阶 基于Java的IDEA加密.
.J2ME技术在手机开发领域的优势和.
.一种常用的权限控制算法的实现.
.Java变量的赋值.
.Apache的完全安装转载.
.怎样在J2ME上实现记录管理存储.
.探索研究Laszlo的类、属性及事件.
.使用.NET框架类替代API调用的问题.
.分享关于j2me xmlReader的轻量级.
.关于OJB和Hibernate框架的评议.
.爪哇语言结构性模式之变压器模式.
.在升级到.NET1.1版之前所要考虑的.
.J2EE中使用EntityBean和JDO的优缺.
.SCNA认证全面介绍.
.JBuilder2005实现重构之重构前的.
.桌面系统的第二次战役--难解难分.
.使用SQLMaps 进行对象关系映射.
.在运行时将大图分割为小图片数组.
.双击Jar的启动方法.

运用反射实现ejb动态委派

发表日期:2008-1-5 |



  每个bean可能会有很多方法,一般我们通过一个delegate来调用sessionbean中的方法,而非直接调用sessionbean,delegate中只是简单的对每个相对应的sessionbean的public方法的简单封装,在调用的时候省去了每次对home的查找和ejb对象的create,但是可能我们的bean会有很多方法,假如每个bean都写这样一个delegate,这样工作量就会很大,而且也不便于以后系统的移植,比如说,原来使用ejb实现,现在要改用jdo直接操作数据库,而通过运用Java的reflect技术,就能较好地实现这些要求。首先,定义了一个FacadeDelegate的抽象类,用来实现对sessionbean的home的查找,代码如下:
  
  import javax.ejb.*;
  
  import testejb.util.common.*;
  
  import testejb.util.resource.*;
  
  public abstract class FacadeDelegate{
  
   private static String type = Resource.RemoteType;
  
   public FacadeDelegate() {
  
   }
  
   public EJBHome getHome(String jindiName,Class className)
  
   {
  
    EJBHome home = null;
  
    ServerLocatorAdapter adapter = ServerLocatorAdapter.getInstance();
  
    try
  
    {
  
     home = (EJBHome)adapter.getHome(type, jindiName, className);
  
    }
  
    catch(Exception e)
  
    {
  
     System.err.println(e.getMessage() + jindiName + className.toString());
  
    }
  
    return home;
  
   }
  
  
  
  }
  
  其中ServerLocatorAdapter是一个用来根据是local还是remote调用ejb对象而通过不同的方法查找home的类,假如type为local则调用LocalServerLocate中的方法,假如type为remote则调用RemoteServerLocate中的方法,获得home。代码如下:
  
  import java.util.*;
  
  import java.lang.reflect.*;
  
  import testejb.util.resource.*;
  
  public class ServerLocatorAdapter {
  
   private Map cache;//用来缓存home
  
   private static ServerLocatorAdapter me;
  
   public static ServerLocatorAdapter getInstance()
  
   {
  
    if(me == null)
  
     me = new ServerLocatorAdapter();
  
    return me;
  
   }
  
   //取得home
  
  public Object getHome(String type,String jndiHomeName,Class className) throws Exception
  
   {
  
    Object home = null;
  
    if(cache.containsKey(jndiHomeName))
  
     return cache.get(jndiHomeName);
  
    if(Resource.LocalType.equals(type))
  
    {
  
     home = getLocalHome(jndiHomeName,className);
  
     cache.put(jndiHomeName,home);
  
     return home;
  
    }
  
    if(Resource.RemoteType.equals(type))
  
    {
  
     home = getRemoteHome(jndiHomeName,className);
  
     cache.put(jndiHomeName,home);
  
     return home;
  
    }
  
    return home;
  
   }
  
   //取得local home
  
   private Object getLocalHome(String jndiHomeName,Class className) throws Exception
  
   {
  
  Class myClass = Class.forName(Resource.LocalClass);
  
  // Resource. LocalClass =”testejb.util.common. LocalServerLocator
  
  Method method = myClass.getMethod(Resource.LocalConstractMethod,null);
  
  // Resource. LocalConstractMethod =” getInstance”
  
    LocalServerLocator local = null;
  
    local = (LocalServerLocator)method.invoke(myClass,null);
  
    return local.getLocalHome(jndiHomeName,className);
  
  }
  
  //取得remote home
  
   private Object getRemoteHome(String jndiHomeName,Class className) throws Exception
  
   {
  
  Class myClass = Class.forName(Resource.RemoteClass);
  
  // Resource.RemoteClass =”testejb.util.common.RemoteServerLocator”
  
  Method method = myClass.getMethod(Resource.RemoteConstractMethod,null);
  
  // Resource.RemoteConstractMethod=” getInstance”
  
    RemoteServerLocator remote = null;
  
    remote = (RemoteServerLocator)method.invoke(myClass,null);
  
    return remote.getHome(jndiHomeName,className);
  
   }
  
   private ServerLocatorAdapter() {
  
    // 为cache提供线程安全的保证
  
    cache = Collections.synchronizedMap(new HashMap());
  
   }
  
  }
  
  其中Resource为资源类,其中通过对配置文件的读取,取得一些指定的配置信息。
  
  RemoteServerLocator和LocalServerLocator是两个根据不同的调用方式取得home借口的具体实现类,代码如下:
  
  LocalServerLocator:
  
  import javax.naming.*;
  
  import javax.rmi.PortableRemoteObject;
  
  import java.util.*;
  
  import javax.ejb.*;
  
  public class LocalServerLocator {
  
   private Context ic;
  
   private Map cache;//缓存home
  
   private static LocalServerLocator me;
  
   public static LocalServerLocator getInstance()
  
   {
  
    if(me == null)
  
    {
  
     try
  
     {
  
      me = new LocalServerLocator();
  
     }
  
     catch(Exception e)
  
     {
  
      System.err.println(e.getCause());
  
      System.err.println(e.getMessage());
  
     }
  
    }
  
    return me;
  
   }
  
   public EJBLocalHome getLocalHome(String jndiHomeName, Class className) throws Exception {
  
      EJBLocalHome home = null;
  
      try {
  
        if (cache.containsKey(jndiHomeName)) {
  
          home = (EJBLocalHome) cache.get(jndiHomeName);
  
        } else {
  
          Object objref = ic.lookup(jndiHomeName);
  
          home = (EJBLocalHome) objref;
  
          cache.put(jndiHomeName, home);
  
        }
  
      } catch (NamingException ne) {
  
        System.err.println(jndiHomeName);
  
        throw ne;
  
      } catch (Exception e) {
  
        throw e;
  
      }
  
      return home;
  
    }
  
   private LocalServerLocator() throws Exception{
  
    try
  
    {
  
     ic = new InitialContext();
  
     // 为cache提供线程安全的保证
  
     cache = Collections.synchronizedMap(new HashMap());
  
    }
  
    catch(NamingException ne)
  
    {
  
     throw ne;
  
    }
  
    catch(Exception e)
  
    {
  
     throw e;
  
    }
  
   }
  
  }
  
  RemoteServerLocator
  
  import javax.naming.*;
  
  import javax.rmi.PortableRemoteObject;
  
  import java.util.*;
  
  import javax.ejb.*;
  
  public class RemoteServerLocator{
  
   private Context ic;
  
   private Map cache;
  
   private static RemoteServerLocator me;
  
   public static RemoteServerLocator getInstance()
  
   {
  
    if(me == null)
  
    {
  
     try
  
     {
  
      me = new RemoteServerLocator();
  
     }
  
     catch(Exception e)
  
     {
  
      System.err.println(e.getMessage());
  
     }
  
    }

上一篇:EJB实质问题 人气:279
下一篇:EJB最佳实践:实体bean保护 人气:200
浏览全部Java的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-7-9 顶级域名交易系统 v3.0 完整版
2008-7-9 ACTCMS网站管理系统 v2.0 Build
2008-7-9 Roclog v3.1.4 build 20080706
2008-7-9 乐彼网上开店系统(56770 Eshop)
2008-7-9 深度学习alexa排名提升专家 v1.0
2008-7-9 BBSXP 2008 Build 8.0.5 正式版
2008-7-9 一句话快速信息发布系统 修正完美
2008-7-9 ACTCMS网站管理系统 v2.0 Build
2008-7-9 乐涛涛留言本 08版
2008-7-5 AgileMessenger即时通讯工具 v1.
2008-7-5 GoodCalculator2.0版固件计算器
2008-7-5 RepoName源地址搜索工具 v1.21b
2008-7-5 AgileMessenger即时通讯工具 v1.
2008-7-5 TouchCopy多媒体管理软件 v3.13完
2008-7-5 VideosTone视频铃声 v1.1汉化破解
2008-7-5 TouchPad触摸板 v4.44破解版
2008-7-5 VideosTone破解补丁 v1.0
2008-7-5 Feeds GoogleReader客户端 v0.4.3


  发表评论
姓 名: 验证码:
内 容:
[ 汉字翻译拼音 ] [ 广告代码 ] [ 符号对照表 ] [ 进制转换 ] [ 经典小工具 ] [ 个税计算 ] [ 汉字简繁转换 ] [ 普通单位换算 ] [ 公制单位换算 ]
[ 生辰老黄历 ] [ 国内电话区号 ] [ 国家代码与域名缩写 ] [ 文字加密解密 ] [ 健康查询 ] [ 万年历 ] [ 手机号码查询 ] [ ip搜索 ] [ Google PR查询 ]
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報