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}
username=UserNamepassword=Passwordsubmit=Submittime=Time:{0}time2=Time:${date}
4.i18n_zh_CN.properties
5.index.jsp
username=\u7528\u6237\u540Dpassword=\u5BC6\u7801submit=\u63D0\u4EA4time=\u65F6\u95F4:{0}time2=\u65F6\u95F4:${date}
<%@ 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>
<%@ 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";}}
<?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>
中文显示:
阅读全文
0 0
- 29.Struts2_国际化
- 5、struts2_国际化
- 20.struts2_国际化
- Struts2_配置包范围国际化资源文件
- 21.struts2_通过超链接实现国际化转换
- struts2_国际化的配置和操作
- Struts2_国际化、配置全局资源与输入国际化信息
- 35. Struts2_国际化&通过超链接动态加载国际化资源文件
- Struts2_输出带有占位符的国际化信息
- 31.Struts2_通过超链接动态加载国际化资源文件
- 32.Struts2_通过超链接动态加载国际化资源文件
- 29.struts2_自定义拦截器
- Struts2_国际化-Action范围资源文件、jsp中直接访问某个资源文件
- Struts2_值栈
- Struts2_初见
- Struts2_配置文件
- struts2_入门
- struts2_基础
- 一个框架解决kaggle问题
- zookeeper集群之java程序异步方式实现对数据节点的增,删,改,查及其权限管理(三)
- Linux作业2
- 安装交叉编译工具
- Hibernate的many-to-many多对多关系
- 29.Struts2_国际化
- C语言函数printf("%*.*s",2,4,"abcdefg");的解释
- CSS#无限旋转
- 分布式块设备复制DRBD简介
- 設計一個剪刀石頭布的遊戲,3戰2勝,並包含下列函式:
- 文件IO lseek
- Linux作业3
- 从txt读取信息然后保存到excel中示例
- 在宿主机上通过NAT模式给kvm虚拟机配置公网IP