`

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文件的候需要化成UnicodeJDK经带转换的功能。JDKbin中有native2ascii个命令,可以完成*.txt*.propertiesUnicode码转换

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics