上一篇写了一下struts怎么快速上手使用,下面是struts的配置文件struts.xml中一些配置的解释(●’◡’●)。


  struts.xml是整个程序的工作流程的依据,该文件的根元素是<struts>,其中可以包含4个子元素,分别是:<include>、<constant>、<bean>、<package>

<include>元素

  由于用struts开发一个大型的项目时,struts中的配置信息会越来越多,这样就会使配置文件的可读性和维护性变差,但使用了<include>就会解决这个问题,我们可以按照不同的功能或者模块将配置文件分割成多个配置文件。

1
2
3
4
<struts>
<include file="login.xml"></include>
<include file="register.xml"></include>
</struts>

<constant>元素

  <constant>元素用于配置一些常量信息,这些常量用于控制struts2的某些特性,相当于当他运行时,给你准备哪些功能。由于<constant>元素的常量值过多,我只列一些常用的,以下例子是<constant>元素使用的常用设置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<struts>
<!-- 匹配所有以".action"为后缀的请求都由struts处理,其中action可变
如果需要匹配多个后缀都由struts处理,则使用英文","号分隔,例如value="do,action"
如果不写这一句,则会默认映射Action名字
-->
<constant name="struts.action.extension" value="action" />
<!-- 是否启用开发者模式,在开发者模式下可打印出更加详细的报错信息 -->
<constant name="struts.devMode" value="true" />
<!-- 当struts配置文件改动后,是否重新加载,默认不写是false -->
<constant name="struts.configuration.xml.reload" value="true" />
<!-- 设置浏览器是否缓存静态内容,默认不写为true缓存,在开发环境下最好关闭,可以提高开发效率 -->
<constant name="struts.serve.static.browserCache" value="true" />
<!-- 设置请求参数的编码方式,实际上相当于相当调用HttpServletRequest中的setCharacterEncoding方法 -->
<constant name="struts.i18n.encoding" value="utf-8" />
<!-- 每次HTTP请求系统都重新加载资源文件 -->
<constant name="struts.i18n.reload" value="false" />
<!-- 文件上传的最大值,单位为字节 -->
<constant name="struts.multipart.maxSize" value="1024" />
<!-- 让Struts支持动态方法调用 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
<!-- 在URL中的Action段中是否支持斜线 -->
<constant name="struts.enable.SlashesInActionNames" value="false" />
<!-- 标签中是否支持ognl表达式 -->
<constant name="struts.tag.altSyntax" value="true" />
</struts>

<bean>元素

  struts2是一个可扩展的框架,核心组件都是可以配置的,当我们需要扩展或替换struts2的核心组件时,只需要提供自己的组件实现类,并部署到struts2的容器中即可。
  例子:使用一个自定义的ObjectFactory替换struts2内置的ObjectFactory:

1
<bean name="myFactory" type="com.opensymphony.xwork2.ObjectFactory" class="xiezhenyu.ObjectFactory" />

<package>元素

  <package>元素提供了将多个Action组织为一个模块的方式,package的name在整个struts配置文件中必须是唯一的,并且一个package可以扩展自另一个package。此时改package会在本身配置的基础上加入扩展package的配置,但要注意父package必须在子package前配置。

1
2
3
4
5
6
7
8
9
<!-- 
package的属性
name:package名称,作为其他包引用本包的标识,必填属性
extends:继承的父package名称,可选属性。通常设置为struts-default,继承struts-default.xml,它里面定义了许多跳转类型、拦截器等一些常用的东西
abstract:设置package的属性为抽象的,抽象的package不能定义Action,可选属性。
namespace:可选属性。浏览器地址是根据namespace/action名称去访问的action其中namespace可以是虚路径
-->
<package name="MyStruts" extends="struts-default" namespace="/">
</package>

<package>子元素列表

子元素 功能
default-action-ref 配置默认的Action
default-class-ref 配置默认class
default-interceptor-ref 配置默认拦截器,对package范围内的所有Action有效
global-results 配置全局结果集,对package范围内的所有Action有效
global-exception-mapping 配置全局异常映射,对package范围内的所有Action有效
result-types 配置定义返回结果类型
interceptors 配置拦截器信息
action 配置Action信息

<default-action-ref>

  <default-action-ref>元素用于配置默认的Action,当一个Action请求在配置文件中找不到时,就会执行这个默认的Action,该元素只有一个name属性。

1
<default-action-ref name="Error"></default-action-ref>

<default-class-ref>

  <default-class-ref>元素用户配置默认的类,在配置Action时,如果没有指定具体的class属性,系统就会使用<default-class-ref>元素中的配置。<default-class-ref>只有一个class属性。当使用<default-class-ref>元素指定了默认类后,Struts原来默认的类会被覆盖,而且默认的Action类必须包含execute()方法。

<default-interceptor-ref>

  <default-interceptor-ref>元素用于配置默认类拦截器,如果package继承了“struts-default”,那么也会继承父类package的默认拦截器。

<global-result>

  <global-result>元素用于配置package范围内的全局结果集。他的子元素是<result>。当一个package中多个Action都使用了一个或多个结果的时候,则将其配置在全局结果集中,增强代码的可读性和维护性。例如下面这个案列:当每个Action都返回了error的时候,全都使用这个全局结果去执行。

1
2
3
<global-result>
<result name="error">/error.jsp</result>
</global-result>

<global-exception-mapping>

  <global-exception-mapping>元素用于配置全局异常映射,如果<action>元素内配置了自己的异常映射,则Action内的优先级高于此配置。他的子元素是<exception-mapping>。

1
2
3
<global-exception-mapping>
<exception-mapping result="error" exception="异常类型"></exception-mapping>
</global-exception-mapping>

<result-type>

  <result-type>元素用于配置自定义返回结果类型,该元素基本不用。

<interceptors>

  <interceptors>元素用于配置拦截器的拦截器栈,他有两个子元素:<interceptor>和<interceptor-stack>,分别用来定义拦截器和拦截器栈。

<action>

<action>元素是比较重要的一个元素,也是我们开发中使用最多的一个元素。它有4个属性:

  • name:必选属性,Action的名字。

  • class:可选属性,Action处理类的名字。

  • method:可选属性,指定Action中的方法。如果没有配置该属性,所有请求都会被转发到execute()方法去处理。如果有多个请求需要分别交给不同的方法去处理,就可以使用该属性来指明。

  • converter:可选属性,指定Action使用的类型转换器。

      method属性除了可以填固定的函数名外,还可以使用通配符的方法实现动态方法调用,使用它的前提是必须要配置<constant>元素和<global-allowed-methods>,使其能实现动态方法调用和适配所有的方法。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     <struts>
    <!-- 让Struts支持动态方法调用 -->
    <constant name="struts.enable.DynamicMethodInvocation" value="true" />
    <package name="Struts" namespace="/" extends="struts-default">
    <!-- 适配所有的通配符方法 -->
    <global-allowed-methods>regex:.*</global-allowed-methods>
    <action name="*User" class="xiezhenyu.UserAction" method="{1}User">
    <result name="error">/error.jsp</result>
    <result name="success">/success.jsp</result>
    </action>
    </package>
    </struts>

      如上代码所示,name属性值中的”*“就是通配符,表示所有以User结尾的亲求都会有这个Action处理;method属性值中的“{1}”是表达式,表示name属性中”*“的值,比如请求为loginUser,那么将传递给method属性,这是会调用Action中loginUser()方法。

    <action>中还有以下几个子元素

  • <interceptor-ref>:用于配置拦截器

  • <exception-mapping>:用于配置异常映射

  • <result>:用于配置Action的结果映射,除了常规的结果映射外,也可以像method属性值一样使用表达式,实行动态结果。<result>有两个属性,name、type。name为Action类在处理完成返回的都是字符串类型的结果,这个结果作为逻辑视图存在,对应<result>元素的name属性值,然后找到与之对应的视图资源。type为指定结果的类型,其取值如下表所示。(我们只需要记住dispatcher、redirect和chain三个常用的即可,其它的略作了解)

type可取值 解释
dispatcher 转发,默认结果类型,对应视图为JSP界面
chain 将Action和另一个Action链接起来
freemarker 返回结果的对应视图为FreeMarker模板
HttpHeaderResult 返回一个已配置好的HTTP头信息响应
redirect 将用户重定向到一个配置好的URL
redirectAction 将用户重定向到一个已定义好的Action
stream 将原数据作为流传递会浏览器,一般用于下载
velocity 返回结果的对应视图为Velocity模板
xslt 呈现XML到浏览器,该XML可以通过XSL模板进行转换
plaintext 返回普通文本内容

以上就是struts2配置文件的大部分内容。