29.Struts2_国际化

来源:互联网 发布:南京大学作家班 知乎 编辑:程序博客网 时间:2024/05/22 09:48

内容:

配置国际化资源文件

  • Action范围资源文件:在Action类文件所在的路径建立名为ActionName.language.conuntry.properties的文件
  • 包范围资源文件:在包的根路径下建立文件名为package.language.country.properties的属性文件,一旦建立,处于该包下的所有Action都可以访问该资源文件。注意:包范围资源文件的baseName就是package,不是Action所在的包名。
  • 全局资源文件
    -命名方式:basename.language.country.properties
    -struts.xml  
    <constant name="struts.custom.i18n.resources" value="baseName"/>
    -struts.properties  
    struts.custom.i18n.resources=baseName
  • 临时指定资源文件:<s:i18n.../>标签的name属性指定临时的国际化资源文件


一.国际化的目标

1)如何配置国际化资源文件。

方式1:Action范围资源文件:在Action类文件所在的路径建立名为ActionName.language.conuntry.properties的文件
方式2:包范围资源文件:在包的根路径下建立文件名为package.language.country.properties的属性文件,一旦建立,处于该包下的所有Action都可以访问该资源文件。注意:包范围资源文件的baseName就是package,不是Action所在的包名。
方式3:全局资源文件
-命名方式:basename.language.country.properties
-struts.xml  (value的属性名可以随意取)
<constant name="struts.custom.i18n.resources" value="baseName"/>
-struts.properties  
struts.custom.i18n.resources=baseName
问题:国际化资源文件加载的顺序如何呢?离当前Action较近的将被优先加载。


2)如何在页面上和Action类中访问国际化资源文件的value值?

步骤I:在Action类中,若Action实现了TextProvider接口,则可以调用其getText()方法获取value值
>通过继承ActionSupport的方式
步骤II:页面上可以使用s:text标签;对于表单标签可以使用表单标签的key属性值
>若有占位符,则可以使用s:text标签的s:param子标签来填充占位符
>可以利用标签和OGNL表达式直接访问值栈中的属性值(对象栈和Map栈)


方式1:time=Time:{0}
<s:text name="time">
<s:param value="date"></s:param>
</s:text>


方式2:time2=Time:${date}
<s:text name="time2"></s:text>


3)实现通过超链接切换语言。(见31节内容)

I.关键支持在于知道Struts2框架是如何确定Local对象的!

II.可以通过阅读I18n拦截器知道。

III.具体确定local对象的过程:
第一步:Struts2使用i18n拦截器处理国际化,并且将其注册在默认的拦截器中
第二步:i18n拦截器在执行Action方法前,自动查找请求中一个名为request_locale的参数。如果该参数存在,拦截器就将其作为参数转换成Locale对象,并将其设为用户默认的Locale(代表国家/语言环境)。并把其设置为session的WW_TRANS_I18N_LOCALE属性
第三步:若request没有名为request_locale的参数,则i18n拦截器会从Session中获取WW_TRANS_I18N的属性值,若该值不为空,则将该属性值设置为浏览者的默认Locale
第四步:若session中的WW_TAANS_I18N_LOCAL的属性值为空,则从ActionContext中获取Locale对象

IV.具体实现:只需要在超链接的后面附着request_loacle的请求参数,值是语言国家代码。
<a href="testI18n.action?request_locale=en_US">English</a>
<a href="testI18n.action?request_locale=zh_CN">中文</a>


注意:超链接必须是一个Struts2的请求,既使i18n拦截器工作!



完整代码:采用是方式3:全局资源文件
目录结构:

1.为lib导入struts2必要的jar包,配置web.xml文件

2.i18n.properties
Username=UserNamepassword=Passwordsubmit=Submittime=Time:{0}time2=Time:${date}

3.i18n_en_US.properties
username=UserNamepassword=Passwordsubmit=Submittime=Time:{0}time2=Time:${date}
 
4.i18n_zh_CN.properties
username=\u7528\u6237\u540Dpassword=\u5BC6\u7801submit=\u63D0\u4EA4time=\u65F6\u95F4:{0}time2=\u65F6\u95F4:${date}

5.index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title></head><body><a href="testi18n">i18n</a></body></html>

6.i18n.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%><%@ taglib prefix="s" uri="/struts-tags" %><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title></head><body><s:form action="" theme="simple"><s:debug></s:debug><s:text name="time"><s:param value="date"></s:param></s:text><br><br><s:text name="time2"></s:text><br><br><!-- label的方式是把label写死在标签里面 --><s:textfield name="userrname" label="UserName"></s:textfield><!-- 若label标签使用%{getText('username')}的方式就也可以从国际化资源文件中获取value值了。   因为此时在对象栈中有DefaultTextProvider的一个实例,该对象中提供了访问国际化资源文件的getText()方法   同时还需要通知struts框架label中放入的不再是一个普通的字符串,而是一个OGNL表达式,所以使用%{}把getText()包装起来,以强制进行OGNL解析。--><!-- 页面上可以直接使用<s:text name=""/>标签来访问国际化资源文件里的value值。--><s:text name="username"/><s:textfield name="username" label="%{getText('username')}"></s:textfield><!-- key的方式是直接上资源文件中获得value值 --><s:text name="username"/><s:textfield name="username" key="username"></s:textfield><s:text name="password"/><s:textfield name="password" key="password"></s:textfield><s:submit key="submit" value="%{getText('submit')}"></s:submit></s:form></body></html>

7.i18nAction.java
package struts.app.i18n;import com.opensymphony.xwork2.ActionSupport;import java.util.Arrays;import java.util.Date;public class i18nAction extends ActionSupport{/** *  */private static final long serialVersionUID = 1L;private Date date=null;public Date getDate() {return date;}public void setDate(Date date) {this.date = date;}@Overridepublic String execute() throws Exception{date=new Date();//1.在Action中访问国际资源文件的value值String username=getText("username");System.out.println(username);//2.带占位符的String time=getText("time",Arrays.asList(new Date()));System.out.println(time);return "success";}}

8.struts.xml
<?xml version="1.0" encoding="UTF-8" ?>  <!DOCTYPE struts PUBLIC      "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"      "http://struts.apache.org/dtds/struts-2.3.dtd">    <struts>      <!-- 配置struts2国际化 value是国际化资源基本名message-->    <constant name="struts.custom.i18n.resources" value="i18n"/>        <package name="default" namespace="/" extends="struts-default">          <action name="testi18n" class="struts.app.i18n.i18nAction" method="execute">    <result>/i18n.jsp</result>    </action>       </package>  </struts>

页面显示:英文

中文显示:




原创粉丝点击