根据实验结果,做一个简单的总结:
一.action级别:
对应一个Action可以定义一个资源文件,可供这个action使用,例如HelloAction:
public class HelloAction extends ActionSupport {
public String execute(){
return SUCCESS;
}
}
对应的properties文件是:
hello=Hello,world
hello1=Hello,world1
然后访问这个Action,从页面取值是:
<s:property value="getText('hello')" /><br/>
<s:text name="hello1" /><br/>
即可取出相应的字符串
二.package级别:
这个实验需要感谢李老师,详情可以参见李老师的博客:http://blog.csdn.net/li_tengfei/article/details/6098162
其原理解释如下:在Action所在的包或其任意一个父包中定义package.properties和package_language_COUTRY.properties资源文件,比如:假设在cn.com.leadfar.struts2.actions下面有一个UserAction,那么你可以在cn.com.leadfar.struts2.actions这个包或其任意一个父包中定义package.properties文件,比如选择cn.com.leadfar包,在它下面定义了三个资源文件
我的三个properties文件定义如下,在com.zizhu.struts包下面:
package.properties文件:
pakcage.msg=package,proerties,none
package_zh_CN.properties文件:
package.msg=package,hello,china
package_en_US.properties文件:
package.msg=package, hehe, english
注意点,这个定义不是全局的,所以全局访问无效,必须访问这个包或这子包的action才有效
访问这个包下面的action,从页面取值:
<s:text name="package.msg" /><br>
能够取出字符串
三.全局资源定义:
名字是任意的,可以自己指定,但需要配置一个常量:
<constant name="struts.custom.i18n.resources" value="zizhu"></constant>
定义资源文件,zizhu_en_US.properties,zizhu_zh_CN.properties,这两个文件必须放在classpath下面,放入到任何包底下无效,测试结果就是这样;
资源文件内容:
zizhu_en_US.properties文件:
hello.msg=struts2,i18n,english
zizhu_zh_CN.properties文件:
hello.msg=struts2,i18n china
index_forward_jsp=index.jsp
可以从页面取出值:
<s:text name="hello.msg" /><br>
注意点:1.在所有的properties文件中,中文无效,必须转化成ascii,jdk自带这个工具,不展开提,具体参见李老师博客,或者百度,多了去了;
2.全局的资源文件可以在任何地方使用,而package.properties,<ActionClass>.properties必须访问某个action才能生效
四.扩展点:在struts.xml文件中使用资源文件内容:
正如上面zizhu_zh_CN.properties所示,index_forward_jsp=index.jsp,那么在struts.xml中可以直接使用${index_forward_jsp}取出index.jsp;根据我的理解,真正处理国际化问题的情况可能并不多,而实际之中使用的应该是资源文件的使用,对整个项目来说,怎么统一处理这些资源,例如统一处理提示信息,统一配置,都可能用到这些资源文件,还是很有可能用得到,因为这种方式便于后期的维护,比较方便