struts.xml文件是整个Struts2框架的核心,主要负责管理Struts2框架的业务控制器Action。
struts.xml放在根目录下,jsp页面放在WEB-INFO下面的时候,外部是无法直接访问的,只能通过action跳转才能访问,安全性相对而言比较高,能够更好做权限控制,但是后期维护很麻烦,所以建议把jsp放在webContent下面,通过编写过滤器来防止直接访问,后期维护方便。
1.头文件,这部分规定了struts.xml文件的版本、编码格式和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></struts>这对标签内部。
2.<constant>标签
所有在struts.properties文件中定义的属性,都可以配置在struts.xml文件中。而在struts.xml中,是通过<constant>标签来进行配置的。
<!--支持动态方法的调用,使用这个设置后可以这样调用:action!method-->
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
<!--如果设置该属性为true则可以在应用出错时显示更多、更友好的出错提示,发布时要设置为false-->
<constant name="struts.devMode" value="false" />
<!--指定struts2文件上传中整个请求内容允许的最大字节数-->
<constant name="struts.multipart.maxSize" value="2097152000"/>
<!--该属性指定需要Struts2处理的请求后缀,该属性的默认值是action,即所有匹配*.action的请求都由Struts2处理-->
<constant name="struts.action.extension" value="do"/>
<!--该属性指定Struts 2应用所需要的国际化资源文件,如果有多份国际化资源文件,则多个资源文件的文件名以英文逗号(,)隔开-->
<constant name="struts.custom.i18n.resources" value="format"></constant>
<!--该属性指定上传文件的临时保存路径,该属性的默认值是javax.servlet.context.tempdir-->
<constant name="struts.multipart.saveDir" value="/tmp"/>
3.<package>标签
在Struts2框架中是通过包来管理action、result、interceptor、interceptor-stack等配置信息的。包属性如下:
name:包的名称。必须配置
extends:要继承的包,后面配置的是被继承的包的名称。可选
namespace:包的命名空间。可选
abstract:定义包为抽象的,也就是不能包含Action的定义。可选
由于包信息的获取是按照配置文件的先后顺序进行的,所以父包必须在子包之前被定义。通常我们配置struts.xml的时候,都继承一个名为“struts-default.xml”的包,这是struts2中内置的包,有时我们去继承json-default,比如:
4.<interceptors>标签
通过该标签可以向Struts2框架中注册拦截器或者拦截器栈,一般多用于自定义拦截器或拦截器栈的注册。该标签使用方法如下:
该标签用于设置包范围内的全局结果集。在多个Action返回相同逻辑视图的情况下,可以通过<global-results>标签统一配置这些物理视图所对应的逻辑视图。
这两个标签都是用来配置发生异常时对应的视图信息的,只不过一个是Action范围的,一个是包范围的,当同一类型异常在两个范围都被配置时,Action范围的优先级要高于包范围的优先级.这两个标签包含的属性也是一样的,exception用来指定异常类型,result指定发生异常时显示的视图信息,这里要配置为逻辑视图,这两个是必须的:
利用include标签,可以将一个struts.xml配置文件分割成多个配置文件,然后在struts.xml中使用<include>标签引入其他配置文件。这样可以 避免 struts.xml 文件过于庞大、臃肿,提高 struts.xml 文件的可读性,使用方式如下:
extends:要继承的包,后面配置的是被继承的包的名称。可选
namespace:包的命名空间。可选
abstract:定义包为抽象的,也就是不能包含Action的定义。可选
由于包信息的获取是按照配置文件的先后顺序进行的,所以父包必须在子包之前被定义。通常我们配置struts.xml的时候,都继承一个名为“struts-default.xml”的包,这是struts2中内置的包,有时我们去继承json-default,比如:
<package name="login" namespace="/login" extends="json-default">
<action name="loginAdmit" class="com.hanb.zhang.action.systemSet.LoginAction">
<result name="getUser" type="json">
<param name="includeProperties">
userList
</param>
</result>
</action>
</package>
在上面的定义中,action的result的type为json,json plugin就可将action中定义为userList
的field自动转换为json格式数据,并返回给js。其实,json-default也是继承自struts-default的,struts-plugin.xml中定义如下:<struts>
<package name="json-default" extends="struts-default">
<result-types>
<result-type name="json" class="org.apache.struts2.json.JSONResult"/>
</result-types>
<interceptors>
<interceptor name="json" class="org.apache.struts2.json.JSONInterceptor"/>
</interceptors>
</package>
</struts>
<package>中的namespace主要是针对大型项目中Action的管理,更重要的是解决Action重名问题,因为不在同一个命名空间的Action可以使用相同的Action名的,使用了namespace我们在js里如果想调用LoginAction下的checkLogin()方法时,就可以这样写动态方法调用的路径了:
var url=path+"/login/loginAdmit!checkLogin.do";
Struts2中如果没有为某个包指定命名空间,该包使用默认的命名空间,默认的命名空间总是""。
4.<interceptors>标签
通过该标签可以向Struts2框架中注册拦截器或者拦截器栈,一般多用于自定义拦截器或拦截器栈的注册。该标签使用方法如下:
<package name="default" namespace="/" extends="struts-default">
<interceptors>
<!-- 自定义拦截器 name指定自定义拦截器的引用名称 class 指定该拦截器的实现类(完整路径) -->
<interceptor name="sessioncheck" class="com.hanb.zhang.interceptor.LoginInterceptor"/>
<!-- 自定义拦截栈 name 指定自定义拦截栈的引用名称 -->
<interceptor-stack name="myStack">
<!-- name为所要引用的拦截器的引用名称 刚才定义了一个name为 sessionCheck的拦截器,则引用就为 sessionCheck -->
<interceptor-ref name="sessioncheck"></interceptor-ref>
<!-- 每一个自定义的拦截栈都应该必须配上defaultStack拦截栈,该拦截栈是Struts2默认的拦截栈,里面封装了一组拦截器 -->
<interceptor-ref name="defaultStack" />
</interceptor-stack>
</interceptors>
<!--该标签用来设置整个包范围内所有Action所要应用的默认拦截器信息-->
<default-interceptor-ref name="myStack" />
</package>
5.<global-results>标签
该标签用于设置包范围内的全局结果集。在多个Action返回相同逻辑视图的情况下,可以通过<global-results>标签统一配置这些物理视图所对应的逻辑视图。
<global-results>
<result name="error">/error.jsp</result>
<result name="timeout">
/error.jsp
</result>
<result name="login">
/error.jsp
</result>
</global-results>
6.<exception-mapping> 和<global-exception-mappings>
这两个标签都是用来配置发生异常时对应的视图信息的,只不过一个是Action范围的,一个是包范围的,当同一类型异常在两个范围都被配置时,Action范围的优先级要高于包范围的优先级.这两个标签包含的属性也是一样的,exception用来指定异常类型,result指定发生异常时显示的视图信息,这里要配置为逻辑视图,这两个是必须的:
<global-exception-mappings>
<exception-mapping exception="java.lang.Exception" result="error"/>
</global-exception-mappings>
7.<include>标签
利用include标签,可以将一个struts.xml配置文件分割成多个配置文件,然后在struts.xml中使用<include>标签引入其他配置文件。这样可以 避免 struts.xml 文件过于庞大、臃肿,提高 struts.xml 文件的可读性,使用方式如下:
<include file="systemSet.xml"/>
导入
Struts2
核心支持包
(
struts2-core-2.3.14.jar、ognl-3.0.6.jar、xwork-core-2.3.14.jar、struts2-json-plugin-2.3.14.jar、javassist-3.15.0-GA.jar、commons-logging-1.1.1.jar、freemarker-2.3.19.jar、commons-lang3-3.1.jar、commons-io-2.0.1.jar、commons-fileupload-1.2.2.jar)
致此,SSH中第二个重要的配置文件struts.xml讲解完毕。