[关闭]
@HUST-SuWB 2016-03-25T07:20:06.000000Z 字数 2753 阅读 463

Struts2实战总结

项目实战


Struts2的MVC模型

Struts2,一个成熟的MVC框架,被广泛应用于Java的Web开发中,主要起action跳转的作用,当然,除此之外还有很多重要的功能,这些大都由Struts2提供的拦截器实现。我们首先来看一下Struts2的MVC:

Created with Raphaël 2.1.2Web浏览器客户端控制器FilterDispater模型(action)视图(result-->jsp)

其中的控制器FilterDispater就是Control层,模型(action)就是Model层,而视图(result-->jsp)就是View层。这里面最核心的就是控制器,实际上,在struts2.1以后,官方推荐使用的控制器就不再是FilterDispater了,而是StrutsPrepareAndExecuteFilter,这两者的区别看这里。控制器之后就是action层了,这里会进行一些业务处理,或者与数据库打交道,或者直接操作javaBean。再之后,action的执行结束会有一个result对应各种不同的结果(result具体的用法看这里),多半都是视图,常见的比如jsp、freemarker等。

Struts2的工作原理

了解了Struts2的MVC模式之后,你可能会像知道Struts2的工作原理,在Struts2官网上有一张图很好的介绍这个知识点
Struts2的工作原理
1、客户端初始化一个指向Servlet容器(例如Tomcat)的请求;
2、这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin) ;
3、接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action;
4、如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy;
5、ActionProxy通过ConfigurationManager询问框架的配置文件,找到需要调用的Action类 ,这里,我们一般是从struts.xml配置中读取;
6、ActionProxy创建一个ActionInvocation的实例;
7、ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用;
8、一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签。在这个过程中需要涉及到ActionMapper。
在上述过程中所有的对象(Action,Results,Interceptors,等)都是通过ObjectFactory来创建的。

Struts2的拦截器

我们最常用的,也是Struts2最核心的拦截就是他的默认拦截器栈defaultStack了。这是Struts2帮我们仔细配置好的能适用于大多数开发工作的一个拦截器的组合。

  1. <interceptor-stack name="defaultStack">
  2. <interceptor-ref name="exception"/>
  3. <interceptor-ref name="alias"/>
  4. <interceptor-ref name="servletConfig"/>
  5. <interceptor-ref name="i18n"/>
  6. <interceptor-ref name="prepare"/>
  7. <interceptor-ref name="chain"/>
  8. <interceptor-ref name="scopedModelDriven"/>
  9. <interceptor-ref name="modelDriven"/>
  10. <interceptor-ref name="fileUpload"/>
  11. <interceptor-ref name="checkbox"/>
  12. <interceptor-ref name="multiselect"/>
  13. <interceptor-ref name="staticParams"/>
  14. <interceptor-ref name="actionMappingParams"/>
  15. <interceptor-ref name="params">
  16. <param name="excludeParams">dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,parameters\...*</param>
  17. </interceptor-ref>
  18. <interceptor-ref name="conversionError"/>
  19. <interceptor-ref name="validation">
  20. <param name="excludeMethods">input,back,cancel,browse</param>
  21. </interceptor-ref>
  22. <interceptor-ref name="workflow">
  23. <param name="excludeMethods">input,back,cancel,browse</param>
  24. </interceptor-ref>
  25. <interceptor-ref name="debugging"/>
  26. </interceptor-stack>

从这里面我们能看到很多很熟悉的名字,包括chain、fileUpload、params、validation等等。在我们的开发过程中,Struts2默默的帮我们做了很多的事情,让我们能够专心在业务处理上,而不同去关心那些基础组件和服务,而这也正是框架的意义所在。
P.S: 给大家两张图参考一下常见拦截器的解释,原帖点这里


P.P.S: Struts2的核心包struts2-core.jar中有两个文件:Struts.dtd以及Struts-default.xml。第一个详细限定了Strus2支持的配置文件的格式,第二个则详细的介绍了Struts2默认的拦截器以及result的type类型。很值得一看。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注