Struts2之-配置文件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>
 <!-- include节点是struts2中组件化的方式 可以将每个功能模块独立到一个xml配置文件中 然后用include节点引用 -->
    <include file="struts-default.xml"></include>

    <!-- 所有匹配*.action的请求都由struts2处理 -->
    <constant name="struts.action.extension" value="action" />
    <!-- 是否启用开发模式 -->
    <constant name="struts.devMode" value="true" />
    <!-- struts配置文件改动后,是否重新加载 -->
    <constant name="struts.configuration.xml.reload" value="true" />
    <!-- 设置浏览器是否缓存静态内容 -->
    <constant name="struts.serve.static.browserCache" value="false" />
    <!-- 请求参数的编码方式 -->
    <constant name="struts.i18n.encoding" value="utf-8" />
    <!-- 每次HTTP请求系统都重新加载资源文件,有助于开发 -->
    <constant name="struts.i18n.reload" value="true" />
    <!-- 文件上传最大值 -->
    <constant name="struts.multipart.maxSize" value="104857600" />
    <!-- 让struts2支持动态方法调用 -->
    <constant name="struts.enable.DynamicMethodInvocation" value="true" />
    <!-- Action名称中是否还是用斜线 -->
    <constant name="struts.enable.SlashesInActionNames" value="false" />
    <!-- 允许标签中使用表达式语法 -->
    <constant name="struts.tag.altSyntax" value="true" />
    <!-- 对于WebLogic,Orion,OC4J此属性应该设置成true -->
    <constant name="struts.dispatcher.parametersWorkaround" value="false" />




    <package name="basePackage" extends="struts-default">

     <!-- 配置默认Action -->
        <default-action-ref name="defaultAction" />
        <action name="defaultAction">
            <result>/error/error404.jsp</result>
        </action> 

        <action name="first" class="action.HelloAction" method="test">
            <result name="success">/index.jsp</result>
        </action>

    </package>
</struts>

constant配置Strut2的常量,也可以通过struts.properties和在web.xml中以参数的方式配置

include属性

include节点是struts2中组件化的方式 可以将每个功能模块独立到一个xml配置文件中 然后用include节点引用

bean属性配置

Struts2的大部分核心组件不是以硬编码的形式写在代码中,而是通过自身的IoC容器来管理的。

Struts2以可配置的形式来管理核心组件,所以开发者可以很容易的扩展框架的核心组件。当开发者需要扩展或者替换Struts2的核心组件时,只需要提供自己的组件实现类,并部署在Struts2的IoC容器中即可。

我们打开struts2-core-2.3.8.jar中的struts-default.xml文件,可以看到大量的Bean的定义。如下代码片段:

<struts>
    <bean class="com.opensymphony.xwork2.ObjectFactory" name="xwork" />
    <bean type="com.opensymphony.xwork2.ObjectFactory" name="struts" class="org.apache.struts2.impl.StrutsObjectFactory" />

    <bean type="com.opensymphony.xwork2.FileManager" class="com.opensymphony.xwork2.util.fs.DefaultFileManager" name="system" scope="singleton"/>

    <bean type="com.opensymphony.xwork2.FileManagerFactory" class="com.opensymphony.xwork2.util.fs.DefaultFileManagerFactory" name="xwork" scope="singleton"/>
    <bean type="com.opensymphony.xwork2.FileManagerFactory" class="com.opensymphony.xwork2.util.fs.DefaultFileManagerFactory" name="struts" scope="singleton"/>

而我们在struts.xml定义Bean时,通常有以下两个作用:

  • 1、 创建的Bean实例作为Struts2框架的核心组件使用。
  • 2、 Bean的静态方法需要一个值注入。

元素在struts.xml文件中定义Bean,bean元素有以下几个属性

  • class:这个属性是个必填属性,它指定了Bean实例的实现类。
  • type:这个属性是个可选属性,它指定了Bean实例实现的Struts2的规范,该规范通常是通过某个接口或者在此前定义过的Bean,因此该属性值通常是个接口或者此前定义过的Bean的name属性值。如果需要将Bean的实例作为Strut2组件使用,则应该指定该属性的值。
  • name:该属性是个可选属性,它指定的Bean实例的名字,对于有相同type的多个Bean。则它们的name属性不能相同。
  • scope:该属性是个可选属性,它指定Bean实例的作用域,该属性的值只能是default、singleton、request、session或thread之一。
  • static:该属性是个可选属性,它指定Bean是否使用静态方法注入。通常而言,当指定了type属性时,该属性就不应该指定为true。
  • optional:该属性是个可选属性,它指定Bean是否是一个可选Bean。

package

属性:

  • name:package名称,package的名字必须是唯一的
  • extends:继承的父package名称,package可以扩展 当一个package扩展自另一个package时该package会在本身配置的基础上加入扩展的package的配置父package必须在子package前配置
  • abstract:设置package的属性为抽象的 抽象的package不能定义action 值true:false
  • namespace:定义package命名空间 该命名空间影响到url的地址,例如此命名空间为/test那么访问是的地址为http://localhost:8080/struts2/test/XX.action

package提供了将多个Action组织为一个模块的方式,可以区分管理一个项目的不同模块

action配置

action是struts2用来代替servlet的,action是一个多实例,线程安全的对象

  • name属性: 决定了Action访问资源名.
  • class属性: action的完整类名
  • method属性: 指定调用Action中的哪个方法来处理请求
  <action name="user*" class="com.wy.action.VaildateAction" method="{1}">  
            <result name="success">/success.jsp</result>  
            <result name="input">/{1}.jsp</result>  
  </action>  

其中*是通配符,比如当请求的action的名字为userlogin时,请求的方法为login方法,放回的input页面为login.jsp,多个通配符分别以{1},{2}…分别表示

result属性

  • name属性: 标识结果处理的名称.与action方法的返回值对应.
  • type属性: 指定调用哪一个result类来处理结果,默认使用转发.
  • 标签体:填写页面的相对路径或者绝对路径

result映射(标签体):
在result映射的配置中,在指定实际资源的位置时,可以使用绝对路径,也可以使用相对路径。
绝对路径以斜杠(/)开头,相对于当前的Web应用程序的上下文路径;
相对路径不以斜杠(/)开头,相对于当前执行的action的路径,也就是namespace指定的路径。

type属性:
默认属性为dispatcher

Type 类型值 作用说明 对应类
chain 用来处理Action 链 com.opensymphony.xwork2.ActionChainResult
dispatcher(默认值) 用来转向页面,通常处理 JSP org.apache.struts2.dispatcher.ServletDispatcherResult
redirect 重定向到一个URL org.apache.struts2.dispatcher.ServletRedirectResult
redirectAction 重定向到一个 Action org.apache.struts2.dispatcher.ServletActionRedirectResult
plainText 显示源文件内容,如文件源码 org.apache.struts2.dispatcher.PlainTextResult
freemarker 处理 FreeMarker 模板 org.apache.struts2.views.freemarker.FreemarkerResult
httpheader 控制特殊 http 行为的结果类型 org.apache.struts2.dispatcher.HttpHeaderResult
stream 向浏览器发送 InputSream 对象,通常用来处理文件下载,还可用于返回 AJAX 数据。 org.apache.struts2.dispatcher.StreamResult
velocity 处理 Velocity 模板 org.apache.struts2.dispatcher.VelocityResult
xslt 处理 XML/XLST 模板 org.apache.struts2.views.xslt.XSLTResult

常用的有dispacher,redirect,chain,redirectAction,stream

<result name=“success”  type=“dispatcher”>
    <param name=“location” >/success.jsp</param>
     <param name=“parse” >true</param>
</result>

location参数用于指定action执行完毕后要转向的目标资源,parse属性是一个布尔类型的值,如果为true,则解析location参数中的OGNL表达式;如果为false,则不解析。parse属性的默认值就是true.location参数是默认的参数,一般省略。

全局result

<global-results>
        <result></result>
</global-results>

action可以不配置result,直接使用全局结果

result的查找

有了全局Result之后,根据execute方法的返回值寻找Result顺序如下:
(1)首先,先找自己的元素内的元素是否有匹配的,如果有就执行这个Result,如果没有,下一步。
(2)其次,再找自己的所在的包的全局Result,看看是否有匹配的,如果有就执行这个Result,如果没有,下一步。
(3)再次,递归的寻找自己的包的父包、祖父包中的全局Result是否有匹配的,如果有就执行这个Result,如果没有,下一步。
(4)最后,如果上述三种情况都没有匹配的Result的话,则抛出Exception。

result-types

<result-types>
    <result-type name="" class="">
    <param name=""></param></result-type>
</result-types>

Result是Action执行完后返回的一个字符串,它指示了Action执行完成后,下一个页面在哪里。Result仅仅是个字符串,仅仅是用来指示下一个页面的,那么如何才能够到达下一个页面呢?下一个页面如何能正确地展示结果呢?这就该引出一个新概念——ResultType,所谓ResultType,指的是具体执行Result的类,由它来决定采用哪一种视图技术,将执行结果展现给用户。

很多时候,我们并不去区分Result和ResultType,而是笼统的称为Result。因此,Result除了当作上面讲述的字符串来理解外,还可以把Result当作技术,把Result当作实现MVC模型中的View视图的技术,也就是ResultType来看待。

在Struts2中,可以使用多种视图技术,如jsp、freemarker、velocity、jfreechart等等,同时,Struts2也支持用户自定义ResultType,来打造自己的视图技术。

预定义ResultType

在Struts2中,预定义了很多ResultType,其实就是定义了很多展示结果的技术。Struts2把内置的都放在struts-default包中。struts-default包就是我们配置的包的父包,这个包定义在struts-2.3.8.jar包中的根目录下的文件struts-default.xml中。在这个包中,可以找到相关的的定义,元素是元素的直接子元素。Struts2预定义如下:

<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>

default-action-ref

 <!-- 配置默认Action -->
        <default-action-ref name="defaultAction" />
        <action name="defaultAction">
            <result>/error/error404.jsp</result>
 </action> 

如上,当一个不存在的action被访问时,转发到404页面

default-class-ref

action的默认处理类
在action配置时,如果class不写。默认情况下是 com.opensymphony.xwork2.ActionSupport。如果设置了,就会自动使用该类。

<default-class-ref class="action.HelloAction"></default-class-ref>

interceptors,interceptor,interceptor-ref

<interceptors>
            <interceptor name="" class=""></interceptor>
            <interceptor-stack name="">
                <interceptor-ref name=""></interceptor-ref>
            </interceptor-stack>
</interceptors>

拦截器interceptor
1、name:拦截器名称
2、class:拦截器类路径

interceptor-stack 截器栈,可以一次包括多个拦截器一起使用
interceptor-ref 使用名为name值的拦截器

default-interceptor-ref

 <default-interceptor-ref name="mystack"></default-interceptor-ref>

定义默认的拦截器或者拦截器栈,如果action中定义了拦截器,默认拦截器无效

global-exception-mappings

<global-exception-mappings>
            <exception-mapping result="" exception=""></exception-mapping>
</global-exception-mappings>

全局异常映射,把action请求处理时没有捕获的异常在执行时进行处理。
exception-mapping节点有两个属性:

  • exception
  • result

1、exception属性是用来指定需要捕获异常的类型,属性值一般是异常类型的类全路径。
2、result则是指定捕获异常后需要执行的result结果,该result可以是来自当前的action中声明的result也可以是来自global-result中声明的result。当然一个action中可以声明多个exception-mapping节点,因为一个action请求可能会有多个异常发生。

需要注意的是global-exception-mapping下的exception-mapping元素只能引用global-results下配置的某个result元素。

常量配置

struts2的常量配置文件位置在struts2-core-2.3.8.jar/org.apache.struts2/default.properties中,可以打开此文件进行查看。
配置修改有三个方法:
1、修改常量配置
修改constant属性

此属性用于修改struts的常量,name为要修改常量的名字,value为想要修改的值。
2、修改struts.properties
想要修改常量也可以在src目录下创建struts.properties在里面进行键值对的配置
struts.devMode=true
3、web.xml中修改

<context-param>
    <param-name>struts.devMode</param-name>
    <param-value>true</param-value>
  </context-param>

读取配置文件的加载顺序

struts框架读取配置文件的加载顺序

  • default.properties 该文件保存在 struts2-core-2.3.8.jar 中 org.apache.struts2包里面 (常量的默认值)
  • struts-default.xml 该文件保存在 struts2-core-2.3.8.jar (Bean、拦截器、结果类型 )
  • struts-plugin.xml 该文件保存在struts-Xxx-2.3.8.jar (在插件包中存在 ,配置插件信息 )
  • struts.xml 该文件是web应用默认的struts配置文件
  • struts.properties 该文件是Struts的默认配置文件 (配置常量 )
  • web.xml 该文件是Web应用的配置文件 (配置常量 )

这是struts2的框架读取配置的顺序,实际项目启动时先读的肯定是web.xml,当读到strut2的过滤器时启动struts2

参考

Struts2 XML配置详解
Struts2中 Result类型配置详解
struts2中struts.xml配置文件详解
struts2Result和ResultType
struts2中的exception-mapping声明时异常处理

点赞

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注