struts.xml常用标签详解

  • Post author:
  • Post category:其他


struts.xml是Struts 2的核心配置文件,它主要负责管理应用中的Action映射,以及该Action包含的Result定义等。

下面我们先来看下struts.xml最简化的一个基本配置:


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC 
  "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 
  "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
  <action name="Action名称" class="Action类路径" method="方法名">
     <result name="逻辑视图名称" type="结果类型">
        <param name="参数名称">参数值</param>
     </result>
  </action>
</struts> 

附注:

struts2加载配置文件的顺序:


struts-default.xml(struts2-core-2.x.x.x.jar中) -> struts-plugin.xml(各插件中) -> struts.xml(自定义)

注意:如果在多个配置中配置同一信息,则后一个配置中的配置会覆盖前面的配置。

下面对struts.xml文件中常用的元素标签进行简要的介绍:




<struts>标签


该标签是struts.xml文件的根标签,它包含以下子元素:<package>、<constant>、<include>、<bean>。如下详解:


一、 <package>标签


该标签使用包机制来解决同名action的兼容问题,该标签支持多继承,例如<package name=”test” extends=”struts-default, jfreechart-default”>相当于将<package name=”struts-default”/>下的所有的配置信息都进行了继承,这可以大大减少代码量,所以通常该标签都会继承自struts-default.xml中的struts-default包,加载系统默认的配置信息。

它包含以下子元素:<action>、<default-action-ref>、<default-class-ref>、<default-interceptor-ref>、<global-exception-mappings>、<global-results>、<interceptors>、<result-types>。







标签属性

是否必需 功能描述
name 包名,作为其它包应用本包的标记
extends 设置本包继承其它包,必须继承struts-defalut.xml包
namespace 设置包的命名空间,更重要的是解决Action重名问题
abstact 设置为抽象包




附注:


namespace属性详解:

(1)默认命名空间:
  <package name="wwfy" extends="struts-default">
     <action name="login" class="wwfy.action.LoginAction">
        <result>/success.jsp</result>
     </action>
   </package>

该包未指定命名空间,则采用默认的命名空间””(相当于namespace=””).

则此配置下的Action的URL为

http://localhost:8080/projectName/login.action


如果在指定路径下搜索不到action资源,就会到默认命名空间下搜索,效果同根命名空间。

eg:我们访问:

http://localhost:8080/projectName/test/login.action

,在/test的命名空间中搜索不到login的action资源,就会直接到默认命名空间中搜索。

(2)自定义命名空间:
  <package name="wwfy" extends="struts-default" namespace="/user"> 
     <action name="login" class="wwfy.action.LoginAction">
       <result>/success.jsp</result>
     </action>
  </package>

则此配置下的Action的URL为

http://localhost:8080/projectName/user/login.action

(3)根命名空间:
  <package name="wwfy" extends="struts-default" namespace="/">
     <action name="login" class="wwfy.action.LoginAction">
       <result>/success.jsp</result>
     </action>
  </package>

该包的命名空间为根命名空间,此时所有根路径下的Action请求都会去这个包中查找对应的资源信息。

则此配置下所有

http://localhost:8080/projectName/*.action

都会到设置为根命名空间的包中寻找资源。


说明:

namespace的搜索顺序:


自定义命名空间 -> 根命名空间 -> 默认命名空间


1.  <action>标签


该标签用于配置action映射,以确定如何处理客户端请求。

它包含以下的子元素:<result>、<param>、<interceptor-ref>、<exception-mapping>。

标签属性 是否必须 功能描述 默认值
name 请求的Action名称
class Action处理类对应具体路径 ActionSupport
method 指定Action中的方法名 execute
converter 指定Action使用的类型转换器

附注:

通配符的使用:

*表示通用的内容,{0}表示所有通配符*所表示的内容,{i}表示第i个通配符*所表示的内容。示例如下:

public class TestAction {
   public String test1(){
       return "result1";
   }
   public String test2(){
       return "result2";
   }
   public String test3(){
      return "result3";
   }
}

struts.xml中配置为:

<package name="wwfy" extends="struts-default">
  <action name="test*" class="wwfy.action.TestAction">
    <result name="result{1}">/result{1}.jsp</result>
  </action>
</package>

我们访问:

http://localhost:8080/projectName/test1.action

跳转到result1.jsp


http://localhost:8080/projectName/test2.action

跳转到result2.jsp


http://localhost:8080/projectName/test3.action

跳转到result3.jsp


1.1   <result>标签


该标签用于设置结果视图。

标签属性 是否必须 功能描述 默认值
name 对应Action返回逻辑视图名称 success
type 返回结果类型
dispatcher

附注:

type属性的几个主要值:

(1)redirect:重定位到URL
<result type="redirect">/index.jsp?username=${username}</resul>
(2)redirectAction:重定向Action
 <result type="redirectAction">  //重定向某个命名空间下的action
    <param name="actionName">xxx</param>   
    <param name="namespace">/test</param>
 </result>
(3)plainText:用于显示实际视图资源的代码
 <result type="plainText">
  <param name="location">/index.jsp</param>  //该参数指定了该逻辑视图对应的实际资源
  <param name="charSet">UTF-8</param>     //该参数指定了采用的编码方案
 </result>




2. <interceptors>标签


通过该标签可以向Struts2框架中注册拦截器或者拦截器栈,一般多用于自定义拦截器或拦截器栈的注册

<1-- 同一包内最多只能出现一次 --> 
<interceptors>
   <interceptor name="拦截器名" class="拦截器类"/>
   <interceptor-stack name="拦截器栈名">
     <interceptor-ref name="拦截器名"/>
   </interceptor-stack>
</interceptors>


3.  <default-interceptor-ref>标签


该标签用来设置整个包范围内所有Action所要应用的默认拦截器信息,即该拦截器作用于该包的所有action。

<default-interceptor-ref name="mydefault" class="拦截器类"/>

<!-- 调用struts-default中的默认拦截器 -->
<default-interceptor-ref name="defaultStack"/>

注意:当为某个Action单独添加拦截器功能后,<default-interceptor-ref>中所指定的拦截器将不再对这个Action起作用.


3.1  <interceptor-ref>标签


通过该标签可以为其所在的Action添加拦截器功能。

<interceptor-ref name="拦截器名"/> 




4.  <global-results> 标签


该标签用来标识包范围内的全局结果集,即用于共享结果集。示例如下:

(1)同一包内共享结果集:

<package name="userPackage" namespace="/user" extends="struts-default"> 
     
    <!-- 全局result配置,当返回的视图是input或error时,自动跳转到指定该视图 -->
    <global-results>
       <result name="error">/error.jsp</result>
       <result name="noSession">/login.jsp</result>
    </global-results>    

    <!-- 当action中配置有与全局结果视图相同的result时,action中的result视图覆盖全局result视图。 -->   
    <action name="login" class="action.UserAction" method="login">     
         <result name="success">/index.jsp</result>
         <result name="error">/loginError.jsp</result>
   </action>    

   <!-- 注意:<global-results>标签必须配置在所有<action>标签前面,否则编译出错Unable to load configuration -- >

</package>

测试访问:

http://localhost:8080/projectName/user/login.action/

测试结果:

跳转到loginError.jsp视图。

(2)不同包外共享结果集(使用继承实现):
  <package name="xxx" extends="struts-default"> 
    <global-results>
       <result name="message">/login.jsp</result>
    </global-results>
  </package>
  <package name="xxxx" namespace="test" extends="xxx">
    <action name="login" class="action.LoginAction" method="login"> 
    </action>
  </package>

访问:

http://localhost:8080/projectName/test/login.action/


5. <default-action-ref>标签


该标签用于配置当系统找不到指定action时调用的默认action。默认情况下,系统找不到指定action会抛出404异常。示例如下:

<package name="userPackage" namespace="/user" extends="struts-default"> 
    
     <!-- 在查找不到指定的action时跳转到该默认action -->
     <default-action-ref name="unKnown"/>

     <!-- 默认action的跳转视图,使用default-action-ref标签来指向它 -->
     <action name="unKnown">  
         <result>/unKnownAction.jsp</result>  
     </action>  

     <!-- 注意:<default-action-ref>标签必须配置在所有<action>标签前面,否则编译出错Unable to load configuration -- >

</package>

测试访问:

http://localhost:8080/projectName/user/login.action

//login.action并未定义声明。

测试结果:

跳转到了unKnowAction.jsp界面


6. <default-class-ref>标签


该标签用于配置当没有为某个action指定具体的class时,调用该标签指定的默认类。

<package name="userPackage" namespace="/user" extends="struts-default"> 
   
    <!-- 默认类关联  -->
    <default-class-ref class="action.UserAction"/>
    
    <!-- 未配置类action -->
    <action name="login" method="login">
       <result name="success">/index.jsp</result>
    </action>

</package>

测试访问:http://localhost:8080/projectName/user/login.action

测试结果:跳转到了index.jsp视图。


7. <global-exception-mappings>标签


该标签用于配置全局(包范围)的异常视图映射。它只有一个子元素:<exception-mapping>,通常需要两个搭配使用。


7.1 <exception-mapping>标签


该标签用于配置action范围的异常视图映射。

<package name="default" extends="struts-default"> 
        
        <global-exception-mappings>
              <exception-mapping result="sqlexception" exception="java.sql.SQLException"/>
              <exception-mapping result="unknown" exception="java.lang.Exception" />
              <exception-mapping result="error" exception="java.lang.RuntimeException"/> 
        </global-exception-mappings>
        
        <action name="unknown">
           <result>/unKnown.jso</result>
        </action>
        
        <action name="sqlexception">
           <result>/sqlException.jso</result>
        </action>
</package> 


8. <result-types>标签


该标签用于定义结果类型所对应的实现方式。以下是struts-default默认配置的结果类型:

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


二、<constant>标签


该标签用来配置常量。

<!--该属性指定需要Struts2处理的请求后缀,该属性的默认值是action,即所有匹配*.action的请求都由Struts2处理。如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开-->
<constant name="struts.action.extension" value="do,action" />
 
 <!-- 指定Web应用的默认编码集,默认是"ISO8859-1"相当于调用 HttpServletRequest的setCharacterEncoding方法 -->
<constant name="struts.i18n.encoding" value="UTF-8" />

<!-- 设置浏览器是否缓存静态内容,默认值为true(生产环境下使用),开发阶段最好关闭,因为我们希望每次请求都获得服务器的最新响应-->
<constant name="struts.serve.static.browserCache " value="false" />

<!-- 当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false(生产环境下使用),开发阶段最好打开 -->
<constant name="struts.configuration.xml.reload" value="true" />

<!-- 该属性设置Struts 2应用是否使用开发模式。开发模式下使用,这样可以打印出更详细的错误信息 -->
<constant name="struts.devMode" value="true" />

<!-- 默认的视图主题 -->
<constant name="struts.ui.theme" value="simple" />

<!-- 该属性指定Struts2中的action由Spring容器创建 -->
<constant name="struts.objectFactory" value="spring" />
 
<!-- 该属性设置Struts2是否支持动态方法调用,该属性的默认值是true -->
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
 
<!-- 该属性设置Struts2是否允许在Action名中使用斜线,该属性的默认值是false -->
<constant name="struts.enable.SlashesInActionNames" value="true" />
 
<!-- 该属性指定是否允许在Struts2标签中使用表达式语法,该属性的默认值是true。 -->
<constant name="struts.tag.altSyntax" value="true" />
 
<!-- 该属性指定Struts 2框架默认加载的配置文件,如果需要指定默认加载多个配置文件,则多个配置文件的文件名之间以英文逗号(,)隔开。该属性的默认值为struts- default.xml,struts-plugin.xml,struts.xml-->
<constant name="struts.configuration.files" value="struts- default.xml,struts-plugin.xml,struts.xml" />
 
<!--上传文件的大小限制,默认的情况下struts2是不接收的也就是说struts2不接收超过他默认大小限制的文件
注:上传文件的大小不是单文件的大小而是上传文件总数的大小-->
<constant name="struts.multipart.maxSize" value="10701096"/>
 
<!--设置上传的临时文件保存目录,默认值是javax.servlet.context.tempdir -->
<constant name="struts.multipart.saveDir" value="d:/"></constant>  
 
<!--该属性指定处理multipart/form-data的MIME类型(文件上传)请求的框架,该属性支持cos、pell和jakarta等属性值,即分别对应使用cos的文件上传框架、pell上传及common-fileupload文件上传框架。该属性的默认值为jakarta. -->
<constant name="struts.multipart.parser" value="jakarta"></constant>

附注:

struts2加载常量的搜索顺序:


struts-default.xml –> struts-plugin.xml –> struts.xml –> struts.properties –> web.xml


注意:如果在多个配置中定义了同一常量,则后一个配置中的常量值会覆盖前面配置的常量值。


三、<include>标签


该标签主要用来将一个struts.xml配置文件分割成多个配置文件,方便阅读和管理。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
  <include file="user.xml"/>
  <include file="goods.xml"/>
</struts>




四、<bean>标签




版权声明:本文为chen_zw原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。