Struts 2 流程

来源:互联网 发布:算法基础vb 编辑:程序博客网 时间:2024/06/01 09:31

基本流程

这里写图片描述

1、客户端初始化一个指向Servlet容器(例如Tomcat)的请求;

HttpServletRequest请求,如在浏览器中输入”http://localhost:8080/TestMvc/add.action”

2、这个请求经过一系列的过滤器(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMeshPlugin);

Filter主要是三层:
ActionContextCleanUp,FilterDispatcher(Struts 2.0-2.1中的),StrutsPrepareAndExecuteFilter(Struts 2.2之后的)

3、接着StrutsPrepareAndExecuteFilter被调用,StrutsPrepareAndExecuteFilter询问ActionMapper来决定这个请求是否需要调用某个Action;

4、如果ActionMapper决定需要调用某个Action,StrutsPrepareAndExecuteFilter把请求的处理交给ActionProxy;

5、ActionProxy通过ConfigurationManager询问框架的配置文件(struts.xml),找到需要调用的Action类;

6、ActionProxy创建一个ActionInvocation的实例。

7、ActionInvocation实例使用命名模式(代理模式)来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。

ActionInvocation工作原理:
ActionInvocation初始化时,根据配置,加载Action相关的所有Interceptor。
通过ActionInvocation.invoke方法调用Action实现时,执行Interceptor。
一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果

就是因为要用拦截器所以才要用代理方法执行。在调用Action的前后执行代理方法。

8、一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2框架中继承的标签。在这个过程中需要涉及到ActionMapper。

其他

在struts2.0中,可以通过ServletActionContext.getRequest()获取request对象。

在action的方法中return一个字符串,该字符串对应struts.xml中的result标签的name相同,result标签中包含的就是跳转页面。

可以说Struts2本质还是一个Servlet(在S1中用于整体控制的是一个Servlet;S2中是一个Filter,其实也可把它看作是Servlet),只是对Servlet进一步的封装罢了

打个比方:做Web项目,好比建房子。Servlet好比木材,用一根根的木材搭,也可盖起房子,只是速度慢而已;

而Struts2好比是用木材做好的一个房子大概结构,要建房子时,只需把它拿过来,再往其里面添砖加瓦,修修补补,就能很快盖好房子,这要比直接使用Servlet要快得多

0 0
原创粉丝点击