struts2.X心得11--struts2中的国际化
总结:
国际化的使用,有四种方式或常用格式,第一种就是全局的国际化使用,在src路径下配置三个全局的配置文件,比如有中文、英文、和默认的,格式分别是baseName_language_country.properties、baseName.properties;第二种是局部国际化使用,即为某一模块配置一个国际化资源文件,适合开发大型应用时,格式为在改模块的包下,或指定包路径下,一般在action同包获取父类包,使其方便找到,格式是:package_language_country.properties;第三种是为指定的action配置国际化资源文件,顾名思义就是在相应的action同包下配置格式为:actionName_language_country.properties的对应资源文件;第四种是使用struts2标签开发,具体书写如下:
<s:i18n name=“cn/csdn/action/package">
<s:textname="welcome">
<s:param>小张</s:param>
</s:text>
</s:i18n>
注:name为指定包下的资源文件基名
1.struts2中国际化的使用
准备资源文件,资源文件的命名格式如下:
baseName_language_country.properties
baseName_language.properties
baseName.properties
其中baseName是资源文件的基本名,我们可以自定义,但language和country必须是java支持的语言和国家。如:
中国大陆:baseName_zh_CN.properties
美国:baseName_en_US.properties
现在为应用添加两个资源文件:
第一个存放中文:csdn_zh_CN.properties
内容为:welcome=欢迎来到传智播客
第二个存放英语(美国): csdn_en_US.properties
内容为: welcome=welcometo csdn
对于中文的属性文件,我们编写好后,除了可以使用myeclipse自带的转换功能还可以使用jdk提供的native2ascii命令把文件转换为unicode编码的文件。命令的使用方式如下:
native2ascii 源文件.properties 目标文件.properties
2.配置全局资源与输出国际化信息
当准备好资源文件之后,我们可以在struts.xml中通过struts.custom.i18n.resources常量把资源文件定义为全局资源文件,如下:<constant name="struts.custom.i18n.resources" value=“csdn" /> csdn为资源文件的基本名。
后面我们就可以在页面或在action中访问国际化信息:
l 在JSP页面中可以使用<s:text name=“”/>标签输出国际化信息:<s:text name=“user”/>,name为资源文件中的key;也可以通过key属性指定资源文件中的key,如:<s:textfield name="realname" key="user"/>
l 在Action类中,可以继承ActionSupport,使用getText()方法得到国际化信息,该方法的第一个参数用于指定资源文件中的key。
%{getText('item.username')}方式来获取资源。采取的是OGNL表达式的方式。
l getText的来源:
从源代码可以看出ActionSupport实现了TextProvider接口。Provides access to {@link ResourceBundle}s and their underlying textmessages.意思是说提供了访问资源文件的入口。而TextProvider中提供了getText方法,根据key可以得到value。
3.国际化—输出带占位符的国际化信息
资源文件中的内容如下:welcome= 欢迎{0}来到{1}网站
在jsp页面中输出带占位符的国际化信息:
index代码中的
Jsp中代码写法:
<s:textname="welcome">
<!-- 这里的param标签是为国际化资源中的占位符赋值,没有指定name属性,所以不能使用value属性 -->
<s:param>杨凯</s:param>
<s:param>传智播客</s:param>
</s:text>
在Action类中获取带占位符的国际化信息,可以使用getText(String key, String[] args)或getText(StringaTextName, List args)方法。
Action中代码写法:
publicvoid validate() {
List<String> list = new ArrayList<String>();
list.add("aa");
list.add("bbb");
System.out.println(getText("welcome",list));
System.out.println("--------------");
System.out.println(getText("welcome",new String[]{"艾丝凡","发个"}));
System.out.println("用户名不能为空");
if("".equals(this.name) ||this.name ==null){
addFieldError("name",getText("nameError"));
}
4.国际化—包范围资源文件
在一个大型应用中,整个应用有大量的内容需要实现国际化,如果我们把国际化的内容都放置在全局资源属性文件中,显然会导致资源文件变的过于庞大、臃肿,不便于维护,这个时候我们可以针对不同模块,使用包范围来组织国际化文件。
方法如下:
在java的包下放置package_language_country.properties资源文件,package为固定写法,处于该包及子包下的action都可以访问该资源。当查找指定key的消息时,系统会先从package资源文件查找,当找不到对应的key时,才会从常量struts.custom.i18n.resources指定的资源文件中寻找。
访问的方式为:在浏览器上访问指定action的方法;即必须是先访问到这个action才能够使用这个包中的国际化文件。
5.国际化—JSP中直接访问某个资源文件
struts2为我们提供了<s:i18n>标签,使用<s:i18n>标签我们可以在类路径下直接从某个资源文件中获取国际化数据,而无需任何配置:
<s:i18n name=“csdn">
<s:text name=“welcome”/>
</s:i18n>
csdn为类路径下资源文件的基本名。如果要访问的资源文件在类路径的某个包下,可以这样访问:
<s:i18nname=“cn/csdn/action/package">
<s:text name="welcome">
<s:param>小张</s:param>
</s:text>
</s:i18n>
上面访问cn.csdn.action包下基本名为package的资源文件。
6.文件上传案例解析:
在上传的过程中,如果出现错误,则系统会自动跳转到input指向的页面。这点也可以从FileUploadInterceptor源代码中看出来。
在input参数指定的页面中,编写<s:fielderror></s:fielderror>可以看到错误的信息。但是是英文的。如:不能上传一个类型错误信息为:
Content-Typenot allowed: upload "xwork-2.1.6-src.zip""upload_6fff0830_13174e12471__8000_00000000.tmp"application/x-zip-compressed
位于:struts核心包下的第一个包(即org.apache.struts2)下的struts-messages.properties文件中
这个信息的组成查看org.apache.struts2包下的struts-messages.properties文件。在这个文件中,有三个键值对:
struts.messages.error.file.too.large=Thefile is to large to be uploaded: {0} "{1}" "{2}" {3}
struts.messages.error.content.type.not.allowed=Content-Typenot allowed: {0} "{1}" "{2}" {3}
struts.messages.error.file.extension.not.allowed
=File extension not allowed: {0} "{1}""{2}" {3} {0}:代表页面上<input name=”upload” type=”file”/>中name的值
{1}:代表文件上传的名称
{2}:文件保存在临时目录的名称。默认临时目录为work\Catalina\localhost\struts_upload_interceptor,如果你在struts配置文件中配置了临时路径的常量,那么路径就是你配置过的
{3}:代表文件上传类型,或者文件上传大小。上面的错误代表文件上传类型。如果报第一个错误,则代表文件上传大小。
如果报错了,显示的是英文,怎么样才能显示中文呢?
步骤:
1、 建立一个properties文件。这个文件的名称可以任意取。
2、 在这个配置文件中,添入如下的内容:
struts.messages.error.file.too.large=文件超过了规定的大小: {0} "{1}""{2}" {3}
struts.messages.error.content.type.not.allowed=该类型不允许被上传: {0} "{1}""{2}" {3}
struts.messages.error.file.extension.not.allowed=不能上传该扩展名类型的文件: {0} "{1}""{2}" {3}
struts.messages.upload.error.SizeLimitExceededException=上传文件大小超过限制! 允许最大值为: {0} 但是期望的是: {1}!
在struts-upload.xml中,指定配置文件的位置
<constantname="struts.custom.i18n.resources"value="cn.itcast.struts2.action.upload.fileuploadmessage"/t>
如果配置文件放在src下,则这样指定:
<constantname=”struts.custom.i18n.resources” value=”fileuploadmessage”></constant>
注意:
<!-- 设置文件上传的大小 ,这个值必须大于等于拦截器中的值;尽量让大于,因为这样通过拦截器拦截的值会走fielderror错误,而不是发异常走actionerror错 -->
<constantname="struts.multipart.maxSize"value="10485760"/>
<interceptor-refname="fileUpload">
<!-- 上传文件的类型 -->
<param name="allowedTypes">application/x-zip-compressed,
image/jpeg,image/pjpeg,image/gif,text/plain
</param>
<!-- 上传文件的大小 -->
<param name="maximumSize">5242880</param>
</interceptor-ref>
拦截器中的文件大小限制小于常量设置的文件大小限制的时候,会走struts.messages.error.content.type.not.allowed=该类型不允许被上传: {0}"{1}" "{2}" {3}错误,如果一样大或比拦截器还小,会走struts.messages.upload.error.SizeLimitExceededException=上传文件大小超过限制!允许最大值为: {0} 但是期望的是: {1}!
这两者的区别就是前者只给用户提示错误信息而不抛异常,但是后者就不一样了,后者虽然会给用户提示但是也会抛异常;还有一点就是前者可以通过<s:fielderror/>标签打印出错误信息,但是后者只能通过<s:actionerror/>打印;也就是说抛异常的这种情况是将一个异常抛给了一个action,然后进行处理的