Struts2---->运行机制

Struts的作用:把请求跟视图分开(请求跟展现分开,请求跟最后的结果分开)。

一、HelloWorld的执行过程

1、输入url地址:http://localhost:8080/Struts2_HelloWorld/hello 这个url地址的请求,会通过http协议发送到服务器,

2、服务器收到请求之后,会先看请求的是哪个web application,是Struts2_HelloWorld这个web application,所以就把这个web application交给对应的程序处理,既然是这个web application,当然要读这个web application里面的web.xml文件来看它是怎么配的,这时候发现了filter,

<filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>


这个filter会过滤所有的url地址,因为写成/*了,所以url里面的hello,这个地址就会被org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter接收到。

3、过滤器会调用doFilter(),在doFilter()内部会参考struts.xml文件。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>

 <constant name="struts.devMode" value="true" />
	<package name="default" namespace="/" extends="struts-default">
	
		<action name="hello">
			<result>
				/index.jsp
            </result>
		</action>
	</package>
</struts>

a、首先看NameSpace,其中NameSpace是和访问路径一一对应的,它会到struts.xml中去查,查到有一个NameSpace叫"/",然后就会在此NameSpace下去查

b、查到相应的Action的名字, 在url地址里,/后面的是hello,在struts.xml里,namespace="/"里面有个action叫hello,

c、根据该action的class(可以没有,如果action没有配置class属性,这默认ActionSupport中的execute方法返回了”success“。)和method(如果没指定,就默认为execute方法),找到要执行的方法,根据该方法返回的字符串,找到对应的result,本例找到Hello.jsp了,就把Hello.jsp的结果返回。如果result没有配置name属性,则就默认返回"success"时匹配。

二、Struts2框架处理请求的步骤

 

Struts2官方站点的Struts 2 的整体结构
一个请求在Struts2框架中的处理大概分为以下几个步骤:
1)  客户端初始化一个指向Servlet容器(例如Tomcat)的请求。
2)  这个请求经过一系列的过滤器(Filter)。
3)  接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action。
4)  如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy。
5)  ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类。
6)  ActionProxy创建一个ActionInvocation的实例。
7)  ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器Intercepter的调用。
8)  一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。
Struts2的核心就是拦截器。Struts.xml中所有的package都要extends="struts-default"。同理与所有的Java类都要extends自Object一样。struts-default.xml里面就是要做以上事情。

 

posted on 2012-05-18 17:24  小强斋太  阅读(175)  评论(0编辑  收藏  举报

导航