当前位置: 首页 > news >正文

【Struts2学习笔记(12)】Struts2国际化


(1)准备资源文件,资源文件的命名格式如下:

baseName_language_country.properties
baseName_language.properties
baseName.properties
其中baseName是资源文件的基本名,我们可以自定义,但language和country必须是java支持的语言和国家。如:
中国大陆: baseName_zh_CN.properties
美国: baseName_en_US.properties


现在为应用添加两个资源文件:
第一个存放中文:lc_zh_CN.properties
内容为:welcome=欢迎来到乐程
第二个存放英语(美国): lc_en_US.properties
内容为: welcome=welcome to lc



(注:对于中文的属性文件,我们编写好后,应该使用jdk提供的native2ascii命令把文件转换为unicode编码的文件。

命令的使用方式如下:
native2ascii  源文件.properties  目标文件.properties

但是目前的编译器都支持直接编辑了)

(2)配置全局资源与输出国际化信息

当准备好资源文件之后,我们可以在struts.xml中通过struts.custom.i18n.resources常量把资源文件定义为全局资源文件,如下:

<constant name="struts.custom.i18n.resources" value="lc" />
配置文件如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
	<!-- 定义全部范围的资源文件    value是 资源文件的基本名 -->
	<constant name="struts.custom.i18n.resources" value="lc" />
	
	<package name="person" namespace="/person" extends="struts-default">
		<action name="manage" class="cn.lc.action.PersonManageAction">
			<result name="message">/WEB-INF/page/message.jsp</result>
		</action>
	</package>
</struts>

lc为资源文件的基本名。

(3)访问国际化资源

1.在JSP页面中使用<s:text name=“”/>标签输出国际化信息:
<s:text name=“welcome”/>,name为资源文件中的key

  <body>
    <s:text name="welcome" />
  </body>
2.在Action类中,可以继承ActionSupport,使用getText()方法得到国际化信息,该方法的第一个参数用于指定资源文件中的key。
在表单标签中,通过key属性指定资源文件中的key,如:

public class PersonManageAction extends ActionSupport {

	@Override
	public String execute() throws Exception {
		// TODO Auto-generated method stub
		ActionContext.getContext().put("message", this.getText("welcome")); //存放在request域中
		return "message";
	}
}
message视图代码:

  <body>  
   ${message }  
  </body>

(4)输出带占位符的国际化信息


当资源文件中含有占位符时

1.在jsp页面中输出带占位符的国际化信息

<s:text name="welcome">
  	 <s:param><s:property value="realname"/></s:param>
	<s:param>学习</s:param>
</s:text>
2.在Action类中获取带占位符的国际化信息,可以使用getText(String key, String[] args)或getText(String aTextName, List args)方法。
public class PersonManageAction extends ActionSupport {

	@Override
	public String execute() throws Exception {
		ActionContext.getContext().put("message", this.getText("welcome",new String[]{"liming","study"})); //填充占位符
		return "message";
	}	
}

(5)包范围资源文件

1.在一个大型应用中,整个应用有大量的内容需要实现国际化,如果我们把国际化的内容都放置在全局资源属性文件中,显然会导致资源文件变的过于庞大、臃肿,不便于维护,这个时候我们可以针对不同模块,使用包范围来组织国际化文件。

2.方法如下:
在java的包下放置package_language_country.properties资源文件,package为固定写法,处于该包及子包下的action都可以访问该资源。当查找指定key的消息时,系统会先从package资源文件查找,当找不到对应的key时,才会从常量struts.custom.i18n.resources指定的资源文件中寻找。


3.使用方法是一样的 知识系统查找的顺序不同!

(6)Action范围资源文件

1.我们也可以为某个action单独指定资源文件,方法如下:
在Action类所在的路径,放置ActionClassName_language_country.properties资源文件,ActionClassName为action类的简单名称。


2.当查找指定key的消息时,系统会先从ActionClassName_language_country.properties资源文件查找,如果没有找到对应的key,然后沿着当前包往上查找基本名为package 的资源文件,一直找到最顶层包。如果还没有找到对应的key,最后会从常量struts.custom.i18n.resources指定的资源文件中寻找。

(7)JSP中直接访问某个资源文件

1.前边的使用我们都是先要配置之后才可以使用国际化资源的,那么可不可以不配置就可以使用?答案是肯定的!

2.struts2为我们提供了<s:i18n>标签,使用<s:i18n>标签我们可以在类路径下直接从某个资源文件中获取国际化数据,而无需任何配置:
<s:i18n name="lc">  <!-- lc为类路径下资源文件的基本名。 -->
    <s:text name=“welcome”/>
</s:i18n>
3.如果要访问的资源文件在类路径的某个包下,可以这样访问:
<s:i18n name=“cn/lc/action/package">  
  <span style="white-space: pre;">	</span><s:text name="welcome">
  <span style="white-space: pre;">		</span><s:param>小张</s:param>
  <span style="white-space: pre;">	</span></s:text>
</s:i18n>
上面访问cn.lc.action包下基本名为package的资源文件 也可以是PersonManageAction 博鳌是访问的是该Action的PersonManageAction下边的资源文件。


注:转载请注明出处!



相关文章:

  • 【Struts2学习笔记(13)】Struts2中OGNL详解
  • 【Struts2学习笔记(14)】Struts2标签元素
  • SSH2框架搭建Jar下载地址
  • hibernate.cfg.xml文件的配置模板和不同数据库的配置参数
  • EasyUI - LinkButton 按钮控件
  • Hibernate常见问题 No row with the given identifier exists问题的原因及解决
  • 最小的n个数(堆排序)
  • Hibernate核心类和接口详细介绍
  • Hibernate的各种保存方式的区别 (save,persist,update,saveOrUpdte,merge,flush,lock)等
  • ROS知识(6)----基于Eclipse开发
  • 2014最新SSH框架面试题大收集
  • [转]python对json的相关操作
  • Hibernate中Session.get()方法和load()方法的详细比较
  • ZeroClipboard.swf
  • Hibernate用ThreadLocal模式 (线程局部变量模式) 管理Session
  • @angular/forms 源码解析之双向绑定
  • 【Amaple教程】5. 插件
  • 【Linux系统编程】快速查找errno错误码信息
  • 10个确保微服务与容器安全的最佳实践
  • axios 和 cookie 的那些事
  • dva中组件的懒加载
  • hadoop集群管理系统搭建规划说明
  • Laravel Mix运行时关于es2015报错解决方案
  • Linux中的硬链接与软链接
  • Objective-C 中关联引用的概念
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • 分享几个不错的工具
  • 复杂数据处理
  • 基于HAProxy的高性能缓存服务器nuster
  • 深入浅出Node.js
  • 通过npm或yarn自动生成vue组件
  • Nginx实现动静分离
  • 如何正确理解,内页权重高于首页?
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • "无招胜有招"nbsp;史上最全的互…
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • # 计算机视觉入门
  • #if 1...#endif
  • #预处理和函数的对比以及条件编译
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (规划)24届春招和25届暑假实习路线准备规划
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • .NET Framework 服务实现监控可观测性最佳实践
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • .Net 路由处理厉害了
  • .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化
  • .NET4.0并行计算技术基础(1)
  • .NETCORE 开发登录接口MFA谷歌多因子身份验证
  • /boot 内存空间不够
  • @Bean, @Component, @Configuration简析
  • @font-face 用字体画图标
  • @Validated和@Valid校验参数区别