Struts1杂谈

1   Struts框架整体  

Struts-1的核心功能是前端控制器,程序需要注的是后端控制器。前端控制器是是一个Servlet,在Web.xml配置所有 Request都必须经过前端控制器,它的名字是ActionServlet,由框架来实现和管理。所有的视图和业务逻辑隔离都是应为这个 ActionServlet,它就像一个交通警察,所有过往的车辆必须经过它的法眼,然后被送往特定的通道。所有,对它的理解就是分发器,我们也可以叫做Dispatcher,其实了解Servlet编程的人自己也可以写一个分发器,加上拦截requestFilter,其实自己实现一个struts框架并不是很困难。主要目的就是让编写视图的和后台逻辑的可以脱离紧耦合,各自同步的完成自己的工作。

那么有了ActionServlet在中间负责转发,前端的视图比如说是Jsp,只需要把所有的数据Submit,这些数据就会到达适合处理它的后端控制器Action,然后在里面进行处理,处理完毕之后转发到前台的同一个或者不同的视图Jsp中间,返回前台利用的也是Servlet里面的forward redirect两种方式。所以到目前为止,一切都只是借用了ServletAPI搭建起了一个方便的框架而已。这也是Struts最显著的特性?? 控制器。  

那么另外一个特性,可以说也是Struts-1带来的一个比较成功的理念,就是以xml配置代替硬编码配置信息。以往决定Jsp往哪个servlet提交,是要写进Jsp代码中的,也就是说一旦这个提交路径要改,我们必须改写代码再重新编译。而Struts提出来的思路是,编码的只是一个逻辑名字,它对应哪个class文件写进了xml配置文件中,这个配置文件记录着所有的映射关系,一旦需要改变路径,改变xml文件比改变代码要容易得多。这个理念可以说相当成功,以致于后来的框架都延续着这个思路,xml所起的作用也越来越大。  

大致上来说Struts当初给我们带来的新鲜感就这么多了,其他的所有特性都是基于方便的控制转发和可扩展的xml配置的基础之上来完成它们的功能的。  

下面将分别介绍ActionFormBean,这两个是Struts中最核心的两个组件。  

 

2   后端控制器Action  

Action就是我们说的后端控制器,它必须继承自一个ActionStruts设计了很多Action,例如DispatchAction DynaValidationAction。它都有一个业务逻辑的方法execute()入的request, response, formBeanactionMapping四个象,返回actionForward象。到达Action之前先会经过一个 RequestProcessor来初始化配置文件的映射系,里需要大家注意几点:

1)   了确保线程安全,在一个用的生命周期中,Struts框架只会为每Action类创建一个Action例,所有的客户请求共享同一个Action 例,并且所有线程可以同时执行它的execute()方法。所以当你继承父类Action,并添加了private成员变量的时候,请记住这个变量可以被多个线程访问,它的同步必须由程序员负责。(所有我们不推荐这样做)。在使用Action的时候,保证线程安全的重要原则是在Action类中仅仅使用局部变量,谨慎的使用实例变量。局部变量是对每个线程来说私有的,execute方法结束就被销毁,而实例变量相当于被所有线程共享。  

2)   ActionServlet例接收到Http求后,在doGet()或者doPost()方法中都会process()方法来求。 RequestProcessor包含一个HashMap,作存放所有Action例的存,Action例在存中存放的属性key Action名。在RequestProcessorprocessActionCreate()方法中,首先检查HashMap中是否存在 Action例。Action例的代位于同码块中,以保只有一个线Action例。一旦线程创建了Action实例并把它存放到 HashMap中,以后所有的线程会直接使用这个缓存中的实例。  

3)   <action>元素的<roles>属性指定访问这Action的安全角色,多个角色之逗号隔RequestProcessor预处用自身的 processRoles()方法,检查配置文件中是否Action配置了安全角色,如果有,就HttpServletRequest isUserInRole()方法来判断用是否具了必要的安全性角色,如果不具,就直接向客端返回错误(返回的视图通过<input>属性来指定)  

 

3   数据传输对象FormBean  

Struts并没有把模型层的业务对象直接传递到视图层,而是采用DTOData Transfer       Object)来传输数据,这样可以减少传输数据的冗余,提高传输效率;还有助于实现各层之间的独立,使每个层分工明确。StrutsDTO就是 ActionForm,即formBean。由于模型层应该和Web应用层保持独立。由于ActionForm类中使用了Servlet  API,因此不提倡把ActionForm传递给模型层,而应该在控制层把ActionForm Bean的数据重新组装到自定义的DTO中,再把它传递给模型层。它只有两个scope,分别是sessionrequest。(默认是session)一个ActionForm标准的生命周期是:  

1)   控制器收到       ->      

2)   requestsession中取出ActionForm例,如不存在就建一个       ->  

3)   ActionFormreset()方法       ->      

4)   例放入session或者request       ->      

5)   将用户输入表达数据组装到ActionForm       ->      

6)   如眼方法配置了就validate()方法           ->  

7)   验证错误转发给   <input>   属性指定的地方,否则调execute()方法  

 

validate()方法用必须满足两个条件:  

1)   ActionForm       配置了Action映射而且name属性匹配  

2)   <aciton>       元素的validate属性true  

如果ActionFormrequest内,那么对个新的求都会建新的ActionForm例,属性被初始化认值,那reset ()方法就得没有必要;但如果ActionFormsession内,同一个ActionForm例会被多个求共享,reset()方法在这种情况下极有用。  

 

4   验证框架和国际化  

Struts有许多自己的特性,但是基本上大家还是不太常用,说白了它们也是基于JDK中间的很多Java基础包来完成工作。例如国际化、验证框架、插件自扩展功能、与其他框架的集成、因为各大框架基本都有提供这样的特性,Struts也并不是做得最好的一个,这里也不想多说。Struts的验证框架,是通过一个validator.xml的配置文件读入验证规则,然后在validation-rules.xml里面找到验证实现通过自动为Jsp插入 javascript来实现,可以说做得相当简陋。弹出来的javascript框不但难看还很多冗余信息,笔者宁愿用formBean验证或者 ActionsaveErrors(),验证逻辑虽然要自己写,但页面隐藏/浮现的警告提示更加人性化和美观一些。  

至于Struts的国际化,其实无论哪个框架的国际化,java.util.Locale类是最重要的Java       I18N类。在Java语言中,几乎所有的对国际化和本地化的支持都依赖于这个类。如果Java类库中的某个类在运行的时候需要根据Locale对象来调整其功能,那么就称这个类是本地敏感的(Locale-Sensitive),例如java.text.DateFormat类就是,依赖于特定Locale  

创建Locale对象的时候,需要明确的指定其语言和国家的代码,语言代码遵从的是ISO-639规范,国家代码遵从ISO-3166规范,可以从  

                http://www.unicode.org/unicode/onlinedat/languages.html

                http://www.unicode.org/unicode/onlinedat/countries.html 

Struts的国化是基于propertiesmessage/key对应实现的,笔者曾写一个程序,所有Jsp面上没有任何Text文本串,全部都用的是   <bean:message>   Properties文件里面候其只要指定不同的言区域不同的Properties文件就实现了国化。需要注意的是不同语言的字符写进Properties文件的时候需要转化成Unicode码,JDK已经带有转换的功能。JDKbin中有native2ascii个命令,可以完成*.txt*.propertiesUnicode码转换

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值