Struts2中的资源文件的配置

来源:互联网 发布:济南打车软件 编辑:程序博客网 时间:2024/06/06 02:27
Struts2中的资源文件的配置

      国际化文件以及各种类型转换文件的配置以及在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=/u751f/u65e5:

graduation=/u6bd5/u4e1a/u65f6/u95f4:

taste=/u7231/u597d:

inputUsername=/u8bf7/u8f93/u5165/u7528/u6237/u540d:

inputpassword=/u8bf7/u8f93/u5165/u5bc6/u7801:

inputrepassword=/u8bf7/u91cd/u65b0/u8f93/u5165/u5bc6/u7801:

inputbirthday=/u8bf7/u8f93/u5165/u751f/u65e5:

inputtaste=/u8bf7/u8f93/u5165/u7528/u6237/u7231/u597d:

submit=/u767b/u5f55

usernameerror=/u7528/u6237/u540d/u9519/u8bef.

passworderror=/u5bc6/u7801/u9519/u8bef.

birthdayerror=/u7528/u6237/u751f/u65e5/u4e0d/u80fd/u591f/u4e3a/u7a7a.

notsamepassword=/u7528/u6237/u540d/u548c/u5bc6/u7801/u4e0d/u5339/u914d.

xwork.default.invalid.fieldvalue={0}/u5b57/u6bb5/u7c7b/u578b/u8f6c/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.javaAction类,代码如下:

     

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}filederror!!!

      注:此时必须要在国际化资源文件中进行设置,并在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 voidvalidate() {

                 if(age == 0) {

                      this.addFieldError(“age”, “agefield is not null”);

}   

}

验证失败转入到input视图,可以通过<s:fielderror />获得fielderror中的内容

 

上面讲述的错误信息都是fielderror级别的,同时也存在一种actionerror的错误信息。

ActionSupport中父接口中有一种addActionError(Stringname);该方法用来将错误信息添加到

ActionError中,在input所转向的页面中可以通过<s:actionerror />来输出错误信息。具体内容可以

参见ognl的相关文档。

 

总结:只有国际化资源文件需要配置常量支持;类型转换并不需要,其在出现类型转换错误的时候会被拦截器拦截,

并进行相应的操作,将其放到fielderror中,其中的具体信息,可参考其源代码,一适当的了解底层信息。

 

附录:(一个MyEclipse项目的简单结构)