Struts 的国际化也是通过ResourceBundle 完成的。因此,也必须编写资源文件。下面以前面的应用为示例,演示如何实现程序的国际化。
1. 编写资源文件
本示例程序能满足两种语言环境:简体中文和英语。当然,需要满足更多国家的语言也不是问题,只需提供对应的资源文件即可。
下面是两份资源文件:
// 英文的资源文件
username=username
pass=password
login=submit
noname=please enter name
nopass=please enter password
下面是中文的资源文件:
// 中文的资源文件
username=用户名
pass=密码
login=登录
noname=请输入用户名,然后再登录
noname=请输入密码,然后再登录
注意:对于非西欧文字的资源文件,必须使用native2ascii进行转换。
2. 加载资源文件
资源文件的加载通过struts-config.xml文件来配置,加载资源文件应从Web 应用的WEB-INF/classes路径开始加载。因此,
资源文件必须放在WEB-INF/classes路径或该路径的子路径下。
如果直接放在WEB-INF/classes 路径下,在配置资源文件时,直接指定资源文件的baseName 即可。但如果放在子路径下,则必须以包的形式配置。下面的示例程序中的资源文件放在WEB-INF/classesl1ee 下。配置资源文件的
struts-config.xml文件的源代码如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!-- Struts 配置文件的文件头,包含DTD 等信息-->
<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
"http://struts.apache.org/dtds/struts-config_1_2.dtd">
<!-- Struts 配置文件的根元素-->
<struts-config>
<!-- 配置所有的ActionForm-->
<form-beans>
<!-- 配置第一个ActionForm. 指定ActionForm的口arne 和type 属性-->
<form-bean name="loginForm" type="lee.LoginForm" />
</form-beans>
<!--配置全局Forward对象-->
<global-forwards>
<!--该Forward对象的name 属性为error,映射资源为/WEB-INF/jsp/error.jsp -->
<forward name="error" path="/WEB-INF/jsp/error.jsp" />
</global-forwards>
<!--此处配置所有的Action 映射-->
<action-mappings>
<!--配置Action 的path. type 属性name 属性配置Action 对应的ActionForm-->
<action path="/login" type="lee.LoginAction" name="loginForm">
<!--还配置了两个局部Forward. 这两个局部Forward仅对该Action有效-->
<forward name="welcome" path="/WEB-INF/jsp/welcome.jsp" />
<forward name="input" path="/login.jsp" />
</action>
</action-mappings>
<!--配置国际化资源. parameter指定资源文件的位置。-->
<message-resources parameter="lee.messages" />
</struts-config>
Struts 负责加载资源文件, Struts 在应用启动时将加载该资源文件。
注意:如果需要Struts 实现程序国际化,必须将ActionServlet配直成load-on-startup的Servlet,只有这样才可以保证在启动应用时加载该资源文件。
3. 使用bean 标签显示国际化信息
根据前面的国际化示例程序我们知道,程序要实现国际化,则不能将标签及帮助等提示信息以硬编码方式写在程序中,而应使用资源文件的key 。Struts 提供了专门用于国际化的标签bean,关于bean 标签,将在后面深入讲解。此处仅介绍国际化支持使用的bean 标签。为了可以在Web 应用中使用bean 标签,在应该将struts-bean.tid 复制到WEB-INF/路径下,并在web.xml 文件中增加该Struts 标签库的配置。下面的web.xml 文件增加了Struts struts-bean标签库,源代码如下:
<?xml version="1.0" encoding="UTF-8" ?>
<web-app>
<!-- 配置ActionServlet. 并配置成load-on-startup的Servlet-->
<servlet>
<servlet-name>actionSevlet</servlet-name>
<servlet-class>
org.apache.struts.action.ActionServlet
</servlet-class>
<load-on-startup>l</load-on-startup>
</servlet>
<!-- 配置ActionServlet映射的URL-->
<servlet-mapping>
<servlet-name>actionSevlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<!-- 配置struts-bean的标签库-->
<taglib>
<!-- 配置标签库的uri-->
<taglib-uri>/tags/struts-bean</taglib-uri>
<!-- 配置标签库对应的物理位置-->
<taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
</taglib>
</web-app>
经过上面的配置, JSP 页面可以使用bean 标签了,从而可以通过bean 标签显示国际化提示。下面是login.jsp 文件的源代码,该文件中不再以硬编码的方式输出提示,而是输出的资源文件的key:
<%@ page language="java" contentType="text/html;charset=UTF-8"
errorPage="error.jsp"%>
<!-- 增加struts-bean.xml的标签库 -->
<%@ taglib uri="/tags/struts-bean" prefix="bean"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<!-- 使用国际化资源文件的key 输出标题 -->
<title><bean:message key="login" /></title>
</head>
<script>
function check(form)
{if (form.username.value==null ||form.username.value=="" ){
<!-- 使用国际化资源文件的key 输出提示 -->
alert ('<bean:message key="noname"/>') ;
return false; }
else if(form.pass.value==null || form.pass.value=="") {
<!-- 使用国际化资源文件的key 输出提示 -->
alert ('<bean:message key="nopass" />');
return false; }
else return true;
}
</script>
<body>
<font color="red"> <%
if (request.getAttribute("err") != null)
out.println(request.getAttribute("err"));
%> </font>
<form id="login" method="post" action="login.do"
onsubmit="return check(this); ">
<!-- 使用国际化资源文件的key 输出用户名标签 -->
<bean:message key="username" />
<input type="text" name="username" />
<br>
<!-- 使用国际化资源文件的key 输出密码标签 -->
<bean:message key="pass" />
<input name="pass" />
<br>
<!-- 使用国际化资源文件的key 输出登录按钮 -->
<input type="submit" value='<bean:message key="login"/>' />
<br>
</form>
</body>
</html>
因此,实现国际化只需要编写资源文件,然后使用bean 标签输出国际化信息。使用bean 标签,可以大大降低程序国际化的复杂度,这就是使用框架的优势。