Struts2解析

Posted Lazy的笔记

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Struts2解析相关的知识,希望对你有一定的参考价值。

struts2是一个
    mvc框架
    是一个aop容器
    struts2的插件机制
        1、在web.xml文件中
        <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>
            在该过滤器中:
            public class StrutsPrepareAndExecuteFilter implements StrutsStatics, Filter {
                public void init(FilterConfig filterConfig) throws ServletException {
                    //1、加载了org/apache/struts/default.properties文件
                    //2、
                    private static final String DEFAULT_CONFIGURATION_PATHS
                        =
                    "struts-default.xml,struts-plugin.xml,struts.xml";
                       说明:
                          1、加载了三种struts2的配置文件
                         struts-default.xml
                         struts-plugin.xml
                         struts.xml
                          2、配置文件的特点:
                              struts-default.xml文件是系统默认的配置文件
                          struts-plugin.xml是插件机制的配置文件
                          struts.xml是开发中用到的配置文件
                          这三种配置文件都是classpath的根目录存放
                          这三种配置文件的dtd约束都一样,所以在这三种配置文件中可以出现相同的元素
                              如果出现相同的元素,后者覆盖前者
                          struts-plugin.xml文件可以有很多个,而且通常情况下是在lib下的jar包中出现
                }
            }
        2、对象工厂ObjectFactory(产生结果集、action、拦截器)【指向spring对象工厂的bean】
                        //该方法是struts2创建action的最低层的方法
                public Object buildAction(String actionName, String namespace, ActionConfig config, Map<String, Object>

extraContext) throws Exception {
                return buildBean(config.getClassName(), extraContext);
                }
                //该方式是创建结果集的最低层的方法
                public Result buildResult(ResultConfig resultConfig, Map<String, Object> extraContext) throws Exception {
                
                }
                //该方式是创建拦截器的最低层的方法
                public Interceptor buildInterceptor(InterceptorConfig interceptorConfig, Map<String, String>

interceptorRefParams) throws ConfigurationException {
                }
        3、静态注入
        1、在struts2的配置文件中有这么一些元素
            bean
               可以配置多个bean
            <bean type="com.opensymphony.xwork2.util.ValueStackFactory"
                name="struts"
                class="com.opensymphony.xwork2.ognl.OgnlValueStackFactory" />
            说明:
               1、值栈的产生工厂是OgnlValueStackFactory
               2、该类在tomcat容器启动的时候就被加载了,所以只加载一次
               3、通过该类就把值栈的产生工厂赋值到struts2容器中了,这个过程称为注入
               4、所以这种行为称为"静态注入"
            package
            声明一个action
            声明一个拦截器
            声明一个结果集
        4、改变action的产生方式
             1、在default.properties文件中有一个配置项:
              struts.objectFactory该配置项指明了对象工厂
         2、写一个类继承ObjectFactory,重写buildAction方法
            public class CreateActionBean extends ObjectFactory{
                @Override
                public Object buildAction(String actionName, String namespace,
                        ActionConfig config, Map<String, Object> extraContext)
                        throws Exception {
                    // TODO Auto-generated method stub
                    System.out.println("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
                    return null;
                }
            }
         3、在struts2的配置文件中利用bean元素把CreateActionBean放入到struts2容器中
            <bean type="com.opensymphony.xwork2.ObjectFactory"
            name="aaa"
            class="cn.itcast.shoa.struts.action.CreateActionBean" />
         4、在配置文件中引入常量struts.objectFactory
             <constant name="struts.objectFactory" value="aaa"></constant>
        5、分析struts2的插件机制
        1、提供了一个jar包
            struts2-spring-plugin-2.3.1.2.jar
        2、在jar包的根目录下存放了一个文件
            <bean type="com.opensymphony.xwork2.ObjectFactory"
                name="spring"
                class="org.apache.struts2.spring.StrutsSpringObjectFactory" />
                <constant name="struts.objectFactory" value="spring" />
            重新定义了对象工厂
        3、如果一个框架想要和struts2进行整合,提供一个struts-plugin.xml文件,
            再提供了一个jar包,该配置文件在jar包的根目录下,然后把该jar包放入到
            lib下就可以了

<struts>
    <package name="person" namespace="/" extends="struts-default">
        <!-- 通配符来使用,class是要根据spring配置文件中的bean的id相对应
        在spring配置文件中只是将PersonAction这个类放入IoC容器中,而没有将struts配置文件放入
        spring配置文件,其中的原理是什么。spring中的工厂有一个org.apache.struts2.spring.StrutsSpringObjectFactory
        , 当服务器启动时,struts2已经与spring整合,struts2会调用里面spring中已经加载的bean,所以这里的class的值是与spring
        中的bean的id对应-->
        <action name="personAction_*" method="{1}" class="personAction">
            
        </action>
    </package>
</struts>

以上是关于Struts2解析的主要内容,如果未能解决你的问题,请参考以下文章

第五节 Struts2 - 文件上传与下载

图文解析Struts2框架执行流程

struts2 ValueStack(值栈)解析

struts2 测试错题解析

笔记:Struts2 文件上传和下载

笔记:Struts2 文件上传和下载