Strutsはi 18 n問題を完璧に解決する

7847 ワード

i 18 n問題とは国際化の問題で、簡単に言えば、私たちのソフトウェアは世界でどんな言語を使っている人たちが使用できるようにすることです.ソフトウェア自体は言語環境によって自動的に構成されます.もしあなたが中国語環境であれば、インタフェースは中国語で表示され、英語環境であれば英語で表示されます.i 18 n問題の解決では、国際化されたリソースファイルは不可欠であり、プログラムは、リソースファイルの読み取りによって、どのようなインタフェースで表示されるかを決定する.ここで、国際化リソースファイルが異なる言語バージョンの表示問題を解決するだけだと思っている場合は、間違っています.国際化リソースファイルを構成することで、メッセージの動的作成と表示を実現することができます.次に、strutsがi 18 n問題をどのように解決するかを例によって詳しく説明します.
 
まず、国際化リソースファイルを簡単に理解します.国際化リソースファイルはbasename+local+.propertiesで構成され、localは言語環境を指し、デフォルトのlocalはオペレーティングシステムによって決定され、localは言語と国家コードから構成され、basenameはMessagesBundleであり、中国語を例にとると、そのリソースファイル名は:MessagesBundle_zh_CN.properties、デフォルトの国際化リソースファイル名はMessagesBundle.propertiesです.このファイルでは、key-value形式で格納され、すべてのkeyが1つのvalue値に対応し、プログラムはファイルのkey値を読み取ることで表示すべきテキストを決定する.次に、strutsを使用してリソースファイルをどのように適用してi 18 n問題を解決するかを例に説明します.
1.  strutsの国際化構成.struts-config.xmlファイルにを追加します.注意parameterの値は、国際化リソースファイルが存在するパスです.国際化リソースファイルがsrcの次のresourcesというフォルダの下にある場合、ここでparameterの値は「resources.MessageResources」になります.
<?xml version="1.0" encoding="ISO-8859-1" ?>

<!DOCTYPE struts-config PUBLIC
          "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
          "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">

<struts-config>
	<form-beans>
		<form-bean name="loginForm" type="com.bjpowernode.struts.LoginActionForm"/>
	</form-beans>
	
	<action-mappings>
		<action path="/login"
				type="com.bjpowernode.struts.LoginAction"
				name="loginForm"
				scope="request"
				>
				<forward name="success" path="/login_success.jsp"/>
				<forward name="error" path="/login.jsp"/>
		</action>
		
		<action path="/changLang"
				type="com.bjpowernode.struts.ChangeLanguageAction"
		>
			<forward name="index" path="/index.jsp"></forward>
		</action>
	</action-mappings>
	
	<message-resources parameter="resources.MessageResources"/>
</struts-config>

2.  国際化されたリソースファイルを提供します.この例では、中国語の国際化リソースファイルMessageResources_の3つの国際化リソースファイルを提供します.zh_CN.properties、英語の国際化リソースファイルMessageResources_en_US.propertiesおよびデフォルトの国際化リソースファイル:MessageResources.properties.注意中国語の国際化ファイルでは、すべての中国語をunicode符号化フォーマットに変換する必要があります.
3.strutsのデフォルトでlocaleをsessionに配置する特性を利用して、言語の自動切り替えを完了することができます.
package com.bjpowernode.struts;

import java.util.Locale;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.Globals;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

public class ChangeLanguageAction extends Action {

	@Override
	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		//           
		String lang = request.getParameter("lang");
		
		//  session    locale
		Locale locale = Locale.getDefault();
		
		//         “zh” locale    ,     “en”  locale    
		if("zh".equals(lang)){
			locale = new Locale("zh","CN");
		}else if("en".equals(lang)){
			locale = new Locale("en", "US");
		}
		// locale   session 
		//request.getSession().setAttribute(Globals.LOCALE_KEY, locale);
		this.setLocale(request, locale);
		return mapping.findForward("index");
	}	
}

4.国際化されたリソースファイルの役割は、言語環境の転換だけでなく、ページの個性化設計や動的メッセージの作成もサポートしています.次に、英語のリソースファイルを提供し、このファイルを例に動的メッセージの作成について説明します.
4.1  英語の国際化リソースファイル:
errors.header=<UL>
errors.prefix=<font color="blue"><LI>
errors.suffix=</LI></font>
errors.footer=</UL>
login.form.field.username=User Name
login.form.field.password=Password
login.form.button.login=Login
login.success={0},Login Success
login.user.not.found=User Not Found,UserName\=[{0}] 
login.password.error=Password Error

4.2  動的メッセージを作成します.動的メッセージの作成には、次の3つのステップがあります.         国際化メッセージテキストを作成し、国際化メッセージテキストを渡し、国際化メッセージテキストを表示します.上のリソースファイルでは、プレースホルダの存在が表示されます.プレースホルダの存在は、プレースホルダを埋め込むことによって動的情報を作成する方法を示します.
package com.bjpowernode.struts;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;

public class LoginAction extends Action {

	@Override
	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
			
		LoginActionForm laf = (LoginActionForm)form;
		String username = laf.getUsername();
		String password = laf.getPassword();
		
		UserManager userManager = new UserManager();
		ActionMessages messages = new ActionMessages();
		try{
			userManager.login(username, password);
			//         
			
			//ActionMessage message = new ActionMessage("login.success",new Object[]{username});
			ActionMessage message = new ActionMessage("login.success",username);
			messages.add("login_success_1",message);
			
			ActionMessage message1 = new ActionMessage("login.success",username);
			messages.add("login_success_2",message1);
			
			//       
			this.saveMessages(request, messages);	
			return mapping.findForward("success");
		}catch(UserNotFoundException e){
			e.printStackTrace();
			//         
			ActionMessage error = new ActionMessage("login.user.not.found",username);
			messages.add("error_1",error);
			
			//       
			this.saveErrors(request, messages);

		}catch(PasswordErrorException e){
			e.printStackTrace();
			//         
			ActionMessage error = new ActionMessage("login.password.error");
			messages.add("error_2",error);

			//       
			this.saveErrors(request, messages);
		}
		return mapping.findForward("error");
	}
	
}

上のコードの文に注意してください:ActionMessage=new ActionMessage(「login.success」、username);この文の役割は、国際化されたリソースファイルのプレースホルダを埋め込むことです.これにより、メッセージを動的に作成できます.
5.jspではを用いて国際化メッセージテキストを読み出す(この例ではログイン成功後のページを例に挙げる).
<%@ page language="java" contentType="text/html; charset=GB18030"
    pageEncoding="GB18030"%>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>
<!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=GB18030">
<title>Insert title here</title>
</head>
<body>
	<html:messages id="msg" message="true" >
		<bean:write name="msg"/>
	</html:messages>
</body>
</html>

このjspではhtml:messagesタグを用いて情報を読み取るが、ここで注意しなければならないのは、このタグはmessage keyとerror keyを読み取ることができ、html:errorタグはerror keyのみを読み取ることができることである.これにより,エラー処理ページと成功ページで具体的にどのラベルを用いて読み取るかを決定できる.また、jstlラベルを使用すると、国際化されたリソースファイルのメッセージを同様に読み取ることができ、jstlフォーマットラベルライブラリを導入した後、ラベルを使用してエラー情報を読み取ることができ、ラベルを使用してメッセージを読み取ることができます.