一、Struts的理解
1.struts是一个按MVC模式设计的web层框架,其实它就是一个大的Servlet:ActionServlet,或者是ActionServlet的子类。在web.xml文件中配置过滤器来让符合条件的请求交给这个ActionServlet来处理,比如以action为后缀的url请求等。Servlet再参照配置文件(一般为/WEB/INF/struts-config.xml【这个文件可以按照模块进行配置,解决配置文件过度膨胀的问题】)将这个请求分别分配给不同的action去处理。
2.ActionServlet把请求交给action去处理之前,会将请求参数封装成一个formbean对象(这个类中的每个属性对应一个请求参数),封装成一个什么样的formbean?OGNL类型转换:由于java是一个强类型的语言,所以对于http的请求字符串需要进行类型转换?
3.ActionServlet把formbean对象传递给action的execute方法之前,可能会调用formbean的validate方法进行校验,只有通过校验通过之后,才将这个formbean对象传递给action的execute方法,否则直接返回一个错误页面,这个错误页面由input属性指定。输入校验机制:校验规则文件(XXXAction-validation.xml例如RegistAction-validation P308)中规定用户输入数据的合法性。多用正则表达是进行配置。客户端校验?服务器端校验?
4.action执行完之后要返回显示的结果视图(逻辑视图),这个结果视图使用一个ActiongForword对象来表示的,actionforword对象通过struts-congfig.xml配置文件中配置关联到对应的jsp页面(物理视图),因为程序中使用的是在struts-congfig.xml配置文件为jsp页面设置的逻辑名,这样可以实现actiong程序代码和返回的jsp页面名称解耦。
二、struts优缺点
1.优点
①实现MVC模式,结构清晰,使开发者只关注业务逻辑的实现
②有丰富的tag可以用,Struts的标记库(Taglib),提高开发效率
③页面导航
使系统的脉络更加清晰。通过配置一个文件,即可把我整个系统各部分之间的联系,这样对于后期的维护有着很大帮助。
④提供Exception处理机制
⑤数据库连接池管理
⑥支持I18N
2.缺点
①转到展示层时,需要配置forward,如果有是十个展示层的jsp,需要配置十次struts,而且还不包括有时候目录、文件变更,需要重新改修改forward,每次修改配置之后需要重新部署整个项目,而tomcate这样的服务器还必须重新启动服务器。
②Struts的Action必须是thread-safe方式,它仅仅允许一个实例去处理所有的请求,所以action用到的所有的资源都必须统一同步,这个引起了线程安全的问题。
③测试不方便Struts的每个Action都和WEb层耦合在一起,这样他的测试依赖于web容器,单元测也很难实现。单元测试也很难实现。不过一个Junit的扩展工具Struts TestCase可以实现单元测试。
④类型的转换。Struts的formbean把所有的数据都作为String类型,他可以使用工具Commons-Beanutils进行类型转换,但是他的转化都是在class级别,而且转化的类型是不可配置的。类型转化时的错误信息返回给用户也是非常困难的。
⑤对Servlet的依赖性过强,Struts处理Action时必须依赖ServletRequest和ServletREsponse,摆脱不了servlet容器。
⑥前端表达式语言方面Struts继承了JSTL,所以它主要使用JSTL的表达式语言来获得数据。可是JFTL的表达式语言在集合和索引属性方面处理的很弱。
⑦对Action执行的控制困难,Struts创建了一Action,如果想控制它的执行顺序将会非常困难。甚至要去重写Servlet来实现这个功能。
⑧对Actiong执行前后的处理,Struts处理Action的时候是基于class的hierarchies,很难再action处理前后进行操作。
⑨对事件支持不够,在struts中,实际一个表单Form对应一个Action类(DispatchAction),换句话说:在Struts中实际是一个表单只能对应一个事件,struts这种事件方式称为application event,application event和component event相比是一种粗粒度的事件。
三、struts1和struts2的区别
①都是MVC的WEB框架
②struts1在用户上面多于struts2(很早以前吧)
③Struts1的前端控制器是一个Servlet,名称为ActionServlet,Struts2的前端控制器是一个filter,在struts2.0中叫FilterDispatcher,在Struts2.1中叫StrutsPrepareAndExecteFilter。
④struts1的action需要继承Actiong类,、Struts2的action可以不继承任何类;struts1对同一个路径的所有请求共享一个Action实例,Struts2对一个路径的每个请求分别使用一个独立的ACtion实例,所以对于struts2的Action不用考虑线程安全的问题(对用户的每一次请求都会产生一个action )。
⑤strts1中使用formbean封装请求参数,在struts2中直接使用action的属性来封装请求参数。
⑥struts1中的多个业务方法放在一个Action中时(继承DispatchAction),要么都校验,要么都不校验;对于struts2,可以指定支队某个方法进行校验,当一个Action继承了ActionSupport且在这个类中只编写了validateXxx()方法,那么只对Xxx()方法进行校验。
⑦ Struts2的视图地址是可以动态的。