本文记录struts2主要的配置文件,存放位置,和注意点 (实际上,这些配置文件都是在class文件夹下起作用,不过凡是放在src文件夹下的,都会在eclipse编译时复制到对应的class文件夹。) 配置文件名 存放位置 备注 struts.xml src文件夹下 struts2默认配置文件
l 可通过<include>来包含别的struts配置文件。 l 在<package>中继承其他package可以拥有其他package的配置。 l 每个action最好加一个名为"input"的<result>,为出错默认的返回值 l 关于<package>的继承: 如果一个package要继承另一个package,则必须把另一个package所在的.xml配置文件include进来。只有一个例外,就是继承structs-default包时,不需要加载struts-default.xml。 因为struts.xml是默认包含了struts-default.xml。 在package继承时,package的先后是没有关系的,前面的package一样能继承后面的package (貌似有本"权威指南"说这个还是拦截器配置,是顺序,有先后的,至少我的测试,package继承绝对没有先后之分) 请看一个例子,其中有三个配置文件: struts-base.xml,struts-middle.xml,和struts.xml
struts-base.xml配置片断
<struts>
<package name="base" extends="struts-default" abstract="true"> </package> </struts> struts-middle.xml配置片断
<struts>
struts.xml配置片断
<package name="middle" extends="base" abstract="true"> </package> </struts>
<struts>
<package name="Registaction" extends="top"> <action> ![]() </package> <package name="top" extends="middle"> </package> <include file="struts-middle.xml"></include> <include file="struts-base.xml"></include> </struts>
可以看到struts.xml中的配置,package继承的顺序完全是和package定义的位置相反的,不过执行并没有问题。 另外注意一点,struts-base.xml中,名base的package直接继承了struts-default,而没有引入 struts-default.xml。 你可能会由此以为每个配置文件都会自动包含struts-default.xml。不过我个人认为,这是因为struts.xml中同时包括了struts-default.xml和struts-base.xml,这两个文件其实是在同一个配置文件中,所以base l 一些常用的属性: struts.custom.properties :用户自定义属性文件,多个用逗号隔开 struts.devMode:是否处于开发模式,开发阶段可设true。 struts.i18n.reload:每次请求到达重新加载资源文件,开发阶段设true。 struts.ui.theme: 默认视图主题,默认为xhtml struts.configuration.xml.reload :指定struts.xml改变后自动重新加载。默认false。 struts.custom.i18n.resources:指定struts2国际化资源文件。 struts.configuration.files:指定struts2默认加载的配置文件,该属性默认值为struts-default.xml,struts-plugin.xml,struts.xml
messageResource_language_COUNTRY.properties 与action同目录 本地化信息配置文件
XXXAcion-conversion.properties 与action同目录 局部类型转换器配置 aaaa(action中的属性名) = package.xxxconverter
xwork-conversion.properties src文件夹下 全局类型转换器配置 ttt(类型) = package.xxxConvertor Element_xxx=xxxType 对于没有泛型支持的list,collection
actionname-validation.xml 和action同目录 action对应的验证配置,actionname 为action的类名 xwork-validation.xml 放在src下 全局验证 关于验证有一点需留意,默认拦截器栈, conversionError拦截器配置都在validation拦截器之前。所以,在进行验证之前,conversionError拦截器会先调用转换器对页面上的属性进行转换,若转换器中抛出错误,会通过conversionError拦截器直接把错误信息返回页面,所以也不会经过validation了。这样一来,validation配置里面的友好的提示信息就换成了异常里面编程人员才看得懂的message了,对于用户而言不太好。 实际上validation拦截器所做的是服务器端验证,它只对action里面的属性定义的类型起作用,比如在action中某属性attrib1是 int型的,那么像正则表达式之类针对string的验证器就不会起作用,这和客户端验证不同之处在于,客户端验证把所有类型的输入都看作string.
所以,页面输入的验证,现在可以有3道。 l 第一道是仍然基于javascript的客户端验证 这一道其实也可以通过转换器来识别,转换器最先读入时,仍然是String型,因此可以在转换过程中对格式进行验证。 l 第二道是转换器转换时的验证(其实是抛出转换异常,也可以当作输入格式上的验证) 这一道,默认的输出message比较不友好,不过可以通过在messageResource资源文件中配置这两个键值加入自己的信息: 1. Xwork.default.invalid.fieldvalue 默认类型转换失败信息 2. Xwork.fieldvalue.属性名 指定属性名的类型转换失败信息。 l 第三道是validation配置文件配置的服务器端验证。 这些验证类型名可以通过看xwork-x-x.jar中com.opensymphony.xwork2.validator.validators包内的default.xml看到 还是得强调下,服务器端验证主要关注的不是参数的格式,而是参数的实际内容,服务器端验证格式反而很不方便。 |
|