说到Struts2执行过程就少不了一张图:
1 客户端初始化一个指向Servlet容器的请求;
2 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin)。
3 接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action。(注:在Struts2的被StrutsPrepareAndExecuteFilter替换)
4 如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy。
5 ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类。
6 ActionProxy创建一个ActionInvocation的实例。
7 ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。
8 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可 能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。
推荐博客:http://blog.sina.com.cn/s/blog_6ef516d0010188hm.html
Then:
在之前说过的使用Struts2框架实现用户登录的功能,使用Struts2标签和OGNL表达式简化了视图的开发,并且利用Struts2提供的特性对输入的数据进行验证,以及访问Servlet API时实现用户会话跟踪,其简单的程序运行流程图
login.jsp>>StrutsPrepareAndExecuteFilter>>Action>>Result>>success.jsp
下面通过分析登录程序,带领大家深入了解Struts2.
分析登录程序
为了实现用户登录的功能,需要经过以下几个步骤:
(1)获取Struts2资源
(2)在应用程序中导入Struts2的类库
(3)在web.xml文件中配置其核心控制器StrutsPerpareAndExecuteFilter,用于对框架进行初始化,以及处理所有的请求。
(4)编写Action类并进行配置。
(5)配置返回结果与物理视图资源的关系。
(6)编写返回视图
众所周知,Struts2框架是基于MVC模式的。基于MVC模式框架的核心就是控制器对所有请求进行统一处理。Struts2的控制器StrutsPrepareAndExecuteFilter由Servlet API中的Filter充当,当Web容器接收到登录的请求后,将请求交给在web.xml中的配置的过滤器StrutsPrepareAndExecuteFilter。
我们首先来看看StrutsPrepareAndExecuteFilter的配置。
1.web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<display-name></display-name>
<!-- -->
<filter>
<filter-name>struts2</filter-name>
<!-- 使用Struts2的核心类库 -->
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<!-- 拦截所有的action -->
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>login.jsp</welcome-file>
</welcome-file-list>
</web-app>
StrutsPrepareAndExecuteFilter可以包含一些初始化参数,经常使用的如config--要加载的xml形式的配置文件列表(多个配置文件以逗号分隔),如果没有设置这个参数,Struts2框架将默认加载struts.default.xml,struts-plugin.xml和struts.xml,这些文件将在后面进行讲解。
StrutsPrepareAndExecuteFilter作为一个Filter在web应用中运行,它负责拦截所有的用户请求,当用户请求达到时,该Filter会过滤用户请求。如果用户请求以action结尾,该请求将被输入Struts
2框架进行处理。
2.Action
实际上,在MVC框架中,控制器是由两个部分组成,分别如下
--核心控制器(Filter):用于拦截用户请求,对请求进行处理。
--业务控制器(Action):调用相应的Model类实现业务处理,返回结果。
对于开发人员来说,使用Struts2框架,主要的编码工作就是编写Action类。在之前学习的过程中,我们介绍了com.opensymphony.xwork2.Action接口和com.opensymphony.xwork2.ActionSupport类,Struts2并不要求编写的Action类一定要实现Action接口,可以编写一个普通的java类作为Action类,只要该类含有一个返回字符串的无参的public方法即可。
问:Action是如何获取用户请求并进行业务处理的?
答:回想一下,我们在学习Servlet时,Servlet是如何实现业务控制的。用户提交请求后,各种业务并没有在Servlet中直接完成,而是通过调用不同的javaBean组件来实现的。在Struts2中也是如此,Filter用来接收用户的请求,在对数据进行简单处理后通过反射创建Action实例,然后调用Action的方法。而Action实例的创建就由struts.xml中的配置来决定。
3.Result
result元素的作用是实现结果视图的调用,并决定视图以哪种形式展示给客户端。简单地说,就是用来设定在Action处理结束后,系统下一步将要做什么。
Action类在处理完用户请求后,会返回一个处理结果。这个结果是一个简单的字符串,框架根据这个字符串选择对应的Result,所以我们又将称为逻辑视图名称。这个逻辑视图名称由result元素的name属性来表示。result元素的值用来指定这个逻辑视图对应的物理视图资源的位置。需要特别指出的是,逻辑视图名称只有与物理视图资源联系在一起,才能发挥作用,所以必须要在配置文件中设置二者之间的对应关系。