第 9 章 Struts2 国际化
在第 1 章综述中笔者已经将国际化的基本概念做了简单说明。本章扩展国际化内容,向读者展示在 Struts2 中应用国际化的各种范例。
9.1 Struts2 国际化基础应用
本节首先介绍国际化在 Struts2 中的基础使用方法。主要介绍基础使用方式的原理以及如何使用占位符号来实现 Web 项目国际化功能的开发。
9.1.1 国际化基础使用方式
技术要点
以登录功能为例,来介绍如何实现中文、英文的国际化。
= 国际化属性文件定义原理。
= ActionSupport 类中 getText 方法基础说明。
= 视图界面中如何显示国际化信息。
演示代码
使用的 Action 文件:
- <!-------------文件名:LoginAction.java--------------->
- public class LoginAction extends ActionSupport {
- ………
- public String execute() throws Exception {
- username = getUsername(); // 属性值即JSP页面上输入的值
- password = getPassword(); // 属性值即JSP页面上输入的值
- try {
- // 判断输入值是否是空对象或没有输入
- if (username != null && !username.equals( "" ) && password != null && !password.equals( "" )) {
- ActionContext.getContext().getSession().put( "user" , getUsername());
- //打印getText方法,取得属性文件中定义的值
- System.out.println(getText( "username" )+username);
- System.out.println(getText( "password" )+password);
- // 根据标志内容导航到操作成功页面
- FORWARD = "success" ;
- } else {
- // 根据标志内容导航到操作失败页面
- FORWARD = "input" ;
- }
- } catch (Exception ex) {
- ex.printStackTrace();
- }
- return FORWARD;
- }
- ………
- }
<!-------------文件名:LoginAction.java---------------> public class LoginAction extends ActionSupport { ……… public String execute() throws Exception { username = getUsername();// 属性值即JSP页面上输入的值 password = getPassword();// 属性值即JSP页面上输入的值 try { // 判断输入值是否是空对象或没有输入 if (username != null && !username.equals("") && password != null&& !password.equals("")) { ActionContext.getContext().getSession().put("user", getUsername()); //打印getText方法,取得属性文件中定义的值 System.out.println(getText("username")+username); System.out.println(getText("password")+password); // 根据标志内容导航到操作成功页面 FORWARD = "success"; } else { // 根据标志内容导航到操作失败页面 FORWARD = "input"; } } catch (Exception ex) { ex.printStackTrace(); } return FORWARD; } ……… }
属性文件中国际化定义:
- <!--------------文件名:struts.properties-------------->
- #支持本地化的资源文件名定义
- struts.custom.i18n.resources=messageResource
<!--------------文件名:struts.properties--------------> #支持本地化的资源文件名定义 struts.custom.i18n.resources=messageResource
支持中文的属性文件内容:
- <!------------文件名:messageResource_zh_CN.properties------->
- #中文属性定义文件
- #用key=value格式定义页面上显示的内容
- username=用户名
- password=密 码
- loginSubmit=登录
- loginPage=登录页面
- successPage=操作成功页面
- welcome=欢迎您
- user.required=请输入用户名!
- pass.required=请输入密码!
<!------------文件名:messageResource_zh_CN.properties-------> #中文属性定义文件 #用key=value格式定义页面上显示的内容 username=用户名 password=密 码 loginSubmit=登录 loginPage=登录页面 successPage=操作成功页面 welcome=欢迎您 user.required=请输入用户名! pass.required=请输入密码!
支持英文的属性文件内容:
- <!--------文件名:messageResource_en_US.properties----------->
- #英文属性定义文件
- #用key=value格式定义页面上显示的内容
- username=User Name
- password=User Password
- loginSubmit=login
- loginPage=login page
- successPage=success page
- welcome=Welcome You
- user.required=please input your name!
- pass.required=please input your password!
<!--------文件名:messageResource_en_US.properties-----------> #英文属性定义文件 #用key=value格式定义页面上显示的内容 username=User Name password=User Password loginSubmit=login loginPage=login page successPage=success page welcome=Welcome You user.required=please input your name! pass.required=please input your password!
国际化的登录 login.jsp
- <!-----------------文件名:login.jsp----------------->
- ………
- <html>
- <head>
- <title><s:text name= "loginPage" ></s:text></title>
- </head>
- <body>
- <!-- form标签库定义,以及调用哪个Action声明 -->
- <s:form action= "Login" >
- <table width= "60%" height= "76" border= "0" >
- <!-- 各标签定义 -->
- <s:textfield name= "username" key= "username" />
- <s:password name= "password" key= "password" />
- <s:submit key= "loginSubmit" align= "center" />
- </table>
- </s:form>
- </body>
- </html>
<!-----------------文件名:login.jsp-----------------> ……… <html> <head> <title><s:text name="loginPage"></s:text></title> </head> <body> <!-- form标签库定义,以及调用哪个Action声明 --> <s:form action="Login"> <table width="60%" height="76" border="0"> <!-- 各标签定义 --> <s:textfield name="username" key="username"/> <s:password name="password" key="password" /> <s:submit key="loginSubmit" align="center"/> </table> </s:form> </body> </html>
国际化的登录成功 success.jsp 文件:
- <!----------------文件名:success.jsp------------------->
- ………
- <head>
- <title><s:text name= "successPage" ></s:text></title>
- </head>
- <body>
- <!-- 取得session中用户名值 -->
- ${sessionScope.user},<s:text name= "welcome" ></s:text>
- </body>
- …………
<!----------------文件名:success.jsp-------------------> ……… <head> <title><s:text name="successPage"></s:text></title> </head> <body> <!-- 取得session中用户名值 --> ${sessionScope.user},<s:text name="welcome"></s:text> </body> …………
中文的登录界面如图 9.1 。
图 9.1 中文登录界面
英文的登录界面如图 9.2 。
图 9.2 英文登录界面
中文登录成功界面如图 9.3 。
图 9.3 中文登录成功界面
英文登录成功界面如图 9.4 。
图 9.4 英文登录成功界面
LoginAction 代码中打印在控制台用户名和密码值(支持中文)如图 9.5 。
图 9.5 中文属性值控制台打印信息
LoginAction 代码中打印在控制台用户名和密码值(支持英文)如图 9.6 。
图 9.6 英文属性值控制台打印信息
代码解释
( 1 ) 本节是 Struts2 国际化最基本的应用。首先请读者阅读 struts.properties 文件中代码。“ struts.custom.i18n.resources ”并不是笔者随意取的名字。它是 Struts2 设计者定义的使用全局国际化属性文件的常量名。如果对它进行了定义,则开发者可以在 Web 项目中使用类似 XXX_language_country.properties 这样的属性文件名格式来创建在不同语言环境中的属性文件。这也就是在上述代码中有“ messageResource_zh_CN.properties ”和“ messageResource_en_US.properties ”这两个各支持中文和英文的属性文件名的由来。因为笔者在 struts.properties 文件中定义了“ struts.custom.i18n.resources ”值为 messageResource ,这样 messageResource 作为属性文件名,可以实现各个支持不同国家语言的国际化属性文件。
注意:其实关于国际化属性文件名的定义不仅仅可以在 struts.properties 中定义,也可以在 struts.xml 和 web.xml 这两个配置文件中定义。之所以不在这里介绍,具体原因在第四章介绍如何实现上传下载功能的拦截器篇章已经记述,这里不再重复说明。如果读者对在两个 xml 文件中定义国际化属性文件名又兴趣,可自行查阅其它技术文摘。
( 2 ) LoginAction 继承 ActionSupport 类,可以使用 ActionSupport 中 getText 方法。这里 getText 方法中的字符串参数都是在国际化属性文件中定义的 key 。之前章节也说明过属性文件中定义格式都是以“ key=value ”格式定义。 getText 方法得到 key 作为方法参数,返回的结果就是 value 。从图 9.5 、图 9.6 也可以看出在两个国际化属性文件中“用户名”和“密码”的 value 是不相同的,因此在不同的语言环境下得到的值就不同了。一个是中文另一个是英文。
注意: getText 方法在 ActionSupport 中是重载方法。因此它还有几个重名的 getText 方法,具体使用在有占位符的国际化属性文件中。稍后章节将具体介绍。
( 3 )在 login.jsp 和 success.jsp 中,笔者使用 struts2 标签 <text> 。该标签的 name 属性定义为属性文件中的“ key ”,在 Struts2 的 Action 中 getText 方法就可以将 value 的值显示在视图界面上。而在其他 struts2 标签中,增加 key 属性的定义,也可以将国际化属性文件中的 value 值作为各个标签的值显示在视图界面上。比如“ <s:textfield name="username" key="username"/> ”在原先可以使用 label 属性定义显示值。现在使用 key 属性,在不同语言环境下 username 这个 key 得到的 value 值就不同。效果见图 9.1 、图 9.2 。
注意: Struts2 中有个名字为 i18n 的拦截器,它的使用目的就是在 Action 执行前查看 Session 中的 request_locale 参数的值是什么。如果是“ zh_CN ”它就将之后执行的所有 Action 的语言环境设置为中文语言环境。如果是“ en_US ”则是英文语言环境。在本示例和接下来的示例中,读者可以在操作系统下的“控制面板 à 区域和语言选项”中选择区域来查看在英文和中文语言环境下示例显示的异同。当然也可以直接在浏览器的地址栏中在 action 请求后面写上“? request_locale=zh_CN ”这样的数据。具体可以这么写的原因就是通过手工输入的 request_locale 值,来让 i18n 拦截器得到该值进行相关语言设置