源码如下,
package org.apache.struts2.dispatcher.mapper;
import com.opensymphony.xwork2.config.ConfigurationManager;
import javax.servlet.http.HttpServletRequest;
public interface ActionMapper {
ActionMapping getMapping(HttpServletRequest var1, ConfigurationManager var2);
ActionMapping getMappingFromActionName(String var1);
String getUriFromActionMapping(ActionMapping var1);
}
一个请求在 Struts2 框架中的处理大概会经过以下几个步骤:
-
1、客户端发出一个指向 Servlet 容器(例如Tomcat)的请求。
-
2、这个请求会经过几个过滤器 Filter(ActionContextCleanUp 可选过滤器、其他 Web 过滤器如 SiteMesh 等),最后到达 FilterDispatcher 过滤器。
-
3、接着 FilterDispatcher 过滤器被调用,FilterDispatcher 询问 ActionMapper 来决定这个请求是否需要调用某个 Action。
-
4、如果 ActionMapper 决定需要调用某个 Action,FilterDispatcher 把请求的处理交给 Action 对象的代理(ActionProxy)。
-
5、ActionProxy 通过配置管理器(Configuration Manager)读取框架的相关配置文件(struts.xml 以及它包含的 *.xml 配置文件),找到需要调用的 Action 类。
-
6、找到需要调用的 Action 类后,ActionProxy 会创建一个 ActionInvocation 的实例。
-
7、ActionInvocation 在调用 Action 的过程之前,会先依次调用相关配置拦截器(Intercepter),执行结果返回 结果字符串。
-
8、ActionInvocation 负责查找 结果字符串 对应的 Result,然后执行这个 Result,再返回对应的结果视图(如JSP等等)来呈现页面。
-
9、再次调用所用的配置拦截器(调用顺序与第7步相反),然后响应(HttpServletResponse)被返回给浏览器。
http请求,进入ActionContextCleanup(session,Attribute保留),走一些过滤器,filter,然后进入struts2 的FilterDispatcher
然后进入ActionMapper,这个是用来判断请求是否 需要struts2处理,如果需要,那么由ActionProxy来接管,通过配置管理我们可以找到我们的struts.xml,然后进入真正做事的Action。
另:struts-default.xml文件是struts2框架默认加载的配置文件。它定义struts2一些核心的bean和拦截器。
这些拦截器是以key-vale对的形式配置在struts-default.xml中,其中name是拦截器名字,就是后面使用该拦截器的引用点,value则指定拦截器的实现类。
如:struts-default.xml文件中的一项,
<bean type="org.apache.struts2.dispatcher.mapper.ActionMapper" name="struts" class="org.apache.struts2.dispatcher.mapper.DefaultActionMapper" />
则定义了actionMapper,org.apache.struts2.dispatcher.mapper.DefaultActionMapper是ActionMapper接口的实现。
ActionMapping类
将特定请求映射到特定Action的相关信息存储在ActionMapping中,ActionServelt将ActionMapping传送到Action类的execute()方法,Action将使用ActionMapping的findForward()方法,此方法返回一个指定名称的ActionForward,这样Action就完成了本地转发。若没有找到具体的ActionForward,就返回一个null.
ActionMappings算是一个web控制层的数据字典,这个数据字典里面存放在Action和ActionForward的信息,在程序执行的过程中,查阅这个数据字典,然后达到相应的位置,执行完成以后,再查询这个数据字典,转发特定的信息。在一个web应用中,每个资源都必须通过URI来进行引用。 资源包括HTML页面、JSP页面和定制动作。为了给定制动作一个 URI或者说路径,Struts框架提供了一个 ActionMapping对象。 ActionMaping是Struts的一个核心对象,通常我们不用手写ActionMapping类,它只需要在配置文件中配置就行。