国际化文件以及各种类型转换文件的配置以及在Application中的目录
1. 国际化的资源文件的配置
文件命名:ActionName_语言代号_国家代号.properties
例如:LoginAction_zh_CN.properties(中文), LoginAction_en_US.properties(英文)
A) 资源文件的编写:
文件内容可以如下:(LoginAction_zh_CN.properties)
username=Username: password=Password: birthday=Birthday: graduation=Graduation: taste=Taste: inputUsername=Please Input Your Username: inputpassword=Please Input Your Password: inputrepassword=Please Input Your Password Again: inputbirthday=Please Input Your Birthday: inputtaste=Please Your Taste: submit=submit usernameerror=Username Error. passworderror=Password Error. birthdayerror=the birthday must be not null. notsamepassword=Two Password is not same. xwork.default.invalid.fieldvalue={0}filed error!!! |
需要对其中的非西欧编码进行转换成Unicode编码(使用Java中的native2acsii命令)
LoginAction_en_CN.properties
username=/u7528/u6237/u540d: password=/u5bc6/u7801: birthday=/u 751f /u65e5: graduation=/u6bd5/u4e 1a /u 65f 6/u 95f 4: taste=/u7231/u597d: inputUsername=/u8bf7/u 8f 93/u5165/u7528/u6237/u540d: inputpassword=/u8bf7/u 8f 93/u5165/u5bc6/u7801: inputrepassword=/u8bf7/u91cd/u65b0/u 8f 93/u5165/u5bc6/u7801: inputbirthday=/u8bf7/u 8f 93/u5165/u 751f /u65e5: inputtaste=/u8bf7/u 8f 93/u5165/u7528/u6237/u7231/u597d: submit=/u767b/u 5f 55 usernameerror=/u7528/u6237/u540d/u9519/u8bef. passworderror=/u5bc6/u7801/u9519/u8bef. birthdayerror=/u7528/u6237/u 751f /u65e5/u4e0d/u80fd/u 591f /u4e 3a /u 7a 7a . notsamepassword=/u7528/u6237/u540d/u 548c /u5bc6/u7801/u4e0d/u5339/u914d. xwork.default.invalid.fieldvalue={0}/u5b57/u6bb5/u 7c 7b/u578b/u 8f 6c /u6362/u5931/u8d25/uff01/uff01 |
上述资源文件都应该放在/WEB-INF/classes文件夹下
B)配置国际化资源文件时,还应该在配置常量,以使struts2可以加载它
1) 在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> <constant name="struts.custom.i18n.resources" value="resourceMessage"/> <package name="loginproject1" extends="struts-default"> <action name="login" class="com.tyy.action.LoginAction"> <result name="success">/showResult.jsp</result> <result name="error">/error.jsp</result> <result name="input">/login.jsp</result> </action> </package> </struts> |
此时,<constant />标签必须在<struts />根标记下,在<package />标签之外
2) 在struts.properties中配置(文件放在/WEB-INF/classes下,与资源文件放在同一目录下)
可以有如下代码
struts.custom.i18n.resources= resourceMessage |
文件中只有key=value值对
2) 还可在web.xml中配置,不建议这样做,代码不可读,内容可以如下:
<filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> <init-param> <param-name>struts.custom.i18n.resources</param-name> <param-value>resourceMessage</param-value> </init-param> </fitler> |
注意:struts.custom.i18n.resources是固定的,而resourceMessage则是可以变化的,
代表这资源文件的baseName,例如上面的资源文件名分别为resourceMessage_zh_CN
和resourceMessage_en_US
注:国际化资源文件的配置必须要进行常数的配置,即在struts.xml中配置<constant />
2. 类型转换的资源文件的配置(类型转换是基于ognl的)
a) 全局类型转换文件及其存放目录和命名
命名:xwork-conversion.properties(不可改变的)
存放目录:/WEB-INF/classes下
文件内容:需要进行类型转换的属性所属的类的全名=转换类的全名
例如:com.tyy.bean.Point=com.tyy.converter.PointConverter
com.tyy.bean.Point是需要转换的属性所属的类
com.tyy.converter.PointConverter实现转换功能的类
b)局部类型转换文件
命名:ActionName-conversion.properties 例如:LoginAction-conversion.properties
存放目录:与该Action放在同一目录下,如/WEB-INF/classes/com/tyy/action目录下
文件内容:需要进行类型转换的属性=转换类的全名
例如: point=com.tyy.converter.PointConverter
point是需要转换的属性
com.tyy.converter.PointConverter是转换类的全名
注意:在类型转换的配置文件中,并不需要指定常数的配置,即并不要<constant />等配置文件
下面给出一个com.tyy.actionLoginAction.java的Action类,代码如下:
public class LoginAction { private Point point; //需要进行转换的类
public void setPoint(Point point) { this.point = point; } public String execute() throws Exception { } public Point getPoint() { return point; } } |
类型转换类com.tyy.converter.LoginConverter.java的框架如下:
public class LoginConverter extends StrutsTypeConverter { public Object convertFromString(Map context, String[] values, Class toType); public String convertToString(Map context, Object o); } |
其中StrutsTypeConverter是一个抽象类,有两个方法没有实现,
并且继承之DefaultTypeConverter(输入ognl包)
3. 改变默认类型转换错误信息的配置
a) 全局配置
针对所有的属性采取同样的出错提示信息
可以在国际资源化文件中添加如下代码
xwork.default.invalid.fieldvalue={0}filed error!!!
注:此时必须要在国际化资源文件中进行设置,并在struts.xml中配置<constant />,
否则也不好将此信息存放在那个文件里面。
其中xwork.default.invalid.fieldvalue是不可变的,后面的是转换出错而自动
抛出的信息,其信息是存放在fieldValue中的。出错后会转到input所对应的视图,
在该视图中可以通过<s:fielderror />来得到错误信息。如果是返回到类似与login.jsp,
并且是使用ognl标签的话,则不需要做任何处理,也会打印出错误信息,ognl表单标签
已经在内部实现了输出fielderror中信息的功能。
注:不管转换是否出错,如果有validate()方法或validateXxx()方法,都会进入此方法进行验证。如果检测到
Fielderror字段不为空,则跳转到input所对应的视图,否则进入execute()或xxx()方法。
b) 局部配置
如果某个属性需要对其出错的时候,提供特殊的提示信息,则需要配置局部文件
创建局部国际化资源文件(也可以通过创建普通的properties文件,不过不可以实现国际化)
命名:ActionName_编码代号_国家代号.properties 例如:LoginAction_zh_CN.properties
也可以命名为LoginAction.properties
存放路径:/WEB-INF/classes/com/tyy/action/目录下
文件内容:
invalid.fieldvalue.需要针对某个需要单独显示出错提示信息的属性,
例如: 需要对birthday字段进行特殊的显示
Invalid.field.birthday=信息字段不能无效,并且需要满足中国人的阅读习惯
在前面的全局配置中所有的字段如果出错都会提示“该字段error”,如果birthday字段出错则会提示
“信息字段不能无效,并且需要满足中国人的阅读习惯”,局部配置会覆盖之前的全局配置。
注:1)如果所配置的局部资源化文件只有一种,也即只有LoginAction_zh_CN.properties或只有LoginAction_en_US.properties,
(此时也可直接设置为ActionName.properties)
则不管在什么样的语言环境下,都会读取存在那个资源文件的内容,而不管它是否符合自己的国际化特性
2) 不需要在对局部配置其配置其他内容,只需将文件放到上面的目录下,struts2会自动搜索该文件
而全局则必须要配置在struts.xml中配置<constant name=”struts.custom.i18n.resources” value=”resourceMessage” />
4. 校验过程中出现的出错
通常在服务器端进行校验的时候验证不成功,则也会将失败信息填入到fielderror中,此时并不能够覆盖掉
类型转换过程中的错误信息。
public void validate() {
if(age == 0) {
this.addFieldError(“age”, “age field is not null”);
}
}
验证失败转入到input视图,可以通过<s:fielderror />获得fielderror中的内容
上面讲述的错误信息都是fielderror级别的,同时也存在一种actionerror的错误信息。
在ActionSupport中父接口中有一种addActionError(String name);该方法用来将错误信息添加到
ActionError中,在input所转向的页面中可以通过<s:actionerror />来输出错误信息。具体内容可以
参见ognl的相关文档。
总结:只有国际化资源文件需要配置常量支持;类型转换并不需要,其在出现类型转换错误的时候会被拦截器拦截,
并进行相应的操作,将其放到fielderror中,其中的具体信息,可参考其源代码,一适当的了解底层信息。
附录:(一个MyEclipse项目的简单结构)