JBuilder 2005 Struts深度体验之概述
副标题#e#
Struts是基于Model 2实现的技能框架,Model 2是经典的MVC(Model,View,Control)模子的Web应用变体,这个改变主要由于HTTP协议的无状态性引起的。Model 2的目标和MVC一样,也是操作节制器来疏散模子和视图,到达差异层间松散耦合的结果,提高系统机动性、复用性和可维护性。在大都环境下,你可以将Model 2与MVC等同起来。
图 1暗示一个基于Java技能典范的MVC网络应用,从中可以看出MVC中的各个部门对应于J2EE哪些实现技能。
图 1 MVC和J2EE技能
在操作Model 2之前,我们把所有的暗示逻辑和业务逻辑都会合在一起(如我们前两个专题中的login.jsp),有时也称这种应用模式为Model 1,Model 1的主要缺点就是紧耦合,复用性差,维护本钱高。
由于Struts就是基于Model2实现的框架,所以它底层的机制也是MVC,我们通过图 2描写Struts的详细实现:
图 2 Struts MVC实现
1.框架初始化
Struts框架总节制器(ActionServlet)完成所有初始化事情。总节制器是一个Servlet,它通过web.xml设置成自动启动的Servlet,读取设置文件(struts-config.xml)的设置信息,为差异的Struts模块初始化相应的ModuleConfig工具。设置文件中的Action映射界说都生存在ActionConfig荟萃中,设置文件中其他设置信息别离生存在ControlConfig荟萃、FormBeanConfig荟萃、ForwardConfig荟萃和MessageResourcesConfig等荟萃中。
要出格指出的是,初始化行动在Web容器启动时自动完成,初始化完成后,它将通过URL匹配映射截获所有以.do末了的URL请求。
2.客户端发送一个HTTP请求
用户通过提交表单或挪用URL向Web应用措施器提交一个请求,请求的数据用HTTP协议上传给Web处事器。
3.总节制器接截获这个请求并实例化Form Bean
节制器吸收HTTP请求,并从ActionConfig中找出对应该请求的Action子类,假如没有对应的Action,节制器直接将请求转发给JSP可能静态页面。假如有对应的Action且这个Action有一个相应的Action Form,ActionForm被实例化并用HTTP请求的数据填充其属性,然后生存在Servlet Context中(request或session中),这样它们就可以被其它Action工具可能JSP挪用。
另外,还可以在ActionForm填凑数据后还可以挪用validate()举办数据有效性自检,而且可以返回一个包括所有错误信息的ActionErrors工具,假如ActionErrors不空,总节制器直接将请求返回到进口页面。
4.节制器将请求转交给详细的Action处理惩罚
节制器按照设置信息将请求切换到详细的Action,这个Form Bean也一并传给这个Action的execute()要领。
5.Action完成详细的业务逻辑操纵
Action很简朴,一般只包括一个execute要领,它认真执行相应的业务逻辑,假如需要,它也大概举办相应的数据查抄。执行完成之后,返回一个ActionForward工具,节制器通过该ActionForward工具来举办转发事情。
6.Action返回方针响应工具给总节制器
Action按照业务处理惩罚的差异功效返回一个方针响应工具给总节制器,这个方针响应工具对应一个详细的JSP页面或别的一个Action。
7.总节制器将HTTP请求转换到方针响应工具中。
总节制器按照业务成果Action返回的方针响应工具,将HTTP请求转换到这个方针响应工具中,一般环境下,它是一个详细的JSP页面。
#p#副标题#e#
8.方针响应工具将功效揭示给用户
方针响应工具(JSP)将功效页面揭示给用户。
客户端发送一个HTTP请求,通过Struts框架最后得到一个HTTP响应,这一进程很是重要,它是领略Struts框架的重点。图 2描写了Struts框架的布局,而图 3通过一个勾当图更详细描写接管请求直至返反响应的整个进程:
图 3 Struts接管并返反响应的中间进程
Struts1.1新增成果
1、多模块的支持
我们知道,在Struts 1.0中,只能在web.xml中为ActionServlet指定一个Struts设置文件(struts-config.xml),这对一个只需一两小我私家开拓的小系统虽然没有任何问题,但假如一个多人开拓的大中型应用措施,问题就发生了。因为很多开拓人员大概同时都需要修改Struts设置文件,这样必定会造成必然水平的资源争夺,大概会呈现互相包围的环境,这样势必会影响开拓效率并引起开拓人员的诉苦。
在Struts 1.1中,为了办理这个并行开拓的问题,提出了两种办理方案:
·多个设置文件
支持多个设置文件,是指你可以或许为ActionServlet同时指定多个xml设置文件,文件之间以逗号脱离,请看下面web.xml中关于多个struts设置文件的声昭示例:
代码清单 1 多个struts设置文件
#p#分页标题#e#
1. <servlet>
2. <servlet-name>action</servlet-name>
3. <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
4. <init-param>
5. <param-name>config</param-name>
6. <param-value>
7. /WEB-INF/struts-config.xml, /WEB-INF/book-struts-config.xml
8. </param-value>
9. </init-param>
10. <load-on-startup>1</load-on-startup>
11. </servlet>
通过这种要领,你可觉得每一个模块界说一个设置文件,由于项目一般按模块分别事情,这样就大大地减小了斗嘴的概率。
·独立的模块
可是,多个设置文件存在一个潜在的问题:差异的设置文件之间会发生斗嘴,因为在ActionServlet初始化的时候多个设置文件照旧要归并到一起。好比,在struts-config.xml中设置了一个名为errorDbAccess的<exception>,而在book-struts-config.xml中也设置了一个同样的<exception>,这样就发生斗嘴了。
为了彻底办理这种斗嘴,Struts 1.1中引进了模块(Module)的观念。一个模块就是一个独立的子系统,对应一个独立的设置文件,ActionServlet将差异模块的设置文件生存在各自独立的ModuleConfig工具中的。
下面是两个独立模块的设置方法:
代码清单 2 多模块设置方法
1. …
2. <init-param>
3. <param-name>config</param-name>
4. <param-value>/WEB-INF/struts-config.xml</param-value>
5. </init-param>
6. <init-param>
7. <param-name>config/book</param-name>
8. <param-value>/WEB-INF/book-struts-config.xml</param-value>
9. </init-param>
10. …
通过这种方法,我们设置了两个模块,一个模块名为config,而另一个名为config/book。
·动态ActionForm支持
ActionForm暗示HTTP页面表单的数据,可以将其当作视图页面数据的处事器映射,它认真生存视图中的数据供节制器可能其他视图利用。另外,它还认真数据有效性的验证,所以Struts 1.1文档把它比作HTTP和Action之间的防火墙,这足以浮现ActionForm在视图和节制器之间的过滤器浸染。
由于ActionForm对应于HTTP页面表单,所以跟着页面的增多,你的ActionForm将会急聚增加。动态ActionForm(DynaActionForm)即为淘汰ActionForm的数目被设计出来,操作它你不必建设一个个详细的ActionForm类,只需要在设置文件中设置出所需的虚拟ActionForm,而由Struts框架通过设置文件动态建设这个ActionForm。譬喻,代码清单 3通过指定<form-bean>的type为"org.apache.struts.action.DynaActionForm"来建设一个动态的ActionForm–loginForm。
代码清单 3 设置一个动态ActionForm
1. <form-beans>
2. <form-bean name="bookForm" type="org.apache.struts.action.DynaActionForm">
3. <form-property name="bookId" type="java.lang.String"/>
4. <form-property name="isbn" type="java.lang.String"/>
5. <form-property name="bookName" type="java.lang.String"/>
6. <form-property name="author" type="java.lang.String"/>
7. </form-bean>
8. </form-beans>
DynaActionForm将属性生存在一个Map工具中,同时提供相应的get(name)和set(name,value)要领,个中参数name是要会见的属性名,而value是一个Object。譬喻要会见DynaActionForm中bookName的值,可以回收String bookName = (String)get("bookName")要领,由于bookName存储在Map中,所以要举办强制转换。
由于DynaActionForm通过设置文件发生,并没有一个实体工具类,假如要对动态ActionForm工具举办校验需要利用DynaValidatorForm,它是DynaActionForm的子类,它可以或许提供动态ActionForm和动态表单输入验证的成果。检讨法则在validation.xml设置文件中界说,而这些法则的所对应的实现函数在validator-rules.xml文件中界说。
·通过设置方法实现异常处理惩罚
Struts1.1答允以设置方法举办异常处理惩罚,设置方法可以制止在Action中通过硬编码来处理惩罚异常,从而提高应用措施异常处理惩罚的机动性和可维护性。一般环境下,一个异常处理惩罚工具可以通过以下步调实现: