Struts2核心工作原理

    Struts2作为一种前端的应用框架,使用到的无非三种文件:1、web.xml 2、struts.xml 3、Action类。当然这只是需要我们自己要编写的
    三个文件真正用到的不仅仅是这三个啦。

原理图

    关于Struts2的工作原理,在网上查资料的过程中,找到了一张很经典的图,相信大部分人也都看见过这张图。它很清晰的反映出Struts2中各
    个部件的职责和请求流程。

Struts2核心工作原理_第1张图片

配置文件

    接下来我们得明白web.xml中所配置的内容。

web.xml:

    主要是声明当发送一个请求时,由Struts2中的哪个过滤器进行拦截并进行解析。
 <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>

Struts.xml:

    stuts.xml文件中主要是对拦截器的定义,以及action的名称和class的对应关系,还有返回得页面的name和路径文件的匹配关系。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
    <package name="struts2" extends="struts-default">
        <!-- 拦截器定义 -->
        <interceptors>
            <interceptor name="theInterceptor1" class="com.shengsiyuan.intercepter.TheInterceptor1">
                <param name="test">shengsiyuan</param>
            </interceptor>

        </interceptors>
        <action name="login" class="com.shengsiyuan.struts2.LoginAction">
            <result name="success">/result.jsp</result>
            <result name="input">/index.jsp</result>
            <interceptor-ref name="theInterceptor1"></interceptor-ref>
            <interceptor-ref name="defaultStack"></interceptor-ref>
        </action>
    </package>
</struts>
    了解了有关两个配置文件中的具体内容后,接下来就开始顺一下Struts2请求的流程。
    在此之前,应该首先明白在Struts2中最核心的原理就是利用了拦截器(inceptor)。每一个功能的实现都是建立在拦截器的原理之上的。

—————————————————–拦截请求————————————-

    1、首先,在浏览器中输入访问的请求地址例如:http://localhost:8080/struts2/index.action
    2、Struts2中的container容器会拦截请求,将请求按顺序转发给图中的三个过滤器。ActionContextCleanUp,OtherFilters,FilterDisPatcher(最核心的)

————————————————-FilterDispatcher——————————–

    3、filterDispatcher会根据ActionMapper来查找请求的是哪个action
    4、当决定要调某一个action时,filteDispatcher会将请求交给ActionProxy

————————————————ActionProxy————————————–

    5、ActionProxy根据Configuration(stuts.xml文件)和ActionMapper找到要调用的action类
    6、AcionProxy创建一个ActionInvocation的实例。(这里是不是很眼熟,这就是前几篇博客中介绍到的动态代理的实例啊。。。)
    7、这时,ActionProxy就会去调用真正的action中要执行的方法,当然在此之前,会先执行拦截器中的代码。

————————————————–完成——————————————

    8、执行完action中的方法后,会将结果返回,并产生一个HttpResponse来进行响应页面。

小结

    至此,整个Struts2的请求流程执行完毕。当然这里还有很多我们需要注意的细节问题。比如Action中我们通常会继承ActionSupport这个类。
    1、但还是要注意,这并不是Struts2实现所必须的。它只是为了继承更多的实现方法的一个简便方式。比如验证功能等。这里大家还是不能走进误区。
    2、另外就是关于Struts.xml配置文件中书写的内容还包括很多其他的属性字段的使用,比如method来自定义执行的方法,action中name的通配符
使用方法如:login_*等的含义,这样自然少不了method="{1}"这个参数的含义了!还有INPUT返回值的使用等等!
    3、关于Struts中的验证方法的使用以及传值过程中类型转换,模型驱动等等。都还需要我们不断的学习和实践!

你可能感兴趣的:(Struts2原理)