Struts2之国际化

Struts2的国际化的步骤与Java国际化的步骤基本相似,只是实现更加简单Strut2的国际化可以按如下步骤进行。

(1).        让系统加载国际化资源。加载国际化资源文件有两种方式。

1)        自动加载:Action范围的国际化资源文件、包范围的国际化资源文件由系统自动加载。

2)        手动加载:JSP范围的国际化资源文件、全局范围的国际化资源文件,分别使用标签、配置常量的方式来手动加载

 2.        输出国际化。struts2输出国际化消息同样有两种方式。

1)        在视图页面上输出国际化消息、需要使用Struts2的标签库

2)        在Action类中输出国际化消息,需要使用ActionSupport的getText()方法来完成。

1. 视图页面的国际化

在JSP页面中指定国际化资源需要借助Struts2的另外一个标签:<s:i18n…/>。

如果把<s:i18n…/>标签作为<s:text…/>标签的父类标签,则<s:text…/>标签将会直接加载<s:i18n…/>标签里指定的国际化资源文件;如果把<s:i18n…/>标签当成表单标签父类标签,则表单标签的key属性将会从国际化资源文件中加载该信息。

(1).        定义资源文件,下面分别是中文的、英文的,可以将native2ascii命令处理文件,将文件放到项目的src下,并建立一个文件夹来存放viewResources。

    Ø  loginForm_zh_CN.properties

#在JSP页面使用的JSP范围的资源文件
loginPage=JSP消息:登录页面
user=JSP消息:用户名
pass=JSP消息:密  码
login=JSP消息:登录

Ø  loginForm_en_US.properties

loginPage=JSP Message:Login Page
user=JSP Message:User Name
pass=JSP Message:User Pass
login=JSP Message:Login

(2).        JSP视图上的应用

 <%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
  <%@taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html >
<s:i18n name="viewResources.loginForm">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title><s:text name="loginPage"></s:text></title>
</head>
<body>

    <s:form method="post" action="login">
        <s:textfield name="username" key="user"/>
        <s:textfield name="password" key="pass"/>
        <s:submit key="login"/>
    </s:form>
</body>
</html>
</s:i18n>

2. Action的国际化

(1).        创建资源文件,汪意要放在使用的Action所在有包下.这个时候命名是用ActionName_language_country.property。如果是在项目即src下,所有的包都可用,那么命名是:package_<language>_<country>.property,如package_zh_CN.properties

     Ø  LoginAction_zh_CN.properties

 failTip=Action消息:对不起,您不能登录!
succTip=Action消息:欢迎,您已经登录!
username.required=Action消息:用户名是必需的!

  Ø  LoginAction_en_US.properties

 failTip=Action Scope:Sorry,You can't log in!
succTip=Action Scope:welcome,you has logged in!
username.required=Action Scope: User Name is required!

(2).        创建Actionr的类

 public class LoginAction extends ActionSupport
{
	// 下面定义了两个成员变量,用于封装请求参数
	private String username;
	private String password;

	// username的setter和getter方法
	public void setUsername(String username)
	{
		this.username = username;
	}
	public String getUsername()
	{
		return this.username;
	}

	// password的setter和getter方法
	public void setPassword(String password)
	{
		this.password = password;
	}
	public String getPassword()
	{
		return this.password;
	}

	// 处理用户请求的execute()方法
	public String execute() throws Exception
	{
		ActionContext ctx = ActionContext.getContext();
		if (getUsername().equals(“owen")
			&& getPassword().equals("owen"))
		{
			ctx.getSession().put("user" , getUsername());
			// 获取国际化消息
			ctx.put("tip" , getText("succTip"));
			return SUCCESS;
		}
		// 获取国际化消息
		ctx.put("tip" , getText("failTip"));
		return ERROR;
	}
}
(3).创建Action的校验规则文件:LoginAction-validation.xml

 <?xml version="1.0" encoding="GBK"?>
<!DOCTYPE validators PUBLIC
	"-//Apache Struts//XWork Validator 1.0.3//EN"
	"http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<validators>
	<!-- 校验Action的name属性 -->
	<field name="username">
		<!-- 指定name属性必须满足必填规则 -->
		<field-validator type="requiredstring">
			<param name="trim">true</param>
			<message key="username.required"/>
		</field-validator>
	</field>
</validators>

3. 带占位符的国际化

在Struts2中则有更简单的方式来填充占位符,Struts2中提供了如下两种方式来填充:

(1).        如果需要在JSP页面中填充国际化消息里的占位符,则可以通过在<s:text…/>标签中使用多个<s:param…/>标签来填写消息占位符。

(2).        如果需要在Action中填充国际化消息里的占位符,则可以通过调用getText(String aTextName,Listargs)或getText(Stringkey,String[] args)方法来填充占位符。

下面笔者通过例子来说明。

1)        创建资源文件:

Ø  result_zh_CN.properties

  resultPage=登录结果
welcomeMsg={0},您好!现在时间是{1}!

Ø  result_en_US.properties

resultPage=Log In Result
welcomeMsg={0},Hello!Now is {1}!

2)        在JSP视图的应用

  <%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html>
<s:i18n name="viewResources.result">
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=GBK" />
	<title><s:text name="resultPage"/></title>
</head>
<body>
	<jsp:useBean id="d" class="java.util.Date" scope="page"/>
	${requestScope.tip}<br/>
	<!-- 输入带占位符的国际化消息 -->
	<s:text name="welcomeMsg">
		<s:param><s:property value="username"/></s:param>
		<s:param>${d}</s:param>
	</s:text>
</body>
</html>
</s:i18n>

3)        在Action中应用

 public class LoginAction extends ActionSupport
{
	// 下面定义了两个成员变量,用于封装请求参数
	private String username;
	private String password;

	// username的setter和getter方法
	public void setUsername(String username)
	{
		this.username = username;
	}
	public String getUsername()
	{
		return this.username;
	}

	// password的setter和getter方法
	public void setPassword(String password)
	{
		this.password = password;
	}
	public String getPassword()
	{
		return this.password;
	}

	// 处理用户请求的execute方法
	public String execute() throws Exception
	{
		ActionContext ctx = ActionContext.getContext();
		if (getUsername().equals("owen")
			&& getPassword().equals("owen"))
		{
			ctx.getSession().put("user" , getUsername());
			// 获取国际化消息
			ctx.put("tip" , getText("succTip" , new String[]{username}));
			return SUCCESS;
		}
		// 获取国际化消息
		ctx.put("tip" , getText("failTip" , new String[]{username}));
		return ERROR;
	}
}

4. 总结

   这里笔者向大家介绍了Sruts2的国际化,其实也就是两大部分,那就是在JSP的视图中应用与在Action中应用。在JSP中应用,那么注意在加上<s:i18n…/>的标签,并且资源是放在项目下命名要与使用的*.jsp的命名一样。如果是在Action中应用,那么就要注意你资源所放的位置是在哪,那么命名也是不一样的。最后,后大家介绍了关于国际化占位符的应用,这个在实际中应用是关键的。














你可能感兴趣的:(java,jsp,struts2,Web应用)