建筑工程网站建设安徽中色十二冶金建设有限公司网站
web/
2025/10/6 17:25:23/
文章来源:
建筑工程网站建设,安徽中色十二冶金建设有限公司网站,建网站多少费用,网站留言表格怎么做文章目录资源文件的命名资源文件基名的指定struts.xml 文件指定资源文件的基名struts.properties 文件指定资源文件的基名通过标签 i18n 指定资源文件的基名资源文件的位置包级资源文件类级资源文件全局级资源文件默认资源文件资源文件的加载顺序Action 中加载资源文件在 JSP 中…
文章目录资源文件的命名资源文件基名的指定struts.xml 文件指定资源文件的基名struts.properties 文件指定资源文件的基名通过标签 i18n 指定资源文件的基名资源文件的位置包级资源文件类级资源文件全局级资源文件默认资源文件资源文件的加载顺序Action 中加载资源文件在 JSP 中访问资源文件怎么获取资源文件中指定key的值s:texts:submits:textfields:passwords:radio在自定义的 Action 中获取资源文件中指定 key 的值ActionSupport资源文件中消息值中的占位符消息值中使用表达式设置和获取默认的语言环境拦截器 i18n案例演示案例一案例二参考文章资源文件的国际化 internationalization这个单词是以 i 开头 n 结尾中间共 18 个字母所以缩写为 i18n国际化的核心页面显示的文字语言是可配置的。
Struts2 国际化是建立在 Java 国际化的基础上的一样是通过提供不同语言环境的消息资源资源属性文件然后通过ResourceBundle 加载指定 Locale 对应的资源文件再取得该资源文件中指定 key 对应的消息值其整个过程与 JAVA 程序的国家化完全相同只是 Struts2 框架对 JAVA 程序国际化进行了进一步封装从而简化了应用程序的国际化。
资源文件的命名
资源文件必须是 properties 文件命名规则为基名 _语言代号_地区代号(即国家代号).properties。
资源文件基名的指定
struts.xml 文件指定资源文件的基名
基名是需要指明出来的例如资源文件名称为 globalMessages_en_US.properties那么基名 globalMessages 可以在配置文件 struts.xml 中指明出来如下所示
struts!-- 设置常量 struts.custom.i18n.resources 的值其实就是指明资源文件的基名 --constant namestruts.custom.i18n.resources valueglobalMessages/
/struts上述方式指定的是全局性的资源文件。
struts.properties 文件指定资源文件的基名
struts.custom.i18n.resourcesbaseName
struts.i18n.encodingGBK上述方式指定的是全局性的资源文件。
通过标签 i18n 指定资源文件的基名
如果不在配置文件 struts.xml 中指明也可以通过 i18n 标签来指明如下所示
s:i18n nameglobalMessages
s:text namefirstname/
/s:i18n标签 i18n 的属性 name 就是用来指明资源文件的基名。标签体中的标签 text 的属性 name 指定 key 的名称。
指明了基名之后呢s:text namefirstname/ 这个标签的底层代码会调用 Action 的某个方法这个方法会根据当前系统的语言环境去读取名称以 globalMessages 开头的资源文件获取 key 为 firstname 的值如果获取不到则会到配置文件 struts.xml 或者 struts.properties 所指定的资源文件中获取 key 为 firstname 的值如果还是找不到则会直接输出属性 name 的值到页面中即直接输出 key 的名称。
资源文件的位置
如果项目非常大所有资源文件放入同一个目录下是不好的。资源文件需要分层和分类。
Maven 项目中资源文件只能放在目录 resources 下。其实除了包级别资源文件和类级别资源文件的位置有强制要求外全局级别的资源文件可以存放在目录 classes 中的任意位置上。只是在 struts.xml 需要指定资源文件的具体路径罢了。
如下图展示在 Maven 项目中将资源文件存放在 LoginAction 所在包目录下 在 struts.xml 要指明资源文件的具体路径
如下图展示了 eclipse 中如何存放资源文件
上图所示的包级资源文件 package_zh_CN.properties 能被 com.tarena.com.outman.day05 下所有 Action 使用包级资源文件 package_zh_CN.properties 能被 com.tarena.com.outman 下所有 Action 使用类级资源文件 OneAction_zh_CN.properties 只能被 com.tarena.com.outman.day05 下的 OneAction 访问。
包级资源文件
存放在某个包下面的资源文件。命名规则package_language_country.properties其中 package 就是固定的基名。
表示某资源文件是被一个包中所有 Action 所使用的。 包级资源文件是其所在包及子包中的所有 Action 共享的资源文件。
Maven 项目中 必须将资源文件存放在目录 resources 下面如果要创建包级资源文件那么要先在目录 resources 下面创建对应的包目录然后在该包目录下创建资源文件在构建项目时会将资源文件复制到 classes 目录中相对应的包目录下。 struts.xml 文件中不需要指定资源文件的基名。如下图所示指定包级资源文件的基名也可以是因为查找包级资源文件时根本就不会去解析常量 struts.custom.i18n.resources 的值。这个常量是用来指定全局级别的资源文件的基名的。 类级资源文件
以某个类名命名的资源文件。命名规则ActionName_language_country.properties其中 ActionName 是 Action 类的类名也就是以 Action 类的类名作为资源文件的基名。
表示某资源文件只能被指定类使用。 类级资源文件是指定类专享的资源文件。
下图展示 Maven 项目如何存放类级资源文件 类级别的资源文件不需要在 struts.xml 中指定资源文件的基名。
全局级资源文件
全局级资源文件直接存放在目录 resources 下即可。 全局级的资源文件必须通过文件 struts.xml 或者 struts.properties 指定资源文件的基名否则找不到资源文件 默认资源文件
当在中文操作系统下如果 myres_zh_CN.properties、myres.properties 两个文件都存在则优先会使用 myres_zh_CN.properties当myres_zh_CN.properties 不存在时候会使用默认的 myres.properties。没有提供语言和地区的资源文件则会去读取系统默认的资源文件。
资源文件都必须是 ISO-8859-1 编码因此对于所有非西方语系的处理都必须先转换为 Java Unicode Escape 格式。转换方法是通过 JDK 自带的工具 native2ascii。
资源文件的加载顺序
Action 中加载资源文件
假设我们在 ChildAction 中调用了 getText(title)Struts 2.0 将会按下面的顺序来加载资源文件
1优先加载系统中 ChildAction 类文件所在目录下的且 baseName 为 ChildAction 的系列资源文件。
2如果在1中找不到指定 key 对应的消息值且 ChildAction 有父类 ParentAction则加载 ParentAction 类文件所在目录下的且 baseName 为 ParentAction 的系列资源文件。
3如果在2中找不到指定 key 对应的消息值且 ChildAction 有实现接口 IChildAction则加载 IChildAction 类文件所在目录下的且 baseName 为 IChildAction 的系列资源文件。
4如果在3中找不到指定 key 对应的消息值且 ChildAction 有实现接口 ModelDriven即使用模型驱动模式则对于 getModel()方法返回的 model 对象重新执行第1步操作。
5如果在4中找不到指定 key 对应的消息值则加载 ChildAction 类文件所在目录下的且 baseName 为 package 的系列资源文件。
6如果在5中找不到指定 key 对应的消息值则沿着当前包上溯直到最顶层包去查找 baseName 为 package 的系列资源文件。
7如果在6中找不到指定 key 对应的消息值则查找以常量 struts.custom.i18n.resources 的值作为 baseName 的系列资源文件。
8如果经过上面的步骤一直找不到 key 对应的消息值将直接将 key 的名称输出。
在 JSP 中访问资源文件
对于在 JSP 中访问国际化消息则简单的多可以分为两种形式
1.使用 s:i18n/ 标签作为父标签 1从 s:i18n/ 标签指定的国际化资源文件中读取指定 key 对应的消息值。 2如果在1中找不到指定 key 对应的消息值则查找以常量 struts.custom.i18n.resources 的值作为基名的系列资源文件。 3如果经过上面步骤还是找不到指定 key 对应的消息值则直接将 key 的名称输出。
2.没使用 s:i18n/ 标签作为父标签
直接查找以常量 struts.custom.i18n.resources 的值作为基名的系列资源文件如果找不到指定 key 对应的值则直接将 key 的名称输出。
怎么获取资源文件中指定key的值
s:text
这个标签的属性 name 是用来指定显示在页面上的文本。
s:text namefirstname/ 这个标签的底层代码会调用 Action 的某个方法这个方法会根据当前系统的语言环境去读取资源文件然后查找名为 firstname 的 key找到则将该 key 的值返回找不到就直接输出属性 name 的值到页面中。
s:submit
s:submit value%{getText(login)}/ 这个标签是通过EL 表达式去调用 Action 的方法 getText() 来获取名为 login 的 key 对应 的值。
getText() 这个方法来自于类 ActionSupport这个方法的处理逻辑是这样的
1.先获取 request 中的参数 request_locale如果获取不到则会到 session 对象中获取名为 WW_TRANS_I18N_LOCALE 的 key 对应的值判断用户所使用的语言是哪种
2.根据获取到的语言和指明的资源文件基名到目录 classes 下面读取资源文件获取并返回指定 key 的值如果找不到则返回 null。
调用的是谁的 getText()请求的是 LoginAction转发到 login.jsp那么这个 jsp 中获取资源文件中的值的有关标签调用的就是 LoginAction 的 getText()。
这个标签还可以通过属性 key 来指定资源文件中相对应的 key 的名称从而获得相对应的国际化信息如下所示
s:submit keyloginSubmit /s:textfield
这个是文本输入框属性 name 是用来指定参数名称。属性 label 是用来指定显示在页面中的文本。
通过调用 Action 的方法 getText() 方法来获取资源文件中的值如下所示
s:textfield namefirstname label%{getText(firstname)}/属性 label 指定 EL 表达式调用 Action 的方法 getText() 去国际化资源文件中获取名为 firstname 的 key 对应的值。
还可以通过属性 key 来指定资源文件中的 key如下所示
s:textfield nameusername keyusername/s:password
这是密码文本输入框。
通过调用 Action 的方法 getText() 方法来获取资源文件中的值如下所示
s:password namepassword label%{getText(password)}/通过属性 key 来指定资源文件中的 key如下所示
s:password namepassword keypassword/s:radio
单选框
属性 name 指定参数名属性 list 指定遍历的集合集合中的元素有两个属性左边属性指定元素 radio 的属性 value 的值右边属性则指定元素 label 的文本内容。
通过 Action 的方法 getText 获取资源文件中指定 key 的值如下所示
s:radio nameloginUser.sex list#{1:getText(male), 0:getText(female)}/在自定义的 Action 中获取资源文件中指定 key 的值
示例代码1
public String execute() {// 方法getText()继承自父类ActionSupport用来读取资源文件中的数据获取指定key所对应的值String str getText(firstname);System.out.println(str);String[] names {liaowenxiong, liudehua};// title欢迎您{0}String title getText(title, names);// 返回欢迎您liaowenxiongSystem.out.println(title);return success;}示例代码2
// 获取默认的语言环境
Locale aDefault Locale.getDefault();
// 根据语言环境aDefault加载基名为globalMessages的资源文件
ResourceBundle rb ResourceBundle.getBundle(globalMessages, aDefault);
// title1欢迎您{0}
String title MessageFormat.format(rb.getString(title1), liaowenxiong);
System.out.println(title);ActionSupport
自定义的 Action 必须继承自 ActionSupport。ActionSupport 类中已经封装了对资源文件的访问。
ActionSupport 中主要的方法 getText()这个方法中有去获取 ActionContext 对象中的key 为 com.opensymphony.xwork2.ActionContext.locale 的值。 getLocale()这个方法就是去获取 ActionContext 对象中的key 为 com.opensymphony.xwork2.ActionContext.locale 的值。
扩展struts.xml 中标签 action/ 如果没有指定属性 class 的值那么调用的就是 ActionSupport 类。
资源文件中消息值中的占位符
title欢迎您{0}如上所示{0} 就是占位符。
Struts2 中提供了如下两种方式来填充消息字符串中的占位符
1.JSP 页面在 s:text./ 标签中使用多个 s:param/ 标签来填充消息中的占位符。
2.Action 中在调用 getText 方法时使用 getText(String aTextName,List args) 或 getText(String key, String[] args) 方法来填充占位符。
String[] names {liaowenxiong, liudehua};
// title欢迎您{0}
String title getText(title, names);// 返回欢迎您liaowenxiong消息值中使用表达式
Struts2 还提供了对占位符的一种替代方式这种方式允许在国际化消息资源文件中使用表达式对于这种方式则可避免在使用国际化消息时还需要为占位符传入参数值。
如下在消息值中使用表达式
succTip${username}, 欢迎, 您已经登录!在上面的消息值中通过使用 EL 表达式可以从 ValueStack 中取出属性 username 的值自动填充到消息值中。
设置和获取默认的语言环境
ActionContext context ActionContext.getContext();
// 获取应用默认的语言环境
Locale locale context.getLocale();
// 获得应用默认的语言环境
locale Locale.getDefault();
locale new Locale(zh, CN);
// 设置应用默认的语言环境
context.setLocale(locale);拦截器 i18n
这个拦截器注册在默认的拦截器栈中。 i18n 拦截器在调用 Action 方法前会到 request 中获取参数 request_locale 的值这个值就是语言环境如果获取到这个值会将其封装成 Locale 对象并将这个对象与用户 Session 中的名为 WW_TRANS_I18N_LOCALE 的 key 进行映射并且还会将这个对象与 ActionContex 对象中的名为 com.opensymphony.xwork2.ActionContext.locale 的 key 进行映射。
案例演示
案例一
实现 Maven Java Web 项目国际化的步骤 1.写属性文件也叫资源文件 写两个属性文件一个是中文版本的一个是英文版本的名称分别为globalMessages_en_US.properties 和 globalMessages_zh_CN.properties把资源文件存放在 resources 目录下。
globalMessages_en_US.properties 内容如下
firstnamefirstname
lastnamelastname
ageage
#titleWelcome,{0}
titleWelcome to xxx
usernameusername
passwordpassword
loginlogin
selectPlease select your language
chineseChinese
englishEnglishglobalMessages_zh_CN.properties 的内容如下
firstname姓
lastname名字
age年龄
#title欢迎您{0}
title欢迎来到xxx
username用户名
password密码
login登录
select请选择语言
chinese中文
english英文2.自定义 Action
示例代码
public class LoginAction extends ActionSupport {public String execute() {return success;}
}自定义的 Action 必须继承自 ActionSupport因为需要调用 ActionSupport 中的方法 getText()。
3.配置 struts.xml
示例代码
?xml version1.0 encodingUTF-8?
!DOCTYPE struts PUBLIC -//Apache Software Foundation//DTD Struts Configuration 2.3//ENhttp://struts.apache.org/dtds/struts-2.3.dtd
struts!-- 是否启用开发模式 --constant namestruts.devMode valuetrue/!-- 指明资源文件的前缀也就是资源文件的基名 --constant namestruts.custom.i18n.resources valueglobalMessages/!-- 配置字符编码 --constant namestruts.i18n.encoding valueUTF-8/package namestruts2-tag extendsstruts-default namespace!-- http://localhost:8080/si/login1.action --action namelogin1 classpriv.lwx.struts2.i18n.web.LoginActionresult namesuccess/login1.jsp/result/action/package
/struts4.写 jsp 文件
示例代码
% page contentTypetext/html; charsetUTF-8 pageEncodingUTF-8 %
%taglib uri/struts-tags prefixs %
!DOCTYPE html
html
headtitle/title
/head
body
%-- 通过调用Action的getText方法获取资源文件中名为 firstname 的key 所对应的值 --%
h1s:text namefirstname/
/h1s:form actionlogin methodpost%--EL表达式的底层是去调用Action的方法getText()这个方法会根据当前系统的语言环境去读取对应的资源文件例如当前系统是中文环境就会去读取文件globalMessages_zh_CN.properties获取文件中指定key的值。--%s:textfield namefirstname label%{getText(firstname)}/s:textfield namelastname label%{getText(lastname)}/s:textfield nameage label%{getText(age)}/s:submit/
/s:form
/body
/html5.测试 测试的时候可以先设置浏览器的语言再访问这个地址http://localhost:8080/si/login1.action
chrome 设置语言
IE 浏览器 打开IE - 打开internet选项 - 点击语言 - 点击添加可以看到如下“添加语言”对话框 案例二
开发一个选择语言环境的页面这个页面可以嵌入任何Web应用的首页中这样就可以让用户自行选择语言环境了。
select-language.jsp
% page importjava.util.Date %
% page contentTypetext/html;charsetUTF-8 languagejava %
%taglib uri/struts-tags prefixs %
html
%--我们就可以在JSP页面中通过s:include .../标签来包含该页面包含该页面后就可以让用户选择语言了。--%
headtitleTitle/titlescriptfunction langSelecter_onChanged() {// alert(hello);document.getElementById(langForm).submit();}/script
/head
body
%--获取Session中的key为“WW_TRANS_I18N_LOCALE”的值再将这个值存储到ValueStack的context中将对应的key命名为SESSION_LOCALE--%
s:set varSESSION_LOCALE value#session[WW_TRANS_I18N_LOCALE]/
%--创建Locales的实例这个对象会存储在ValueStack的context中--%
s:bean varlocales namepriv.lwx.struts2.i18n.bean.Locales%--SESSION_LOCALE null ? locale : SESSION_LOCALE这个三目表达式的含义判断SESSION_LOCALE的值是否为NULL若为空则返回locale从ValueStack的root区获取root的栈顶存放的是ActionSupport对象该对象有名为locale的属性类型是Locale若不为空则返回SESSION_LOCALE的值--%%--为什么ValueStack中的root区可以获取到属性locale的值因为Action对象就是在root区的栈顶Action对象有属性locale那么为什么Action有这个属性从ActionSupport继承下来的。所以转发到此JSP的Action必须继承自ActionSupport--%s:param namecurrent value#SESSION_LOCALE NULL ? locale : #SESSION_LOCALE/%--Locales实例化后会调用getCurrent方法并将属性value的值作为参数传入方法中--%
/s:bean
%--让用户选择语言的表单--%
form idlangForm actions:url/ stylebackground-color: #bbbbbb;padding-top: 4px;padding-bottom: 4pxs:text nameselectTips/%--使用s:select标签遍历Locales对象的属性locales的值这个值是一个Map对象里面存储着应用所支持的语言信息--%s:select idlangSelecter labellanguage namerequest_locale list#locales.localeslistKeyvalue listValuekey value#SESSION_LOCALE NULL ? locale : #SESSION_LOCALEonchangelangSelecter_onChanged(); themesimple/%--用户发送请求携带参数request_locale那么系统会将该参数的值存储在Session的属性WW_TRANS_I18N_LOCALE中该属性值直接决定Struts2系统的语言环境。--%
/form
s:debug/
/body
/htmlbean 类 Locales 的代码
package priv.lwx.struts2.i18n.bean;import java.util.Hashtable;
import java.util.Locale;
import java.util.Map;
import java.util.ResourceBundle;/*** 这个类的作用就是用来获取当前应用所支持的全部语言** author liaowenxiong* date 2022/5/26 09:53*/public class Locales {// 因为本示例也需要实现国际化所以也需要获取到用户的语言环境private Locale current;// Locales实例化的时候会自动调用该方法将获取到的Locale对象存储到Locales实例的成员变量current中public void setCurrent(Locale cur) {System.out.println(方法setCurrent被调用了...);System.out.println(cur: cur);this.current cur;}/*** 获取当前应用所支持的全部语言以Map对象返回** param* return MapLocale* throws* author liaowenxiong* date 2022/5/26 11:49*/public MapString, Locale getLocales() {System.out.println(方法getLocales被调用了...);// 构造一个Map对象将当前应用所支持的语言存储在该对象中MapString, Locale locales new HashtableString, Locale();System.out.println(current: current);// current是用户的语言环境globalMessages是资源属性文件的基名。下面这行代码会根据current所表示的// 语言环境及所指定的基名去读取对应的资源文件将资源文件中的数据全部载入到ResourceBundle对象中。其实// 这个ResourceBundle对象类似Properties对象它们都是Map对象ResourceBundle bundle ResourceBundle.getBundle(globalMessages, current);// 添加当前应用所支持的语言key是系统支持语言的显示名字value是系统支持语言的Locale实例// getString方法就是从读取的资源文件中获取指定key对应的值locales.put(bundle.getString(usen), Locale.US);locales.put(bundle.getString(zhcn), Locale.CHINA);// 在JSP中会遍历这个Map对象将里面的数据以下拉列表的形式显示出来return locales;}
}创建属性文件 globalMessages_en_US.properties
selectTipsPlease select your language
usenAmerican English
zhcnSimplified Chinese创建属性文件 globalMessages_zh_CN.properties
selectTips请选择语言
usen美式英语
zhcn简体中文参考文章
1.https://www.likecs.com/show-203884910.html 2.https://www.cnblogs.com/likailan/p/3307409.html
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/88029.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!