之前写到了Struts2框架的一些基本内容,本文是关于Struts2的核心配置。

  • StrutsPrepareAndExecuteFilter
  • Struts.xml主配置文件
  • Strust.properties属性文件
  • Struts-default.xml 默认配置
  • Action的传值方式
  • Action中访问Servlet API
  • 一、StrutsPrepareAndExecuteFilter

    StrutsPrepareAndExecuteFilter是核心控制器。负责拦截由/*指定的所有用户请求,当用户请求到达时,该Filter会过滤用户的请求。当请求转入Struts2框架处理时会先经过一系列的拦截器,然后再到Action。与Struts1不同Struts2对用户的每一次请求都会创建一个Action,所以Struts2中的Action是线程安全的。

    StrutsPrepareAndExecuteFilter是对Struts2较早版本的核心控制器FilterDispather的替代(文档建议,从Struts2.1.3起不再使用该类),结合了StrutsPrepareFilter与StrutsExecuteFilter的功能。

    <filter>
        <filter-name>Struts2</filter-name>
        <filter-class>
        org.apache.struts2.dispather.ng.filter.StrutsPrepareAndExecuteFilter
        </filter-class>
        <init-param>
            <param-name>packages</param-name>
            <param-value>cn.cstp.org.static,cn.cstp.org.XXX</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>Struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    二、Struts.xml配置详解

    Struts框架使用一个配置文件初始化自己的资源,包括:

  • 拦截器:Interceptor:对请求进行预处理和后加工;
  • Action Classes:负责调用商业逻辑和数据访问层;
  • Results:负责返回视图(view),如Jsp页面等。
  • <struts>
        <constant name="struts.enable.DynamicMethodInvocation" value="false"/>
        <!--常量配置-->
        <constant name="struts.devMode" value="false"/>
        <!--包含配置-->
        <include file="example.xml"/>
        <!--包配置-->
        <package name="default" namespace="/" extends="struts-default">
        <action name="index">
            <result type="redirectAction">
                <param name="actionName">HelloWorld</param>
                <param name="namespace">/example</param>
            </result>
        </action>
       </package>
       <!--Add Packages here-->
    </struts>

    2.1 常量配置

    我们可以通过定义一些能够改变框架和插件行为的关键设置来定制我们的Struts应用程序,这些设置就是常量。常量扮演了两个关键角色:首先它们被用来覆盖一些原有的默认设置,例如上传文件的最大容量、框架是否处于开发模式等等;其次,常量还用来指定在一个类型(type)的多个实现中,哪个bean应该被选中。

    常量可以定义在多个文件中,默认情况下按照下面的顺序寻找常量:

  • Struts-default.xml
  • Struts-plugin.xml
  • Struts.xml
  • Struts.properties
  • web.xml
  • 前三个xml文件的格式是一样的,因为他们使用同一个DTD文件,在xml文件中Constant元素有两个必须的属性:name和value;
  • 在Struts.properties文件中,每一个entry都被视为一个常量;
  • 在web.xml文件中FilterDispather的初始化参数被载入为常量。
  • 下面是3种常量的形式:

    //1、Struts.xml文件中的常量
    <struts>
        <constant name ="struts.devMode" value="true"/>
    </struts>
    //2、Struts.properties文件中常量
    struts.devMode = true
    
    //3、web.xml 文件中常量
    <filter>
        <filter-name>struts</filter-name>
        <filter-class>
        org.apache.struts2.dispather.FilterDispacher
        </filter-class>
        <init-param>
            <param-name>struts.devMode</param-name>
            <param-value>true</param-value>
            </init-param>
    </filter>
    

    2.2 包含配置:

    在大型项目开发中,可以讲项目分解为多个小模块,每个模块独立开发和管理。我们可以为每个模板提供一个配置文件,然后对其进行配置,然后在Struts.xml中使用include元素包含这些配置文件。

    例如:

    <include file="struts-char.xml"/>
        <include file="struts-hangman.xml"/>
        <include file="struts-continuations.xml"/>
        <include file="struts-tags.xml"/>
        <include file="struts-validation.xml"/>
    Struts-default.xml
    

    struts-default.xml文件是struts2框架默认加载的配置文件。它定义struts一些核心的bean和拦截器
    这些拦截器是以key-value的形式配置在struts-default.xml中,其中name是拦截器名字,就是后面使用该拦截器的引用点,value则指定拦截器的实现类。

    Struts2框架提供的结果类型(11种)

    <package name="struts-default" abstract="true">
            <result-types>
                <result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/>
                <result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult" default="true"/>
                <result-type name="freemarker" class="org.apache.struts2.views.freemarker.FreemarkerResult"/>
                <result-type name="httpheader" class="org.apache.struts2.dispatcher.HttpHeaderResult"/>
                <result-type name="redirect" class="org.apache.struts2.dispatcher.ServletRedirectResult"/>
                <result-type name="redirectAction" class="org.apache.struts2.dispatcher.ServletActionRedirectResult"/>
                <result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/>
                <result-type name="velocity" class="org.apache.struts2.dispatcher.VelocityResult"/>
                <result-type name="xslt" class="org.apache.struts2.views.xslt.XSLTResult"/>
                <result-type name="plainText" class="org.apache.struts2.dispatcher.PlainTextResult" />
                <result-type name="postback" class="org.apache.struts2.dispatcher.PostbackResult" />
            </result-types>

    2.3 包的配置:

    Struts2中的包类似于java中的包,提供了将action、result、拦截器和拦截器栈组织成了一个逻辑单元的一种方式,从而简化了维护工作,提高了重用性。
    在Struts.xml文件中,与web应用相关的设置都在包中定义,每一个包中都包含了将要用到的action、result、拦截器和拦截器栈。

    包的配置

    属性名是否必须描述信息
    namepackage的唯一标识,不允许同名
    extends指定要扩展的包
    namespace指定名称空间
    abstract声明包为抽象的,这个package中不需要定义action

    2.4 命名空间:

  • namespace属性可以将包中的action配置为不同的命名空间,这样就可以在不同的命名空间中使用同名action。Struts2框架使用命名空间和action的名字来标识一个action
  • 默认的命名空间是空字符串“”,也就是不设置namespace属性时候的命名空间。
  • 在匹配一个action的时候,先到它指定的命名空间(test)的包中去找,如果存在这个包,则在这个package中寻找名字为test的action,当在该package下寻找不到action时就会直接跑到默认namespace的package里面去寻找action(默认的命名空间为空字符串“”)如果在默认的的namespace的packag里面还寻找不到该action,页面提示找不到action
  • 2.5 配置Result

    在Struts2框架中,一个完整的结果视图配置文件为:

    <action name="Action名称" class="Action类路径" method="方法名">
        <result name="逻辑视图名" type="结果类型">
        <param name="参数名">参数值</param>
        </result>
    </action>
    有时候一个<result>被很多<action>使用,这时可以使用<global-result>标签来定义全局的<result》
    <struts>
     <package name="demo" extends="struts-default">
     <global-results>
     <result name="error">/error.jsp</result>
     </global-result>
     </package>
     </struts>

    三、Action的传值方式:

  • 普通的Action属性传值
    直接在Action里定义各种Java基本类型的字段(属性),使这些字段与表单数据相对应,并利用这些字段进行数据传递。
  • 域模型(DomainModel)传值
    Action里不需要配置太多的属性,只需要一个model层里的一个model就好,而且也不用给它实例化
  • 模型驱动(ModelDriven)传值
    action一定要实现ModelDriven接口,action内必须重写getModel()方法。
  • 3.1 使用DomainModel传值必须使用对象.参数的方式进行赋值及取值。

    <form action="userForDomainModel" method="post">
    <td>UserName:</td>
    <td><input type="text" name="user.username"/></td>
    </form>

    下面的Table用于显示传递回的id,username,content

    <input type="text" value="${user.username}"/>
    

    Action中的写法

    public class DomainModel extends ActionSupport{
    private User user;
    public User getUser(){
    return user;
    }
    public void setUser(User user){
    this.user = user;
    } 

    3.2 模型驱动传值:

  • 新增用户域模型对象:Person.java
  • Action类定义一个Person类型的域模型,使用getPerson()方法获取模型对象。
  • 在Action提供一个泛型的私有对象。
  • public class LoginAction implements Action,ModelDriven<Person>{
    Person person = new Person();
    public String execute(){
    person.setName("tom");
    person.setPassword("123");
    return "SUCCESS";}
    public Person getModel(){
    return person;
    }
    }
    页面和普通传值一样,不需要单独处理

    在Action中访问Servlet API

  • Strust2中的Action并没有和任何Servlet API耦合,这样框架更具有灵活性,更易测试。
  • 但有时需要访问Servlet API,如要使用request对象,或跟踪HTTP Session 用户状态等。Struts2框架提供了两种方式来访问Servlet API
  • 方式一:非IoC方式
    利用com.opensymphony.xwork2.ActionContext(当前Action的上下文对象)类以及
    org.apache.struts2.ServletActionContext类通过这个类可以访问Servlet API
  • 方式二:IoC方式
    action类实现ServletRequestAware,SessionAware,ApplicationAware接口
  • //方式一
    public String checkLogin(){
     ActionContext ac = ActionContext.getContext();//获得ActionContext
     Map map = ac.getApplication();
     ac.getSession().put("login",this.name);
     //把登录名称放入到session中
     ac.getApplication().put("login",this.name);//把登录名称放入到application中
     return SUCCESS;
    //方式二
    public class Login2Action extends ActionSupport implements RequestAware,SessionAware,ApplicationAware{
    private Map request;
    private Map session;
    private Map application;
    
    @Override
    public String execute()throws Exception{
    this.request.put("attribute","request value servlet 不相关的Ioc");
    this.session.put("attribute","session value servlet 不相关的IoC");
    this.application.put("attribute","application value serlvet 不相关的IoC");
    return SUCCESS;
    
    @Override
    public void setRequest(Map arg0){
    this.request = arg0;
    }
    @Override
    public void setSession(Map arg0){
    this.session = arg0;
    }
    @Override
    public void setApplication(Map arg0){
    this.application = arg0;
    }
    }

    个人学习笔记,供各位读者参考,若有错误之处,欢迎指出!
    传送门:
    Struts2入门

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐