您的位置:首页 > 编程语言 > Java开发

struts2.X心得11--struts2中的国际化

2013-03-05 21:28 323 查看
总结:

国际化的使用,有四种方式或常用格式,第一种就是全局的国际化使用,在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:text
name="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中代码写法:

public
void
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错
-->

<constant
name="struts.multipart.maxSize"value="10485760"
/>

<interceptor-ref
name="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,然后进行处理的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: