@HUST-SuWB
2016-03-25T07:20:06.000000Z
字数 2753
阅读 463
项目实战
Struts2,一个成熟的MVC框架,被广泛应用于Java的Web开发中,主要起action跳转的作用,当然,除此之外还有很多重要的功能,这些大都由Struts2提供的拦截器实现。我们首先来看一下Struts2的MVC:
其中的控制器FilterDispater就是Control层,模型(action)就是Model层,而视图(result-->jsp)就是View层。这里面最核心的就是控制器,实际上,在struts2.1以后,官方推荐使用的控制器就不再是FilterDispater了,而是StrutsPrepareAndExecuteFilter,这两者的区别看这里。控制器之后就是action层了,这里会进行一些业务处理,或者与数据库打交道,或者直接操作javaBean。再之后,action的执行结束会有一个result对应各种不同的结果(result具体的用法看这里),多半都是视图,常见的比如jsp、freemarker等。
了解了Struts2的MVC模式之后,你可能会像知道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最核心的拦截就是他的默认拦截器栈defaultStack了。这是Struts2帮我们仔细配置好的能适用于大多数开发工作的一个拦截器的组合。
<interceptor-stack name="defaultStack">
<interceptor-ref name="exception"/>
<interceptor-ref name="alias"/>
<interceptor-ref name="servletConfig"/>
<interceptor-ref name="i18n"/>
<interceptor-ref name="prepare"/>
<interceptor-ref name="chain"/>
<interceptor-ref name="scopedModelDriven"/>
<interceptor-ref name="modelDriven"/>
<interceptor-ref name="fileUpload"/>
<interceptor-ref name="checkbox"/>
<interceptor-ref name="multiselect"/>
<interceptor-ref name="staticParams"/>
<interceptor-ref name="actionMappingParams"/>
<interceptor-ref name="params">
<param name="excludeParams">dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,parameters\...*</param>
</interceptor-ref>
<interceptor-ref name="conversionError"/>
<interceptor-ref name="validation">
<param name="excludeMethods">input,back,cancel,browse</param>
</interceptor-ref>
<interceptor-ref name="workflow">
<param name="excludeMethods">input,back,cancel,browse</param>
</interceptor-ref>
<interceptor-ref name="debugging"/>
</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类型。很值得一看。