Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1529687
  • 博文数量: 3500
  • 博客积分: 6000
  • 博客等级: 准将
  • 技术积分: 43870
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-03 20:31
文章分类

全部博文(3500)

文章存档

2008年(3500)

我的朋友

分类:

2008-05-04 19:48:52

一起学习
编译 yife 参考了blueprints 的 session Facade 模式后,我很难给出一个比较确切的中文名称 ,当看过该文后你会觉得 把他称为 EJB 代理bean 是不错的。 该模式,在看完下图后 ,变的很好理解: 以很容易的看出,该流程把许多远程调用,转化成对一个session bean 的调用,这就是为什么,我们可以把这个session bean看成是 对后端的EJB代理,由于该session bean 本身也处于 J2ee 环境,所以可以很容易对EJB 和其他j2ee 服务,比如jms ,jdbc 进行本地调用.但最主要是对 EJB实现操作的 进行了包装 ,使得对 EJB 的某些 改动,不会影响到每个 client ,只要在 Facade session 上做相应的 改动。 再来看一下 session Facade UML 结构图 以下是 blueprints 原文中总结的 使用session Facade 的优势: 1.由于仅仅被 session Facade 所调用,降低了 对ejb 的误用率(想想以前 在很多个 jsp 中调用众多的EJB 的不同的方法 属性,我们往往需要到 每个jsp 中查看问题的所在 ,现在可以把问题焦点集中在 session Facade 中了) 2.简单的使用多形式终端(jsp ,applet ,JFC client),由于client 只要简单的调用 session Facade ,所以各种client 形式变的不再重要 。(我个人觉得这条优势 不是很明显) 3.可以把 事务、安全、调式、日志控制集中到一点。这是采用代理机制鲜明的特点。(把session Facade看成中心点 ,EJB 和 client 均有很多 ,通过session Facade 把 逻辑流程集中到了一点) 4.降低的网络传输,把对多个远程对象的调用 变成了对一个 session Facade的调用,其他调用转化成了本地调用. (这里我有两点补充: a.很多的英文文章提到了降低网络传输,其实在实际的J2EE 应用中,大部分人把client,比如说jsp 和EJB 在发布在同一个app containor中,虽然仍然采用了http 或 t3的网络传输协议,但在同一个机器中运行,所以不占用网络资源,只是占用机器的内部资源 b.虽然在EJB 2.0中提出了本地接口,提高了本地client调用EJB 的效率,但从session Facade 的上一点优势看出,他仍然是有使用价值的) 5.提高了对EJB 的数据模型改变的适应性。提高了对app server实现 变化的适应性. 原因还是session Facade 把逻辑流程在该点上收成一点,形成了良好的逻辑结构. 在实际的应用上,有两种应用方式: 1.使用stateful session bean 来代表 区分个体的,短期的工作流程。在会话 工作期中保存相应的 用户数据 2.使用stateless session bean 来代表公用的 的服务流程. 应用范例: 注:由于原文给出的范例出自 Sun Java Pet Store sample ,省略了很多地方,而且过于复杂,我试着给出一个更易于理解的范例,当然大家也可以参考原文中范例 client tier: clienthelper.java 中: class clientHelper{ public Object Init(String JNDIName) { InitialContext cntxt = new InitialContext( ); return cntxt.lookup(JNDIName); } public myEjbProxy getProxySession(int UID){ //here return session Facade 's remote object Object ref=Init("java:comp/env/ejb/myEjbProxy"); myEjbProxyHome myProxyHome= (myEjbProxyHome )PortableRemoteObject.narrow(ref,myEjbProxyHome.class); retrun myProxyHome.create(UID); } public CartItem getCartItem(int UID){ // get the session Facade myEjbProxy ,here is statful session myEjbProxy theproxy = getProxySession(UID); retrun theproxy.getCartItem(); } ... ... } session Facade: public class myEjbProxyBean implements SessionBean{ ... ... public CartItem getCartItem(){ //invoke some method in Entity ejb } } 阅读英文原文 下载本文示例代码


session Facade 模式session Facade 模式session Facade 模式session Facade 模式session Facade 模式session Facade 模式session Facade 模式session Facade 模式session Facade 模式session Facade 模式session Facade 模式session Facade 模式
阅读(204) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~