下面将结合代码示例详细讲解 Struts2 的国际化实现方式。
一、国际化实现的基本原理
Struts2 的国际化实现是通过多资源包机制来实现的。在一个 web 应用程序中,我们可以定义多个资源包,每个资源包对应不同的语言/国家 locale,当系统的 locale 和资源包的 locale 匹配时,Struts2 会自动使用该 locale 对应的资源文件。一般情况下,我们需要定义一个默认的资源包来存储系统默认语言的资源信息。
二、国际化实现的具体步骤
1.定义资源信息
在项目的资源目录下,我们需要新建一个资源文件,命名为 resources.properties,该文件中定义的是系统默认语言(一般为英文)的资源信息,格式为 key-value 对,其中 key 可以为任意命名,value 为对应的资源内容。如下:
hello=Hello
world=World
当需要增加其他语言时,我们需要新建对应语言的资源文件,并将文件命名为 resources_locale.properties,其中 locale 为 ISO 639-1 标准定义的语言代码。如 resources_zh.properties 表示中文资源。在该文件中,同样需要按照 key-value 对的格式定义资源信息,如下:
hello=你好
world=世界
2.在 Struts2 中配置资源包
在 Struts2 的配置文件(struts.xml)中,我们需要增加一个用于配置资源包的拦截器。如下:
<package name="default" extends="struts-default">
<interceptors>
<interceptor name="i18n" class="com.opensymphony.xwork2.interceptor.I18nInterceptor"/>
</interceptors>
<action name="hello" class="com.example.HelloAction">
<result name="success">/hello.jsp</result>
</action>
</package>
在该配置中,我们在 default 的 package 中增加了一个 i18n 的 interceptor,用于配置资源文件的国际化信息。同时,我们在 package 中定义一个 action,用于处理请求,并在请求成功时返回 /hello.jsp 页面。
3.在 JSP 中使用资源信息
在 JSP 中,我们使用 Struts2 的标签库进行资源信息的读取和显示。如下:
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head><title>Hello World</title></head>
<body>
<s:text name="hello"/> <s:text name="world"/>
</body>
</html>
在该 JSP 页面中,我们使用了 s:text 标签来显示资源信息。其中 name 属性对应资源文件中的 key 值,Struts2 会自动根据当前系统的 locale 来匹配对应的资源包,从而加载对应的资源信息。如此,即可实现国际化资源的动态切换。
三、示例代码
在上述步骤中,我们已经初步了解了 Struts2 的国际化实现方式。为了更好地理解和掌握实现方式,下面为大家提供两个示例代码。
1.示例 1
该示例通过在 Struts2 中配置多个资源文件来实现不同语言(中文,英文)的资源动态切换。实现过程中,我们需要在 JSP 页面中实现动态切换资源文件的下拉框。
实现过程如下:
1.新建资源文件:在 src/main/resources 目录下新建两个资源文件:
resources_zh.properties
hello=你好
world=世界
resources_en.properties
hello=Hello
world=World
2.在 struts.xml 中配置国际化拦截器:
<interceptors>
<interceptor name="i18n" class="com.opensymphony.xwork2.interceptor.I18nInterceptor">
<param name="paramName">lang</param>
<param name="excludeParams">false</param>
</interceptor>
</interceptors>
其中 paramName 指定了选择资源文件的参数名称,excludeParams 为是否排除其他参数。
3.在 action 中获取资源文件:
public class HelloAction extends ActionSupport {
private static final long serialVersionUID = 1L;
private String language;
public String execute() {
Map<String, Object> session = getSession();
if (StringUtils.isEmpty(language)) {
language = "zh";
}
session.put(I18nInterceptor.DEFAULT_SESSION_ATTRIBUTE, language);
return SUCCESS;
}
public String getLanguage() {
return language;
}
public void setLanguage(String language) {
this.language = language;
}
private Map<String, Object> getSession() {
return ActionContext.getContext().getSession();
}
}
在该 action 中,我们定义了 language 属性,用于存储系统当前的语言。同时,我们重写了 execute() 方法,该方法会将当前语言信息存储到 session 中,以便在动态切换资源文件时使用。
4.在 JSP 中使用 s:select 标签展示资源文件:
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title><s:text name="hello"/> Struts2</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<s:form action="hello" method="post" >
<s:select name="language" list="#{'zh': '中文', 'en': 'English'}" headerKey=""
headerValue="Please Choose Language" label="选择语言"
value="%{language}" onChange="this.form.submit()" />
<s:text name="hello"/> <s:text name="world"/>
</s:form>
</body>
</html>
该 JSP 页面中展示了 s:select 标签,用于动态切换资源文件。通过该标签,我们可以实现将已知的语言列表展示在页面上,并根据用户选择调整资源文件。同时,我们使用 s:text 标签展示了对应的资源信息。
2.示例 2
该示例通过在 Struts2 中配置动态资源文件的存储路径,强制 Struts2 在运行时重新加载资源文件,从而实现资源动态更新的效果。
实现过程如下:
1.从配置文件中获取存储路径:
在 struts.xml 中增加配置信息:
<constant name="struts.custom.i18n.resources" value="/WEB-INF/classes/com/example/resources" />
该配置指定了 Struts2 加载动态资源文件的存储路径。
2.编写测试方法:
public void testReload() throws FileNotFoundException {
String resourceFilename = "message";
String resourceFilePath = request.getSession().getServletContext().getRealPath("") + "/WEB-INF/classes/com/example/resources";
File resourceFolder = new File(resourceFilePath);
Assert.assertTrue(resourceFolder.isDirectory());
Map<String, String> resourcesMap = new HashMap<>();
Resources resources = new Resources(resourceFilename);
propertiesFile = new File(resourceFilePath, resourceFilename + ".properties");
propertiesFile.delete();
Assert.assertFalse(propertiesFile.exists());//删除属性文件
resourceManager.get().setReloadBundles(true);//开启动态文件读取
wait(3000);//等待动态更新
resourcesMap = resources.getResources(key);
Assert.assertNull(resourcesMap.get(key));//动态资源不包含被删除的属性文件内容
}
在该测试方法中,我们实现了动态更新资源文件的测试方法。通过删除对应的资源文件,然后等待 Struts2 重新加载并更新资源文件,最后再次获取资源时,可以看到返回的资源信息已经是最新的。
以上就是 Struts2 的国际化实现方式示例的完整攻略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Struts2 的国际化实现方式示例 - Python技术站