@liayun
2016-10-03T13:57:17.000000Z
字数 5151
阅读 1557
Struts2框架学习
这是Struts2框架进阶四。废话不多说,直接进入正文。
Struts2框架的国际化,大概在实际开发中用到的不多,虽说用不到,但是我们还是要弄明白这个知识点的。
若我们要是在实际项目中用到国际化,那就要准备资源文件,资源文件的命名格式如下:
其中baseName是资源文件的基本名,我们可以自定义,但language和country必须是java支持的语言和国家。如:
提示:对于中文的属性文件,我们编写好后,应该使用jdk提供的native2ascii命令把文件转换为unicode编码的文件。命令的使用方式如下:
native2ascii 源文件.properties 目标文件.properties
国际化有三个不同范围的资源文件:
下面我们来一一详解。
我们先搭建好Struts2的开发环境。准备工作做好之后,我们就来配置国际化全局资源文件并输出国际化信息。
现在准备两个资源文件:
第一个存放中文:itcast_zh_CN.properties,内容为:
welcome=欢迎来到天门市
第二个存放英语(美国):itcast_en_US.properties,内容为:
welcome=welcom to tianmen
将这两个资源文件放在类路径下(即src目录下)。若要使用上面的两个资源文件,那么在struts.xml中须使用常量加载全局资源文件,如下:
<constant name="struts.custom.i18n.resources" value="itcast" />
itcast为资源文件的基本名。
这样,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>
<constant name="struts.custom.i18n.resources" value="itcast" />
</struts>
最后我们要在WebRoot根目录下创建项目首页——index.jsp,而且我们若想在index.jsp页面中输出国际化信息,则须使用到<s:text name="" />
标签,如:
<s:text name="user" />
name为属性文件中的key。
这样,index.jsp页面的内容为:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!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>国际化</title>
</head>
<body>
<s:text name="welcome"></s:text>
</body>
</html>
测试效果如下:
记得插入.GIF图片
我们将itcast_zh_CN.properties资源文件的内容修改为:
welcome={0},欢迎来到天门市{1}
将itcast_en_US.properties资源文件的内容修改为:
{0},welcom to tianmen {1}
我们若想在index.jsp页面中输出带占位符的国际化信息,index.jsp页面的内容须修改为:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!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>国际化</title>
</head>
<body>
<s:text name="welcome">
<s:param>liayun</s:param>
<s:param>玩耍</s:param>
</s:text>
</body>
</html>
测试效果如下:
记得插入.GIF图片
在一个大型应用中,整个应用有大量的内容需要实现国际化,如果我们把国际化的内容都放置在全局资源属性文件中,显然会导致资源文件变的过于庞大、臃肿,不便于维护,这时候我们可以针对不同模块、不同的action来组织国际化文件。方法如下:
在java的包下放置package_language_country.properties资源文件,package为固定写法,处于该包及子包下的action都可以访问该资源文件。当查找指定key的消息时,系统会先从package资源文件查找,当找不到对应的key时,才会从常量struts.custom.i18n.resources指定的资源文件中寻找(即从全局资源文件中查找)。
我们在src目录下新建一个java包:cn.itcast.action,然后在该包下加入以下两个资源文件:
package_zh_CN.properties
welcome=package:{0},欢迎来到天门市{1}
package_en_US.properties
welcome=packge:{0},welcom to tianmen {1}
接下来,我们还要在该包下创建一个Action——PersonManageAction.java。在Action类中,可以继承ActionSupport,使用getText()方法,该方法的第一个参数用于指定属性文件中的key。
public class PersonManageAction extends ActionSupport {
@Override
public String execute() throws Exception {
ActionContext.getContext().put("message", this.getText("welcome", new String[]{"liayun", "玩耍"}));
return "message";
}
}
提示:在Action类中获取带占位符的国际化信息,可以使用getText(String key, String[] args)或getText(String aTextName, List args)方法。
紧接着,我们在struts.xml配置文件中配置该action。
<?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>
<constant name="struts.custom.i18n.resources" value="itcast" />
<package name="person" namespace="/person" extends="struts-default">
<action name="manage" class="cn.itcast.action.PersonManageAction">
<result name="message">/WEB-INF/page/message.jsp</result>
</action>
</package>
</struts>
顺其自然地,我们还要在WEB-INF/page/目录下创建出message.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>结果</title>
</head>
<body>
${message }
</body>
</html>
测试结果如下:
记得插入.GIF图片
我们也可以为某个action单独指定资源文件,方法如下:
在Action类所在的路径下,放置ActionClassName_language_country.properties资源文件,ActionClassName为action类的简单名称。
当查找指定key的消息时,系统会先从ActionClassName_language_country.properties资源文件查找,如果没有找到对应的key,然后沿着当前包往上查找基本名为package的资源文件,一直找到最顶层包。如果还没有找到对应的key,最后会从常量struts.custom.i18n.resources指定的资源文件中寻找(即从全局资源文件中查找)。
我们在src目录下的cn.itcast.action包中再加入以下两个资源文件:
PersonManageAction_zh_CN.properties
welcome=action:{0},欢迎来到天门市{1}
PersonManageAction_en_US.properties
welcome=action:{0},welcom to tianmen {1}
一切都不必改动,现在就来测试,结果如下:
记得插入.GIF图片
我们亦可使用<s:i18n>
标签指定直接从某个特定的资源文件中取数据。
如果要访问类路径下某个资源文件,如下:
<s:i18n name="itcast">
<s:text name="welcome">
<s:param>liayun</s:param>
<s:param>玩耍</s:param>
</s:text>
</s:i18n>
itcast为类路径下资源文件的基本名。
如果要访问类路径下某个包下的资源文件,如下:
<s:i18n name="cn/itcast/action/package">
<s:text name="welcome">
<s:param>liayun</s:param>
<s:param>玩耍</s:param>
</s:text>
</s:i18n>
上面访问cn.itcast.action包下基本名为package的资源文件。
如果要访问类路径下某个包下的Action范围的资源文件,如下:
<s:i18n name="cn/itcast/action/PersonManageAction">
<s:text name="welcome">
<s:param>liayun</s:param>
<s:param>玩耍</s:param>
</s:text>
</s:i18n>
上面访问cn.itcast.action包下基本名为PersonManageAction的Action范围的资源文件。