`
kunga
  • 浏览: 10540 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

自己理解的J2EE三层架构(与软件设计模式的联系区别)

阅读更多

如上图

1.J2EE分3层:
服务器端业务逻辑(有业务逻辑层和持久化数据层,Businness Tier 和EIS Tier)、服务器端表示层(Web Tier)及客户端表示层(Client Tier)

可以将J2EE设计模式归纳到6个类别
(1)表示层体系结构模式(服务器端表示层)
a.前端控制器模式
b.MVC模式
c.装饰器模式

(2)表示层高级体系结构模式
a.复合视图模式(在服务器端表示层)
b.视图助手模式
c.服务工作者模式

(3)表示层伸缩性模式(服务器端表示层)
a.异步页面模式
b.缓存过滤器模式
c.资源池模式

(4)业务层模式(服务器端业务逻辑层)
a.复合实体模式
b.域对象模式(业务数据层)

(5)数据传递模式(用于业务逻辑层和表示层之间)
a.DTO模式
b.DTO传递散列模式
c.数据库行集合DTO模式

(6)数据库模式(服务器持久化数据层)
a.DAO模式
b.DAO工厂模式


2.前端控制器模式
常用的应用为,一个servlet作为一个前端控制器,它负责根据页面的请求,然后转发到页面控制器。页面控制器也是一个servlet,这个servlet电泳关于这个请求所应该执行的业务逻辑,并根据业务逻辑的结果返回到具体的现实页面。简化的使用是前端控制器servlet利用“命令模式”将页面控制器转化成一个个更细粒度的类。

AcitonServlet是前端控制器,部分代码

RequestUtils.selecetModule(request,getServletContext());
getRequestProcessor(getModuleConfig(request)).process(request,response);

RequestProcessor的process方法处理公共任务,部分代码
if(!processPreprocess(request,response)){
return;
}
processXXX方法都在处理公共的动作


RequestProcessor的processActionPerform方法实现命令模式,该方式将具体请求的动作分配到Action。
部分代码
return(action.execute(mapping,form,request,response));

前端控制器选择页面控制器解析用户的请求,实现具体业务逻辑,并根据结果转发到页面试图


3.装饰器模式
(1)设计模式的的装饰器模式
装饰器模式为客户端提供一个透明扩充某实例功能的方法,该方法的返回类型就是这个实例,在客户端不断调用这个方法的同时,该实例的内部表象已经随着功能改变完全不同。
(2)J2EE设计模式中的装饰器模式
Servlet支持装饰器模式,装饰一个request请求,利用装饰器类截获所有发送给目标对象的请求,并执行需要的工作,完成之后再把请求转发到下一个装饰器,知道没有了装饰器,最后将请求发送到Servlet

Servlet利过滤器来拦截请求和响应,在请求到达Servlet前,为这个请求做一个些额外处理。处理器可以被看成一个链,每个过滤器之间都能互相传递,以下是过滤器Filter接口的doFilter有三个参数,ServletRRequest,ServletResponse,FilterChain,利用FilterChain的doFilter()激活下一个相关的过滤器


public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain)throws          IOException,ServletException{
//用secletEncoding方法设置字符编码
if(ingnore || request.getCharacterEncoding() == null){
  String encoding = selectEncoding(request);
  if(encoding != null)
   request.setCharacterEncoding(encoding);
}
chain.doFilter(request,response);
}


4.复合视图模式
设计模式中的“合成模式”
合成模式:提供一个树状的对象结构,树枝类与树叶类都实现同一个接口,以便客户端在调用任何对象时都只要需要调用该树状结构的根接口就可以了。

J2EE设计模式中的“复合视图模式”
将视图的布局从中抽离出来,形成由一系列通用组件的模板。可以利用XML来描述视图的组成


5.视图助手模式
jsp页面的标签库和struts的标签库,一个标签应该继承javax.servlet.jsp.tagext.TagSupport,并给出doStarTag和doEndTag两个方法的实现。
doStarTag实现业务逻辑
doEndTag控制输出

6.服务工作者模式
将页面流转、前端控制器模式,视图助手模式合在一起使用,表示“请求-转发-视图”的一整套流程。该模式也是MVC模式的实现标准,struts也基于这个模式实现


7.异步页面模式
当远程数据发生变化时,将其缓存下来,称为“发布者-订阅者-模型”。在J2EE的功能是,利用一个订阅者角色,在一个的时间间隔或数据发生变化时,接受来自发布者角色的数据,订阅者角色同时会利用模式曾来更新数据库。这样的工作累世于软件设计模式中的“观察者模式”。常见的应用为,当发布服务器需要显示最新信息的HTML页面时,会利用一个订阅者角色来负责。例如ActionServlet

8.缓存过滤器模式
这个模式用来椽村动态产生的页面,尽可能减少重复生成的页面。在J2EE的功能是,利用一个缓存过滤器截获请求,判断该请求所返回的页面是否有缓存。缓存过滤器应该放在“装饰过滤器”和工作Servlet之前。缓存过滤器是装饰过滤器的一个变体。对HTTPServletResponse对象进行装饰来保存请求处理的结果。

9.资源池模式
客户端在需要JDBC连接时,应该从一个池中去取得。如果池中有可用的JDBC连接,则返回这一对象资源。如果没有任何可用资源,但池中还有容量,就使用工厂生成一个新的实例。如果池中没有任何可用资源且池的容量已经沾满,那就必须等待,知道其他客户端还回至少一个对象。


10.复合实体模式
该模式可以降低工作环境中的复杂性和通信开销。一个复合实体将来自各种不同来源的数据集中到一个单独的对象中。应用为EJB环境的集中对象。


11.域对象模式
将一张数据库中的表结构对象化,例如hibernate中的表转化成对象,使用在持久层框架理论中

12.DTO模式
struts的ActionForm就是一个DTO模式的实现,从页面视图得到数据传递给模型层,模型层通过业务逻辑的调用后将返还数据给ActionForm用作视图层的数据显示
ActionForm仅仅被用在从视图层传递到模型层。


13.DTO散列模式
struts的DynaActionForm就是一个DTO散列模式,让程序员设置某个数据的主键,而后在Acton中可以通过该主键得到页面数据

14.数据库行集合DTO模式
将JDBC的ResultSet发送到客户端显示,使用ResultSet接口的一个独立类作为DTO发送到客户端显示。

15.DAO模式
数据访问对象模式被认为是持久层的一种基本模式
DAO模式有反问数据和处理业务逻辑的功能,现在不再流行


16.DAO工厂模式
用户只对被创建的产品感兴趣,而这些被创建的产品在创建之前所做的许多额外的工作被封装到工厂接口的子类中,而不适用具体产品类的构造函数,达到隐式的使用

改模式只有和数据库连接的功能,没有实现访问数据的功能

17.J2EE设计模式与设计模式的区别
(1)软件设计模式是设计,J2EE设计模式关注的就是构架
(2)软件设计模式为了解决各种软件世界中常见问题提炼的一种最佳时间,是许多经验丰富的软件设计者不断成功和失败的总结。
J2EE模式为了解决企业级应用的构架问题。
(3)软件设计模式的主要目的是解耦,可以在J2EE模型的任何层中出现软件设计模式。
J2EE设计模式对于J2EE模型中的分层进行解耦。软件设计模式关注的是微观的方法学,J2EE设计模式则是宏观的方法学。

18.
(1)前端控制器模式、MVC模式、服务工作者模式被整合成了表示层框架,如struts框架,webwork框架
(2)复合视图模式有Tiles框架实现
(3)视图助手模式的主要实现是标签库,JSTL标签库
(4)DAO工厂模式随着中间层框架Spring的依赖注入,已经不一定需要实现。



下面摘自网友的文章:

一、MVC架构
Struts是一个不错的MVC架构,我一直以来都用它,通过简单的配置即可将view,controler,和Model结合起来。View主要以JSP来实现,因为它是面向标签的,所以对于网页设计人员提供了很好的接口。FormBean是介于JSP和Action之间的中间数据载体,它肩负着数据从JSP到ACTION的传递过程。Action是流程的中转站,不同的业务在不同的Action中以不同的Model调用来实现。Model就是实现具体业务的操作过程,不过这种过程是一种在较高水平上的实现。
总之,MVC架构实现了三层结构中的两层,即表现层和业务层,另外还有一层被称之为持久化层。
二、三层架构
正如以上所说的,三层架构即“表现层”,“业务层”,“持久化层”。表现层实现的代表作品是Struts框架,业务层实现的代表作品是Spring,持久层实现的代表作品是Hibernate。不过在我的开发中Spring被省掉了,因为我认为业务过于简单,还不至于用Spring来实现。下面我将具体的来说说我的三层实现。
1、三种Bean
在我的实现中,总共有三种Bean,它们都是为保存对象状态而存在的。持久层中,这种Bean就是POJO对象。它是面向数据库的,或者说多少得照顾到数据库的实现,因为我习惯于用PowerDesigner来设计数据库,做出来的结构也是比较中规中矩的,而如果直接用Hibernate来实数据库的话,就不那么干净了。所以POJO对象的设计就不能完全面向对象。业务层中的Bean我把它称之为Entity,这是一个完全面向程序逻辑的Bean。它可能是好几个POJO的集合。对于业务逻辑来,这种被称之为Entity的Bean做到了“拿来就用”,很便于业务的进行。在显示层中的Bean就是FormBean了,主要用于传入数据所用。
POJO仅生存于持久化层,到了业务层就将数据交给Entity了。而Entity不仅生存于业务层,它还被传到了JSP中,用于显示。
2、Pojo与Dao
我认为这是数据与操作的关系,Dao只在呼操作,而Pojo仅用于保存数据。下面是我Dao接口的实个现。
public interface Dao {

  /
   public void resetPO(Pojo pojo) {
     this.userPo = (UserPo)pojo;
   }


 
   public String save() {
    String oid = null;
    try{
      //Session session = HibernateUtil.currentSession() 已经被提至构造函数中初始化了
      Transaction tx = session.beginTransaction();
      if (userPo.getId() == null) {
        oid = (String)session.save(userPo);//如果这是一个新的pojo则进行insert操作。
        session.flush();
        tx.commit();
      }else{
        session.update(userPo,userPo.getId());//如果该pojo已被初始化过则进行update操作
        session.flush();
        tx.commit();
      }
    }catch(HibernateException ex){
      System.out.println("//\n UserDao.save()出现异常!");
      log.error("UserDao.save()出现异常!",ex);
    }
    return oid;
  }


  public Pojo load() {
    UserPo tmp = new UserPo();
    try{
      //Session session = HibernateUtil.currentSession() 已经被提至构造函数中初始化了
      tmp = (UserPo) session.get(UserPo.class, userPo.getId()); //用确切存在的ID值获得对象
    }catch(HibernateException hbe){
      hbe.printStackTrace();
    }
    if (tmp != null) {
      userPo = tmp;
      return userPo;
    }
    else
      return null;
  }


  public List find(short by) {
    //Session session = HibernateUtil.currentSession() 已经被提至构造函数中初始化了
    Query query = null;
    String where=null;
    switch(by){
      case 0 :
        where = "";
        break;
      case 1 :
        where = " where us.name='"+userPo.getName()+"'";
        break;
      case 2 :
        where = " where us.account='"+userPo.getAccount()+"'";
        break;
      case 3 :
        where = " where us.password='"+userPo.getPassword()+"'";
        break;
      case 4 :
        where = " where us.account='"+userPo.getAccount()+"' and us.password='"+userPo.getPassword()+"'";
    }
    query = session.createQuery("from UserPo us"+where);
    return query.list();
  }

  public void close(){
    HibernateUtil.closeSession();
  }

}
其中HibernateUtil是一个Hibernate方法类,它提供线程安全的Session。和关闭这个Session的方法(虽然关闭Session过于简单)。每个Dao是由DaoFactory来产生的。DaoFactory也有一个公共的接口。如下:
public interface DaoFactory {

  Dao getDocumentDAO();
  Dao getDocHeadDAO();
  Dao getDocAccessoryDAO();
  Dao getUserDao(User u);

}
下面是一个基于Hibernate的Dao的实现。
public class HbDaoFactory implements DaoFactory {

  public HbDaoFactory() {
  }


  public Dao getDocumentDAO() {
   
    return new com.cecs.dao.DocumentDAO();
  }


  public Dao getDocHeadDAO() {
   
    throw new java.lang.UnsupportedOperationException("Method getDocHeadDAO() not yet implemented.");
  }


  public Dao getDocAccessoryDAO() {
   
    throw new java.lang.UnsupportedOperationException("Method getDocAccessoryDAO() not yet implemented.");
  }


  public Dao getUserDao(User u) {
    return new UserDao(u);
  }

}
这样一但不用Hibernate来实现持久层,也可以很方便改为其它的Dao而不用修改业务层。
4
0
分享到:
评论

相关推荐

    J2EE中MVC三层架构的实现

    在IT行业中,J2EE平台常常用于构建大型企业级应用,而MVC(Model-View-Controller)架构模式是其核心设计模式之一。MVC模式将应用程序分为三个主要部分:模型(Model)、视图(View)和控制器(Controller),旨在...

    多层J2EE系统的架构与模式设计

    **第三章 J2EE系统的架构设计** J2EE架构中的关键概念包括EJB(Enterprise JavaBeans)、Servlet、JSP(JavaServer Pages)等。MVC(Model-View-Controller)架构是Web层常见的设计,分离了用户界面、业务逻辑和...

    J2EE 三层结构讲解

    通过对J2EE三层架构的理解,我们可以更好地组织和设计复杂的企业级应用。通过将表现层、业务逻辑层和数据访问层分开,不仅可以提高代码的可维护性和可扩展性,还能更容易地应对未来的需求变化和技术演进。特别是DAO...

    多层J2EE系统的架构与模式设计.pdf

    总结,本文深入探讨了多层J2EE系统的架构设计,以及如何利用OOP原则、AOP、设计模式和反射技术来实现高效的企业级应用。通过理解这些概念和技术,开发者能够更好地设计和构建适应互联网环境的J2EE系统,以满足日益...

    J2EE程序设计和软件架构设计ppt

    **J2EE程序设计与软件架构设计** J2EE(Java 2 Platform, Enterprise Edition)是一种由Oracle公司主导的开放标准,主要用于构建企业级的分布式应用程序。它为开发者提供了多种服务,包括安全性、事务处理、数据库...

    三层架构的设计思想

    三层架构是一种常见的软件系统设计模式,主要应用于企业级应用开发中,特别是在ASP.NET等Web应用程序中非常流行。它将应用程序分为三个逻辑层:表示层(Presentation Layer)、业务逻辑层(Business Logic Layer)和...

    J2EE中MVC三层架构

    在J2EE开发中,MVC(Model-View-Controller)三层架构是一种广泛采用的设计模式,它有助于分离业务逻辑、用户界面和数据访问,从而提高代码的可维护性和可扩展性。本文主要针对初学者,讲解了如何在J2EE环境中实现...

    j2ee 五层web开发架构

    为此,本文介绍了一种改进的J2EE五层架构——通过在业务逻辑层与数据库层之间增加一个数据持久层来解决这些问题。 #### 二、J2EE五层体系结构设计 ##### 1. 客户端层 客户端层负责处理用户输入并展示结果。这一层...

    Struts开发指南之J2EE n层结构.doc

    N层架构是一种软件设计模式,它将应用程序的不同功能分布在多个逻辑层上,每一层负责特定的职责。这种分层的方法有助于提高系统的灵活性和可维护性,尤其是在大型企业级应用中。N层架构中最常见的层次包括表示层、...

    J2EE设计模式.ppt

    设计模式并非孤立存在,而是与架构设计、框架紧密相连,构成了J2EE多层系统的基石。衡量一个程序员在设计上的造诣,掌握设计模式的程度是一个重要的考量标准。 GoF设计模式,全称为Gang of Four设计模式,是一本...

    J2EE 主流架构详解与应用

    IoC容器(Inversion of Control)是一种设计模式,用于将对象的创建和依赖关系解耦。AOP(Aspect-Oriented Programming)是一种编程技术,用于实现横切关注点的分离。MVC模式是Spring架构的核心组件,用于实现业务...

    23种JAVA设计模式和15种J2EE设计模式

    ### 23种JAVA设计模式和15种J2EE设计模式详解 #### 一、JAVA设计模式概览 在软件工程领域,设计模式是一种在特定情境下解决常见问题的有效方法。Java作为一种广泛使用的编程语言,拥有丰富的设计模式库来帮助...

    软件体系架构模式在J2EE中的应用

    本文将深入探讨软件体系架构模式在J2EE(Java 2 Platform, Enterprise Edition)环境中的应用,帮助开发者理解和运用这些模式来创建高效、可扩展的企业级应用。 首先,我们了解下什么是J2EE。J2EE是Java平台的一个...

    跟我学J2EE系统构架和设计模式-层架构及MVC架构模式的应用实例.docx

    总而言之,通过深入理解和应用层架构模式和MVC架构模式,开发者能够设计出结构清晰、高内聚、低耦合的J2EE系统,从而提高代码的可重用性、可测试性和可维护性,满足快速迭代和持续集成的现代软件开发需求。...

    J2EE体系架构分析(珍藏版)

    J2EE体系结构的核心在于MVC的设计模式,它将应用程序分为模型、视图和控制器三个部分,每一部分都承担着不同的职责。通过这种方式,可以有效地分离业务逻辑、用户界面和控制逻辑,从而提高了系统的可维护性和可扩展...

    基于J2EE多层架构的Web开发框架研究

    在五层架构中,为了进一步提高系统的灵活性和可维护性,本文采用DAO(Data Access Object)设计模式来设计多源数据访问组件。通过抽象和封装对不同数据源的数据访问操作,使得系统能够统一访问不同类型、结构、环境...

    J2EE中的设计模式

    ### J2EE中的设计模式详解 #### 一、概述 J2EE(Java 2 Platform, Enterprise Edition)是一个广泛应用于企业级应用开发的标准平台。它不仅定义了一个完整的框架,还提出了许多最佳实践和设计模式来指导开发者构建...

    J2EE设计模式的简洁总结

    J2EE 设计模式是系统架构之基础,主要由架构设计、框架以及多个设计模式组成。设计模式是一种实践的总结,是 OOP 最直接的表现。掌握设计模式与否是衡量程序员设计水平高低的主要依据。 一、工厂模式 工厂模式是最...

Global site tag (gtag.js) - Google Analytics