Struts2

Posted 57容杰龙

tags:

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

 

以下内容是基于导入struts2-2.3.32.jar包来讲的

1.struts2配置文件加载的顺序

  struts2的StrutsPrepareAndExecuteFilter拦截器中对Dispatcher进行了初始化,在Dispatcher类的init方法中定义了配置文件的加载顺序,加载的顺序依次是:

0.web.xml

1.default.properties文件
  作用:定义了struts2框架中所有常量
  位置: struts2-core-2.3.32.jar/org/apache/struts2/default.properties 

2. struts-default.xml
  作用:配置了bean,interceptor,result等。
  位置:在struts的core核心jar包.struts2-core-2.3.32.jar/struts-default.xml  

  struts-plugin.xml
  它是struts2框架中所使用的插件的配置文件。


  struts.xml
  我们的struts2所使用的配置文件。

3.自定义的struts.properties
  就是可以自定义常量。

注意:后加载文件中的配置会将先加载文件中的配置覆盖。

 

2.struts2结果集

struts-default.xml 默认的结果集

在我们的struts.xml中的<result>标签中的type中可以使用,不写的时候默认dispatcher转发

 

3.拦截器

struts-default.xml 默认就有拦截器

AliasInterceptor    alias    在不同请求之间将请求参数在不同名字件转换,请求内容不变
ChainingInterceptor    chain    让前一个Action的属性可以被后一个Action访问,chain类型的result结合使用。
CheckboxInterceptor    checkbox    添加了checkbox自动处理代码,将没有选中的checkbox的内容设定为false,而html默认情况下不提交没有选中的checkbox。
CookiesInterceptor    cookies    使用配置的name,value来是指cookies
ConversionErrorInterceptor    conversionError    将错误从ActionContext中添加到Action的属性字段中。
CreateSessionInterceptor    createSession    自动的创建HttpSession,用来为需要使用到HttpSession的拦截器服务。
DebuggingInterceptor    debugging    提供不同的调试用的页面来展现内部的数据状况。
ExecuteandWaitInterceptor    execAndWait    在后台执行Action,同时将用户带到一个中间的等待页面。
ExceptionInterceptor    exception    将异常定位到一个画面
FileUploadInterceptor    fileUpload    提供文件上传功能
I18nInterceptor    i18n    记录用户选择的locale
LoggerInterceptor    logger    输出Action的名字
MessageStoreInterceptor    store    存储或访问实现ValidationAware接口的Action类出现的消息,错误,字段错误等。
ModelDrivenInterceptor    model-driven    如果一个类实现了ModelDriven,将getModel得到的结果放在Value Stack中。
ScopedModelDriven    scoped-model-driven    如果一个Action实现了ScopedModelDriven,则这个拦截器会从相应的Scope中取出model调用Action的setModel方法将其放入Action内部。
ParametersInterceptor    params    将请求中的参数设置到Action中去。
PrepareInterceptor    prepare    如果Acton实现了Preparable,则该拦截器调用Action类的prepare方法。
ScopeInterceptor    scope    将Action状态存入session和application的简单方法。
ServletConfigInterceptor    servletConfig    提供访问HttpServletRequest和HttpServletResponse的方法,以Map的方式访问。
StaticParametersInterceptor    staticParams    从struts.xml文件中将中的中的内容设置到对应的Action中。
RolesInterceptor    roles    确定用户是否具有JAAS指定的Role,否则不予执行。
TimerInterceptor    timer    输出Action执行的时间
TokenInterceptor    token    通过Token来避免双击
TokenSessionInterceptor    tokenSession    和Token Interceptor一样,不过双击的时候把请求的数据存储在Session中
ValidationInterceptor    validation    使用action-validation.xml文件中定义的内容校验提交的数据。
WorkflowInterceptor    workflow    调用Action的validate方法,一旦有错误返回,重新定位到INPUT画面
ParameterFilterInterceptor    N/A    从参数列表中删除不必要的参数
ProfilingInterceptor    profiling    通过参数激活profile

 自定义拦截器:

A.实现Interceptor接口,创建拦截器类

 1 package com.rong.web.intercept;
 2 
 3 import com.opensymphony.xwork2.ActionInvocation;
 4 import com.opensymphony.xwork2.interceptor.Interceptor;
 5 
 6 public class OneIntercepter implements Interceptor {
 7     private static final long serialVersionUID = -1077492315481012347L;
 8 
 9     @Override
10     public void destroy() {
11         System.out.println("OneIntercepter destroy!");
12     }
13 
14     @Override
15     public void init() {
16         System.out.println("OneIntercepter init!");
17     }
18 
19     @Override
20     public String intercept(ActionInvocation invocation) throws Exception {
21         System.out.println("OneIntercepter放行前执行代码!");
22         //invoke方法是放行!放行执行的是Action要执行的方法,如execute方法。
23         invocation.invoke();
24         System.out.println("OneIntercepter放行后执行代码!");
25         //如果没有放行,则返回该字符串的视图结果有效;否则无效,无效时,采用的是放行Action里执行方法的返回值。
26         return "error";
27         //return null;
28     }
29 
30 }

struts.xml

<?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="default" namespace="/" extends="struts-default" >
        
        <interceptors>
            <!-- 配置自定义拦截器 -->
            <interceptor name="oneInterceptor" class="com.rong.web.intercept.OneIntercepter">
            </interceptor>
            <!-- 配置自定义的拦截器栈 -->
            <interceptor-stack name="oneStack">
                <!-- 必须要有引用默认的拦截器栈 -->
                <interceptor-ref name="defaultStack"></interceptor-ref>
                <!-- 引用自定义的拦截器 -->
                <interceptor-ref name="oneInterceptor"></interceptor-ref>
            </interceptor-stack>
        </interceptors>
        <default-interceptor-ref name="oneStack"></default-interceptor-ref>
        <action name="action" class="com.rong.web.action.MyAction">
            <result>/one.jsp</result>
        </action>
    </package>
</struts>

 

多个拦截器的情况:

<?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="default" namespace="/" extends="struts-default" >
        
        <interceptors>
            <!-- 配置自定义的多个拦截器 -->
            <interceptor name="oneInterceptor" class="com.rong.web.intercept.OneIntercepter">
            </interceptor>
            <interceptor name="twoInterceptor" class="com.rong.web.intercept.TwoIntercepter">
            </interceptor>
            <!-- 配置自定义的拦截器栈 -->
            <interceptor-stack name="oneStack">
                <!-- 必须要有引用默认的拦截器栈 -->
                <interceptor-ref name="defaultStack"></interceptor-ref>
                <!-- 引用自定义的拦截器 -->
                <interceptor-ref name="oneInterceptor"></interceptor-ref>
                <interceptor-ref name="twoInterceptor"></interceptor-ref>
            </interceptor-stack>
        </interceptors>
        <default-interceptor-ref name="oneStack"></default-interceptor-ref>
        <action name="action" class="com.rong.web.action.MyAction">
            <result>/one.jsp</result>
        </action>
    </package>
</struts>

 拦截器栈——拦截器链

以栈的方式穿过拦截器链——一来一回(后进先出)

 B.继承AbstractInterceptor抽象类,创建拦截器类

 1 package com.rong.web.intercept;
 2 
 3 import com.opensymphony.xwork2.ActionInvocation;
 4 import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
 5 
 6 public class ThreeIntercepter extends AbstractInterceptor {
 7     private static final long serialVersionUID = -7964326236393832363L;
 8 
 9     @Override
10     public String intercept(ActionInvocation invocation) throws Exception {
11         System.out.println("ThreeIntercepter  intercept before!");
12         invocation.invoke();
13         System.out.println("ThreeIntercepter  intercept after!");
14         return null;
15     }
16 }
<?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="default" namespace="/" extends="struts-default" >
        <interceptors>
            <!-- 配置自定义的多个拦截器 -->
            <interceptor name="oneInterceptor" class="com.rong.web.intercept.OneIntercepter">
            </interceptor>
            <interceptor name="twoInterceptor" class="com.rong.web.intercept.TwoIntercepter">
            </interceptor>
            <interceptor name="threeInterceptor" class="com.rong.web.intercept.ThreeIntercepter">
            </interceptor>
            <!-- 配置自定义的拦截器栈 -->
            <interceptor-stack name="oneStack">
                <!-- 必须要有引用默认的拦截器栈 -->
                <interceptor-ref name="defaultStack"></interceptor-ref>
                <!-- 引用自定义的拦截器 -->
                <interceptor-ref name="oneInterceptor"></interceptor-ref>
                <interceptor-ref name="twoInterceptor"></interceptor-ref>
                <interceptor-ref name="threeInterceptor"></interceptor-ref>
            </interceptor-stack>
        </interceptors>
        <default-interceptor-ref name="oneStack"></default-interceptor-ref>
        <action name="action" class="com.rong.web.action.MyAction">
            <result>/one.jsp</result>
        </action>
    </package>
</struts>

 4.常量配置

常量配置是放在default.properties文件里

A.URL后缀修改

默认的:

在struts.xml更改:

更改后使用rjl、do、action后缀或者没有后缀都可以访问网页

B.是否开启动态方法调用

 略。详细请点击:http://www.cnblogs.com/57rongjielong/p/8157966.html

 

C.指定默认编码集

默认的:一般不修改,看实际情况是否需要更改

D.设置浏览器是否缓存静态内容

开发阶段一般关闭,上线(生产)阶段打开

E.系统是否自动重新加载文件

开发阶段最好打开,打开后效果仍然不明显。

F.开发模式

默认关闭:

修改并且添加两个文件:

G.视图主题

默认:

更改:

H.指定由spring负责action对象的创建

与spring集成时,指定由spring负责action对象的创建

I.上传文件的大小限制

J.自动加载国际化资源文件

当国际化资源修改时,自动加载国际化资源文件,默认值为false

 

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

struts2怎么防止sql注入

struts2请求过程源代码分析

[struts2学习笔记] 第五节 编写struts2的action代码

Struts2 s2-032远程代码执行分析

S2-053:Apache Struts2远程代码执行漏洞(中危)

struts2 s2-062 ONGL远程代码执行