Struts2框架进阶(四)

这是Struts2框架进阶四。废话不多说,直接进入正文。

国际化

Struts2框架的国际化,大概在实际开发中用到的不多,虽说用不到,但是我们还是要弄明白这个知识点的。
若我们要是在实际项目中用到国际化,那就要准备资源文件,资源文件的命名格式如下:

  • baseName_language_country.properties
  • baseName_language.properties
  • baseName.properties

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

  • 中国大陆:baseName_zh_CN.properties
  • 美国:baseName_en_US.properties

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

native2ascii 源文件.properties 目标文件.properties

国际化有三个不同范围的资源文件:

  • 全局范围
  • 包范围
  • Action范围

下面我们来一一详解。

配置国际化全局资源文件与输出国际化信息

我们先搭建好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>

测试效果如下:
这里写图片描述

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

我们将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>

测试效果如下:
这里写图片描述

配置国际化包范围资源文件与输出国际化信息

在一个大型应用中,整个应用有大量的内容需要实现国际化,如果我们把国际化的内容都放置在全局资源属性文件中,显然会导致资源文件变的过于庞大、臃肿,不便于维护,这时候我们可以针对不同模块、不同的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>

测试结果如下:
这里写图片描述

配置国际化Action范围资源文件与输出国际化信息

我们也可以为某个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}

一切都不必改动,现在就来测试,结果如下:
这里写图片描述

在JSP页面中直接访问某个资源文件

我们亦可使用<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范围的资源文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李阿昀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值