跟我学软件系统数据访问层设计中所涉及J2EE核心设计模式——组合式的DTO(Transfer Object Assembler)模式
- 格式:pdf
- 大小:86.71 KB
- 文档页数:3
1.1跟我学软件系统数据访问层的模块设计中所涉及的J2EE核心设计模式——值列表处理器(Value List Handler)模式1.1.1值列表处理器模式(Value List Handler)1、应用的技术背景(1)查询操作通常涉及大型数据集许多J2EE应用程序都要求显示作为用户查询结果的数据库记录清单。
这些查询操作通常涉及到在服务器端处理大型数据集。
例如,在包含数千种产品的在线产品目录中进行的典型查找过程。
(2)如何在可伸缩性和性能方面进行合理地折中在并发客户数量增加的情况下,处理大型结果集的应用程序将面临可伸缩性和性能方面的问题。
根据用户提出来的查询条件执行查询过程时,很可能没有办法预测会有多少数据返回。
这个结果记录集可能包含庞大的数据量,这样您不能盲目的把查询结果返回客户,否则将导致意外的性能问题。
(3)使用值列表处理器模式为了管理大型数据库返回记录集,人们经常使用Value List Handler这种设计模式。
2、值列表处理器模式的工作原理(1)控制搜索、缓存查找结果J2EE Blueprint 推荐使用这种模式来控制搜索、缓存查找结果并把查找结果提供给客户。
下图显示了一个Web客户、一个值列表处理器和一组基层实体EJB之间的关系。
(2)以分页方式迭代返回在这一解决方案中,当客户需要搜索数据时,Value List Handler就被调用,它截取客户搜索请求并把结果记录集以分页方式迭代返回。
ValueListHandler提供有查询执行功能和结果缓存。
(3)ValueListHandler是一个集合类而其中的ValueListHandler是一个集合类(并且ValueListHandler总是隐藏在façade门面的后面),它包含一组表示数据库记录的Transfer Object。
在这个设计模式中,该处理程序并不返回整个结果清单,它只返回数据的一个子集。
3、值列表处理器模式中的数据源一般是作为一个有状态会话bean实现的,它要求基层的数据源获取所需的数据。
1.1跟我学J2EE 系统构架和设计模式——Java平台中的各种数据访问设计模式1、Java平台中的各种数据持久化技术大多数应用程序都需要处理数据。
Java应用程序运行时,往往把数据封装为相互连接的对象网络,但是当程序结束时,这些对象就会消失在一团逻辑中,所以需要有一些保存它们的方法。
有时候,甚至在编写应用程序之前,数据就已经存在了,所以需要有读入它们和将其表示为对象的方法。
手动编写代码来执行这些任务不仅单调乏味、易于出错,而且会占用整个应用程序的很大一部分开发工作量。
(1)JDBC大多数Java开发员都是用JDBC来和数据库进行通信,它可以通过DAO(Data Access Object)模式来进行改善和提高,然而,这种方式在大型应用程序中则会造成维护的“高消费”"。
JDBC 提供了还算不错的数据库抽象,但是需要用痛苦的API。
这些问题包括:1)需要冗长的错误处理代码来确保ResultSets,Statements以及(最重要的)Connections在使用后关闭。
这意味着对JDBC的正确使用可以快速地导致大量的代码量。
它还是一个常见的错误来源。
Connection leak可以在有负载的情况下快速宕掉应用程序。
2)SQLException相对来说不能说明任何问题。
JDBC不提供异常的层次,而是用抛出SQLException来响应所有的错误。
找出到底哪里出错了——例如,问题是死锁还是无效的SQL?——要去检查SQLState或错误代码。
这意味着这些值在数据库之间是变化的。
为了便于理解,让我们来看一段传统的JDBC代码:Connection conn =null;Statement stmt = null;try{conn = dataSource.getConnection();stmt = con.createStatement();stmt.executeUpdate("UPDATE userInfo SET age = 18 WHERE id = 'erica'"); }catch(SQLException e){}finally{if (stmt != null){try{stmt.close();}catch (SQLException ex){logger.warn("Exception in closing JDBC Statement", ex);}}if (conn != null){try{conn.close();}catch (SQLException ex){logger.warn("Exception in closing JDBC Connection", ex);}}}类似上面的代码非常常见。
1.1跟我学软件系统数据访问层的模块设计中所涉及的J2EE核心设计模式——数据访问对象(data access object,DAO)模式1.1.1数据访问对象(data access object,DAO)模式1、DAO模式(1)DAO模式简介将对数据源的访问(也就是获得数据库的连接)抽象为一个类,从而利用数据访问对象可以实现对不同数据库类型和形式的数据资源进行访问。
(2)应用的技术背景1)这种模式出现的背景在于数据访问的逻辑极大程度上取决于数据存储的格式2)比如说关系型数据库、面向对象数据库、磁盘文件等。
2、为什么要使用DAO模式1)目前大部分的J2EE应用程序都需要在一定程度上使用可持久性的数据,而实现持久性数据的方法因应用程序不同而异,并且访问不同存储格式数据的应用程序接口(API)也有着显著的差别;2)有的时候,应用程序还会访问存储在不同操作平台上的数据,这使得问题更为复杂3)在Java语句中可以嵌入SQL语句,用以访问关系型数据库,当然根据数据库类型的不同,SQL语句的词法和语法也会有所不同;4)需要说明的是,当数据存储格式不同的时候,数据访问逻辑的区别就更加明显了,例如关系型数据库、面向对象数据库和磁盘文件,各自数据的访问逻辑各有千秋,这样一来就造成了程序代码和数据访问代码之间的依赖关系3、DAO模式的类图和序列图(1)类图(2)序列图对上面的各个对象的说明1)业务对象(Business Object)。
表示数据的用户,它需要对于数据的访问,一个业务对象可以用会话bean、实体bean或是其他Java程序来实现。
2)数据访问对象(Data Access Object)。
数据访问对象是这种模式中的主题,它提供了底层数据访问的对象,并将其提供给业务对象以使得后者能够透明地访问数据源;同时业务对象也将数据的加载和存储操作移交给数据访问对象处理。
3)数据源(Data source)。
这里指的是数据源的物理实现,这个数据源可以是一个数据库,包括关系型数据库、面向对象数据库或文件系统。
1.1跟我学软件系统数据访问层的模块设计中所涉及的J2EE核心设计模式——值对象(Value Object)模式在本单元中希望重点了解和掌握如下的数据访问层设计模式的具体应用:值对象的JavaBean组件,传输对象模式(DTO),组合式DTO模式,DAO设计模式,工厂模式,抽象工厂模式,快速道读取器模式。
1.1.1值对象(Value Object)模式1、各种值对象的JavaBean组件(复合实体,值对象组装器,值列表处理器)(1)各种“值Bean”以实现对数据库各个表中的数据进行封装从而为J2EE中的各个层进行数据传递提供快捷的解决方案同时也为了提高接口的粗粒度。
同时值Bean实际上也是用于存储中间数据模型的视图帮助类(View Helper)的另一种叫法。
(2)值对象是任意的可串行化的Java对象它在一次网络传输中包含和封装了大量的数据并被保存在内存中。
这样,当客户端需要再次使用数据的时候,不用再次到数据库中查询,而是直接在内存中读取值对象,节省了大量的时间和系统开销。
2、为什么要提供各种值对象的JavaBean组件我们知道EJB 的调用使用了远程方法,它的效率一般要远低于本地方法的调用,这样我们要读取一个对象,如果使用他的getXX 方法就多次调用了远程,效率很低,如果一次性读到值对象,这就减少了远程调用。
我们在实际开发中,一般为每个EntityBean 建一个值对象,并且在EntityBean 中的Home 接口中,增加一个create 方法,参数就是与该EntityBean相对应的值对象;并且在Remote接口中增加setValueObjectData 和getValueObjectData 方法,实现对该值对象操作。
3、本示例项目所涉及的各个“值Bean”为项目中的每个EntityBean 建立值对象,在本项目中主要设计出如下的各个值Bean1)封装用户信息的UserInfoData类2)封装图书作者个人信息的BookAuthorInfoData类3)封装图书信息的BookInfoData类4)封装用户的存款信息的EBankChecker类。
10.1 什么是DTO在分布式系统中,客户端和服务器端交互有两种情形:第一个是客户端从服务器端读取数据;第二个是客户端将本身的数据传递给服务器端。
当有客户端要向服务器端传输大量数据的时候,可以通过一个包含要传输的所有数据的方法调用来完成。
这在小数据量的时候缺点并不明显,但是如果要传递包含有大量信息的数据的时候,这将变得难以忍受。
下面的方法是任何人看了都会害怕的:public void save(String id,String number,String name,int type,int height,int width,BigDecimal weight,BigDecimal price,String description)这种接口也是非常的脆弱,一旦需要添加或者删除某个属性,方法的签名就要改变。
当客户端要从服务器端取得大量数据的时候,可以使用多个细粒度的对服务器端的调用来获取数据。
比如:ISomeInterface intf = RemoteService.getSomeInterface();System.out.println("您要查询的商品的资料为:");System.out.println("编号:"+intf.getNumber(id));System.out.println("姓名:"+intf.getName(id));System.out.println("类型:"+intf.getType(id));System.out.println("高度:"+intf.getHeight(id));System.out.println("宽度:"+intf.getWidth(id));System.out.println("价格:"+intf.getPrice(id));System.out.println("描述信息:"+intf.getDescription(id));这种方式中每一个get***方法都是一个对服务器的远程调用,都需要对参数和返回值进行序列化和反序列化,而且服务器进行这些调用的时候还需要进行事务、权限、日志的处理,这会造成性能的大幅下降。
dto概念-回复DTO(Data Transfer Object)概念DTO(Data Transfer Object)是一种软件设计模式,用于数据传输和通信的目的。
它是将数据从一个层传送到另一个层的方式,以便于在不同的层之间传输和使用。
在一个典型的应用程序中,数据通常会在多个层之间传递,例如前端界面、业务逻辑层、数据访问层等。
这些层之间往往需要进行数据的传输和交互,而DTO就是为了解决这一问题而应运而生的。
一、DTO的概念和作用在传统的三层架构中,通常会有数据实体对象、业务逻辑对象和数据访问对象等不同的对象。
而这些对象之间往往需要进行数据的传输和交互,但是它们的字段和结构往往会有所不同。
为了在不同的层之间传输数据时能够保持一致性和高效性,需要使用DTO来进行数据的转换和传输。
DTO可以理解为一种封装了数据的对象,它只包含数据字段以及相应的访问方法,而不包含任何业务逻辑。
其主要作用有以下几点:1. 数据传输:DTO用于在不同的层之间传输数据,使得各个层之间的数据结构保持一致,避免数据传输过程中的冗余和不必要的转换。
2. 数据隔离:DTO可以帮助将数据的表现形式与实际的数据实体解耦,从而实现数据的隔离和保护。
3. 接口规范:DTO可以作为不同层之间的数据交互的接口规范,使得每个层都可以根据DTO定义的接口来进行数据传输和交互。
二、DTO的设计和实现在设计和实现DTO时,需要考虑以下几点:1. 数据字段:DTO应该包含需要传输的数据字段,并且根据业务需求进行适当的选择和精简,避免冗余和不必要的字段。
2. 数据转换:DTO需要定义数据的传输方式和接口规范,这涉及到数据的序列化和反序列化、数据类型的转换等工作。
在转换过程中,可能会使用到工具类或者第三方库来进行处理。
3. 可拓展性:DTO应该具有可拓展性,以便于应对未来的业务需求和变化。
在设计DTO时,需要考虑到可能的业务变化和需求变更,以保持代码的可维护性和可扩展性。
1.1跟我学J2EE 系统构架和设计模式——软件系统详细设计阶段中的“对象职责分配模式(GRASP)”(第1部分)详细设计阶段包括:模块设计、数据库设计和界面设计。
下面,仅就详细设计中的模块设计部分,讨论与模块设计工作中相关的设计模式应用的有关问题。
在面向对象的方法中,详细设计阶段的一个十分重要的问题,是进行类设计。
类设计直接对应于实现设计,它的设计质量直接影响着软件的质量,所以这个阶段是十分重要的。
这就给我们提出了一个问题,类是如何确定的,如何合理的规划类,这就要给我们提出一些原则,或者是一些模式。
1.1.1模块设计与设计模式的应用1、系统在设计和开发时就应该考虑以后可能的变化(1)用户需求在客观上是不断地变化的在模块设计阶段,最关键的问题是,用户需求是变化的,我们的设计如何“拥抱变化”和“适应变化”呢?(2)需求分析并不能解决一切问题我们经常听到人们在抱怨,一个项目已经通过了交付测试,担投运以后用户又提出了新的需求,这时就面临这样一个问题,修改一段代码就会需要几百个相关代码跟着改变,因此升级就变成几乎不可能的事情,于是,开发者抱怨说,用户为什么当初不提出这些新的需求呢?而用户抱怨说,随着时代的变化当初怎么可能预料到现在的需求呢?最后的结果,恐怕只能是一个,那就是这个系统被弃之不用!其实,这个巨大的损失错在开发者,但却不恰当的由用户来承担了。
(3)比较困惑的事情1)如果我们试图发现事情怎样变化,那我们将永远停留在分析阶段。
2)如果我们编写的软件能面向未来,那将永远处在设计阶段。
因为,我们的时间和预算不允许我们面向未来设计软件。
过分的分析和过分的设计,事实上被称之为“分析瘫痪”。
2、我们如何“拥抱变化”和“适应变化”(1)应该遵守的几个原则1)针对接口编程而不是针对实现编程。
2)优先使用对象组合,而不是类的继承。
3)考虑我们的设计哪些是可变的,注意,不是考虑什么会迫使我们的设计改变,而是考虑要素变化的时候,不会引起重新设计。
1.1J2EE软件系统项目模块设计中所涉及的设计模式1、模式分为三个层次:架构模式,模块设计模式和模块实现模式(1)架构模式是模式中的最高层次,描述软件系统里的基本的结构组织或纲要,通常提供一组事先定义好的子系统,指一它们的责任,并给出把它们组织在一起的法则和指南。
(2)模块设计模式用来处理程序设计中反复出现的问题。
如GOF提出的23个基本设计模式(3)模块实现模式是最低也是最具体的层次,处理具体到与编程语言相关的问题。
2、模块设计模式(1)合理地使用设计模式真正掌握设计模式需要在实践中不断研究和使用,创建模式的人是大师,但是拘泥于模式的人永远是工匠。
在EJB的具体使用中,使用合适的设计模式,不但使代码可重用性可拓展性增强,最重要的是能提高效率和速度,我们知道EJB框架由于考虑大型系统中事务安全等各方面问题,效率性能有所欠缺,那么我们在具体问题具体应用时,使用设计模式可以弥补这个问题。
(2)设计模式是思想GoF的设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧,让你能够真正掌握接口或抽象类的应用,从而在原来的Java 语言基础上跃进一步,更重要的是,GoF的设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。
3、GOF的23种设计模式中比较常用的部分模式说明(1)创建型的模式1)设计模式之Factory(工厂方法和抽象工厂):使用工厂模式就象使用new 一样频繁.2)设计模式之Prototype(原型):用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
3)设计模式之Builder:汽车由车轮方向盘发动机很多部件组成,同时,将这些部件组装成汽车也是一件复杂的工作,Builder 模式就是将这两种情况分开进行。
4)设计模式之Singleton(单态):保证一个类只有一个实例,并提供一个访问它的全局访问点(2)结构型的模式1)设计模式之Façade:可扩展的使用JDBC 针对不同的数据库编程,Facade 提供了一种灵活的实现。
java中PO、VO、BO、POJO、DAO、DTO、TO、QO、Bean、conn的理解O/R Mapping 是 Object RelationalMapping (对象关系映射)的缩写。
通俗点讲,就是将对象与关系数据库绑定,⽤对象来表⽰关系数据。
在 O/RMapping 的世界⾥,有两个基本的也是重要的东东需要了解,即 VO , PO 。
VO ,值对象 (Value Object) ,PO ,持久对象 (PersisentObject) ,它们是由⼀组属性和属性的 get 和 set ⽅法组成。
从结构上看,它们并没有什么不同的地⽅。
但从其意义和本质上来看是完全不同的。
1. VO 是⽤ new 关键字创建,由 GC 回收的。
PO 则是向数据库中添加新数据时创建,删除数据库中数据时削除的。
并且它只能存活在⼀个数据库连接中,断开连接即被销毁。
2. VO 是值对象,精确点讲它是业务对象,是存活在业务层的,是业务逻辑使⽤的,它存活的⽬的就是为数据提供⼀个⽣存的地⽅。
PO 则是有状态的,每个属性代表其当前的状态。
它是物理数据的对象表⽰。
使⽤它,可以使我们的程序与物理数据解耦,并且可以简化对象数据与物理数据之间的转换。
3. VO 的属性是根据当前业务的不同⽽不同的,也就是说,它的每⼀个属性都⼀⼀对应当前业务逻辑所需要的数据的名称。
PO 的属性是跟数据库表的字段⼀⼀对应的。
PO 对象需要实现序列化接⼝。
java 的 (PO,VO,TO,BO,DAO,POJO) 解释PO(persistant object) 持久对象在 o/r 映射的时候出现的概念,如果没有 o/r 映射,没有这个概念存在了。
通常对应数据模型 ( 数据库 ), 本⾝还有部分业务逻辑的处理。
可以看成是与数据库中的表相映射的 java 对象。
最简单的 PO 就是对应数据库中某个表中的⼀条记录,多个记录可以⽤ PO 的集合。
PO 中应该不包含任何对数据库的操作。
SpringBoot框架中各层(DTO、DAO、Service、Controller)理解粗略理解View层 Controller层(响应⽤户请求) Service层(接⼝ 接⼝实现类) DAO层,即Mapper层(抽象类:xxxMapper.java⽂件,具体实现在xxxMapper.xml) Model层(实体类:xxx.java)图解VO、DTO、DO、PO理解解释VO:View Object,视图层,其作⽤是将指定页⾯的展⽰数据封装起来。
DTO:Data Transfer Object,数据传输对象DO:Domain Object,领域对象PO:Persistent Object,持久化对象模型⽤户发出请求(填写表单),表单的数据被展⽰层匹配为VO展⽰层把VO转换为服务层对应⽅法所要求的DTO,提交给服务层服务层先将DTO的数据构造(或重建)⼀个DO,调⽤DO的业务⽅法完成具体业务服务层再将DO转换为持久层对应的PO,调⽤持久层的持久化⽅法,把PO传递持久化⽅法,完成持久化操作PO、VO、BO、DTO、DO、POJO、JavaBean、JavaBeansPO:持久对象 (persistent object),po(persistent object)就是在Object/Relation Mapping框架中的Entity,po的每个属性基本上都对应数据库表⾥⾯的某个字段。
完全是⼀个符合Java Bean规范的纯Java对象,没有增加别的属性和⽅法。
持久对象是由insert数据库创建,由数据库delete删除的。
基本上持久对象⽣命周期和数据库密切相关。
VO:表现层对象(View Object),主要对应展⽰界⾯显⽰的数据对象,⽤⼀个VO对象来封装整个界⾯展⽰所需要的对象数据,数据脱敏,去掉⽤户隐私数据。
BO:业务对象层的缩写(Business Object),封装业务逻辑的java对象,通过调⽤DAO⽅法,结合PO,VO进⾏业务操作。
1.1跟我学软件系统数据访问层的模块设计中所涉及的J2EE核心设计模式——传输对象(Data Transfer Object)模式1.1.1传输对象(Data Transfer Object,DTO)模式1、DTO模式通过减少分布式通信的消息而提高数据交换的效率,通常这里所指的通信是在Web层和EJB层之间。
在一个远程调用中,一个单一值对象可以被用来取出一系列相关数据并提供给客户。
2、产生的技术背景(1)由于需要多次进行数据访问这种设计模式的出现是基于客户需要与EJB大量地交换数据的情况。
具体来说,在J2EE 平台中,应用系统通常将服务器端的程序组件实现为会话bean和实体bean,而这些组件的部分方法则需要将数据返回给客户;这种情况下,通常一个用户会重复调用相关方法多次,直到它得到相关信息,应该注意的是,多数情况这些方法调用的目的都是为了取得单一的信息,例如用户名或者用户地址等。
(2)调用基本上都是来自远程在J2EE平台上,这种调用基本上都是来自远程的。
也就是说,用户多次调用相应的方法会给Web带来极大的负担,即使用户和EJB容器加载相同的JVM、OS和计算机上运行EJB程序,由于方法调用被缺省地认为是远程任务,所以这种问题依然存在。
由于以上所提到的问题,在远程方法的调用次数增加的时候,相关的应用程序性能将会有很大的下降,因此利用多次方法调用而取得单一的信息是非常低效的。
3、工作原理当EJB使用传输对象的时候,用户可以通过仅仅一次方法调用来取得整个对象,而不是使用多次方法调用以得到对象中每个域的数值;由于传输对象是通过值传递而交送给用户的,所以所有对于该传输对象的调用或取值都是本地调用,而不是远程方法调用。
4、程序结构的要求1)不过需要注意的是,这个传输对象必须具有对应于每个属性的访问方法,或者将所有属性都设为公共的(从而无需为它们提供相关的访问方法)。
2)当然如果存在一定安全的需要,相关的成员变量也可以设为保护或私有,并且给定各自的访问方法。
java中dto的用法-回复Java中DTO的用法DTO(Data Transfer Object)是一种在Java应用程序中常用的设计模式,它用于在不同层之间传输数据。
DTO主要用于封装从数据库或其他外部数据源获得的数据,然后传输给应用程序的其他部分。
在本文中,我将一步一步地回答关于Java中DTO的用法的问题。
一、什么是DTO?DTO是一个简单的Java类,它用于封装从数据库或其他外部数据源检索到的数据。
它通常与实体类相似,但它们的目的和使用方式不同。
DTO的目的是将数据从一个对象(例如实体类)传输到另一个对象(例如服务层或表示层),而不关心数据的具体结构。
DTO类通常只包含字段和对应的getter和setter方法,以便其他组件可以轻松地获取和设置数据。
DTO类中的字段的名称和类型应与从数据源检索到的数据的名称和类型相对应,以确保数据的正确传输。
二、为什么要使用DTO?使用DTO有以下几个原因:1. 数据传输:DTO用于在应用程序的不同层之间传输数据,如从持久层到服务层或从服务层到表示层。
2. 数据转换:DTO可以用于将不同数据源中的数据转换为应用程序所需的格式。
例如,将数据库中的数据转换为前端页面所需的数据格式。
3. 数据筛选:DTO可以用于从数据源中筛选所需的字段或属性,并排除不必要的数据。
这样可以提高应用程序的性能和效率。
4. 接口统一:DTO可以用于封装与外部系统的交互,确保接口的统一性。
5. 安全性:DTO可以用于隐藏实体类中的敏感数据,确保数据的安全性。
三、如何使用DTO?使用DTO的步骤如下:1. 创建DTO类:首先,需要创建一个DTO类来封装数据。
DTO类应具有与数据源中的数据相对应的字段和getter/setter方法。
javapublic class UserDTO {private String username;private String email;Getter and Setter methods}2. 在服务层中使用DTO:在服务层中,可以使用DTO来从数据源(如数据库)获取数据,并将数据传输给表示层或其他组件。
1.1跟我学软件系统表示层的模块设计中所涉及的J2EE核心设计模式——服务/工人模式1.1.1服务/工人(Service to Worker)设计模式1、“服务/工人”设计模式它是由Dispatcher组件与Front Controller和View Helper模式组合而成的一种设计模式,先进行请求处理再进行视图处理,适合用于大型应用。
而其中的“Service”是指Dispatcher组件,而其中的“Worker”是指View Helper 组件。
2、类图和序列图(1)服务/工人模式的类图(2)服务/工人模式的序列图3、“服务/工人”设计模式中的Dispatcher组件(派遣器)在Service-to-Worker模式中控制器、派遣器的功能很大,除了要处理客户请求,视图跳转,派遣器还要从业务层读取数据,视图则主要负责数据的显示,从而简化视图(View)的设计。
4、实现的代码示例public class Controller extends HttpServlet{protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, java.io.IOException {//处理HTTP中的Get和Post的请求String next;try{// 利用View Helper组件收集参数和其它的信息RequestHelper helper = new RequestHelper(request, response);// 获得命令并利用command模式中的组件完成命令的处理和执行Command command = helper.getCommand();next = command.execute(helper);}catch (Exception e){}dispatch(request, response, next); //分发请求}protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, java.io.IOException{processRequest(request, response);}protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, java.io.IOException {processRequest(request, response);}protected void dispatch(HttpServletRequest request, HttpServletResponse response,String page) throws javax.servlet.ServletException, java.io.IOException { RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(page);dispatcher.forward(request, response);}}5、Dispatcher View与Service-to-Worker的对比由于Dispatcher View与Service-to-Worker有很多的相似之处,下面做一下比较与说明。
1.1跟我学软件系统表示层的模块设计中所涉及的J2EE核心设计模式——前端控制器模式1.1.1前端控制器模式1、前端控制器模式(1)对所有的请求进行统一处理这个模式中,所有的请求都被传送到一个对象中。
这个主要的对象将处理所有的请求,决定其后的业务控制器组件。
(2)集中管理请求对于把视图显示以及其他功能实现集中到一个主要的对象中,将使修改变得很容易,对应用的修改,可以在所有视图中反映出来2、为什么要采用前控制器(1)集中式控制模块它的出现主要是由于表示层通常需要控制和协调来自不同用户的多个请求,而这种控制机制又根据不同的需要,可能会集中式控制或分散式控制。
换句话说,就是应用系统需要对于表示层的请求提供一个集中式控制模块,以提供各种系统服务,包括内容提取、视图管理和浏览。
(2)为什么要提供集中式控制模块如果系统中没有这种集中式控制模块或控制机制,每个不同的系统服务都需要进行单独的视图处理,这样代码的重复性就会提高,致使系统开发代价提高;同时,如果没有一个固定模块管理视图之间的浏览机制,致使其浏览功能下放于每个不同的视图中,最终必将使得系统的可维护性受到破坏;(3)Struts中的实现Struts中的ActionServlet即为前控制器组件。
3、前控制器模式和截取过滤器的不同(1)过滤器由于在实际项目开发中一般都会有多个截取过滤器以实现不同的应用请求的过滤处理,从而形成一个链。
但这样阶梯的处理容易造成低效率,因为判断链的方式需要花费时间。
(2)前控制器而前控制器一般为Servlet程序,前端控制器模式的应用环境可以是分布式的处理环境,多个控制器分布式地来处理不同的控制要求。
这种分布式控制机制是由WEB的配置文件web.xml来实现的。
当有客户端请求时,容器都要读取web.xml配置文件中的<url-pattern>以便判断用户对资源的访问权限,并对某些类型的用户分发到对应的控制器来处理;4、全局和局部前控制器模式虽然前控制器模式推荐对于全部的请求使用统一处理(Struts中的ActionServlet则采用全局前控制器模式),但是它也没有限制在一个系统中只能具有一个控制器,在系统中的每个层次都可以具有多个控制器,并且映射至不同的系统服务。