浅谈struts国际化

关于struts国际化的一点尝试

做了一个struts国际化的小程序,其实做struts也有快半年了,但感觉一直是只见树木不见林,决定从今天开始好好补课,不然真的要成为流水线的工人了。
下面的例子如有错误,还请各位斧正。
1、修改web.xml文件,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/j2ee/dtds/web-app_2_3.dtd">
<web-app>
       <servlet>
           <servlet-name>action</servlet-name>
           <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
           <init-param>
               <param-name>config</param-name>
               <param-value>/WEB-INF/struts-config.xml</param-value>
           </init-param>
           <init-param>
              <param-name>application</param-name>
              <param-value>com.sharp.struts.ApplicationResources</param-value>
            </init-param>
           <load-on-startup>1</load-on-startup>
       </servlet>
       <servlet-mapping>
           <servlet-name>action</servlet-name>
           <url-pattern>*.do</url-pattern>
       </servlet-mapping>
</web-app>

文件中灰色背景部分为国际化需要增加的内容,其中com.sharp.struts.ApplicationResources跟你的WEB-INF目录下classes下的目录结构是一致的,如下图所示

2、建立资源文件ApplicationResources.source(中文源文件,而不是中文资源文件)、ApplicationResources_en.properties(英文资源文件)。
首先建立ApplicationResources_en.properties文件,内容如下:
owner.greet=Greet
owner.name=Name
owner.address=Address
owner.email=Email
owner.tel=Tel

对应的中文源文件内容如下:
owner.greet=称呼
owner.name=姓名
owner.address=地址
owner.email=电子邮件
owner.tel=联系电话

然后通过在cmd中执行native2ascii -encoding GBK ApplicationResources.source ./ApplicationResources_zh_CN.properties
命令将中文源文件生成UTF-8格式的中文资源文件,内容如下
owner.greet=/u79f0/u547c
owner.name=/u59d3/u540d
owner.address=/u5730/u5740
owner.email=/u7535/u5b50/u90ae/u4ef6
owner.tel=/u8054/u7cfb/u7535/u8bdd
这里介绍一下,native2ascii是JDK包自带的一个工具,如果你不能cmd直接执行native2ascii命令,请检查你的环境变量,这里不具体介绍了。

3、接着来介绍一下struts-config.xml文件的内容,如果熟悉struts的朋友也觉得很简单的
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
<struts-config>
       <!-- ========== Form Bean Definitions ================================== -->
       <form-beans>
           <form-bean name="ownerForm" type="com.sharp.struts.form.OwnerForm">
               <form-property name="Email" type="java.lang.String" />
               <form-property name="Greet" type="java.lang.String" initial="Mr." />
               <form-property name="Address" type="java.lang.String" />
               <form-property name="Tel" type="java.lang.Integer" initial="0" />
               <form-property name="Name" type="java.lang.String" />
           </form-bean>
        
       </form-beans>
    
       <!-- ========== Global Exception Definitions ============================== -->
       <global-exceptions />
    
       <!-- ========== Global Forward Definitions =============================== -->
       <global-forwards>
           <forward name="failure" path="/failure.jsp" />
        
       </global-forwards>
    
       <!-- ========== Action Mapping Definitions =============================== -->
      <action-mappings>
           <action
               attribute="ownerForm"
               input="/owner.jsp"
               name="ownerForm"
               path="/owner"
               type="com.sharp.struts.action.OwnerAction"
               parameter="formAction"><!--因为action类继承DispatchAction类,所以需要设置这个属性-->
               <forward name="owner"      path="/owner.jsp" />
               <forward name="success" path="/success.jsp" />
           </action>
        
       </action-mappings>
    
</struts-config>

4、现在就开始准备java和jsp文件吧
owner.jsp文件内容如下:
<%@ page contentType="text/html;charset=gb2312" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean"%>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html"%>
<html:html locale="true">
<head>
     <meta name = "Generator" content = "Easy Struts Xslt generator for Eclipse (http://easystruts.sf.net/).">
     <title>Struts Form for ownerForm</title>
     <script language="javascript">
         function changeLanguage(language) {
             if(language == "en") {
                 document.all("language").value = "en";
             } else {
                 document.all("language").value = "cn";
             }
             document.forms[0].submit();
         }
     </script>
</head>
<body>
     <html:form action="/owner">
     <input type="hidden" name="formAction" value="changeLanguage">
     <input type="hidden" name="language">
      <bean:message key="owner.greet" /> : <html:select property="greet">
         <html:option value=""></html:option>
         <html:option value="Mr.">Mr.</html:option>
         <html:option value="Miss.">Miss.</html:option>
         <html:option value="Mrs.">Mrs.</html:option>
        </html:select><html:errors property="greet"/></br>   
      <bean:message key="owner.name" /> : <html:text property="name"/><html:errors property="name"/></br>
      <bean:message key="owner.address" /> : <html:text property="address"/><html:errors property="address"/></br>
      <bean:message key="owner.email" /> : <html:text property="email"/><html:errors property="email"/></br>
      <bean:message key="owner.tel" /> : <html:text property="tel"/><html:errors property="tel"/></br>
      <html:submit/>
      <html:cancel/>
      <input type="button" name="langEn" value="英文版" οnclick="changeLanguage('en')">   
      <input type="button" name="langCn" value="中文版" οnclick="changeLanguage('cn')">
     </html:form>
<body>
</html:html>

OwnerAction.java文件内容如下:
// Created by Xslt generator for Eclipse.
// XSL :     not found (java.io.FileNotFoundException:     (Bad file descriptor))
// Default XSL used : easystruts.jar$org.easystruts.xslgen.JavaClass.xsl

package com.sharp.struts.action;

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;
import org.apache.struts.actions.DispatchAction;

import com.sharp.struts.form.OwnerForm;

/**
* OwnerAction.java created by EasyStruts - XsltGen.
* http://easystruts.sf.net
* created on 10-09-2004
*
* XDoclet definition:
* @struts:action path="/owner" name="ownerForm" input="/owner.jsp" validate="true"
* @struts:action-forward name="/success.jsp" path="/success.jsp"
*/
public class OwnerAction extends DispatchAction {

public ActionForward changeLanguage(
     ActionMapping mapping,
     ActionForm form,
     HttpServletRequest request,
     HttpServletResponse response) {

      String language = request.getParameter("language");   
      if (language.equals("en")) {
           request.getSession().setAttribute(Globals.LOCALE_KEY, Locale.ENGLISH);    
      } else {    
           request.getSession().setAttribute(Globals.LOCALE_KEY, Locale.CHINESE);
      }   
           return mapping.findForward("owner");
       }
}
这里需要注意一下,千万不要弄错,我在这里就花费了一个多小时,因为把文件名写错了
Locale.ENGLISH是一个Locale对象,getLanguage()方法返回en,跟资源文件(ApplicationResources_en.properties)的后缀相同
Locale.CHINESE是一个Locale对象,getLanguage()方法返回zh,跟资源文件(ApplicationResources_zh_CN.properties)的后缀相同

另外还用到一个ownerForm.java文件,内容如下:
// Created by Xslt generator for Eclipse.
// XSL :     not found (java.io.FileNotFoundException:     (Bad file descriptor))
// Default XSL used : easystruts.jar$org.easystruts.xslgen.JavaClass.xsl

package com.sharp.struts.form;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;

/**
* OwnerForm.java created by EasyStruts - XsltGen.
* http://easystruts.sf.net/
* created on 10-09-2004
*
* XDoclet definition:
* @struts:form name="ownerForm"
*/
public class OwnerForm extends ActionForm {

// --------------------------------------------------------- Instance Variables

/** Email property */
private String email;

/** Greet property */
private String greet = "Mr.";

/** Address property */
private String address;

/** Tel property */
private int tel = 0;

/** Name property */
private String name;
// --------------------------------------------------------- Methods
......
//getter,setter mothod,这里不赘列了

}

5、总结
这样一个国际化的小例子就可以运行了,不过上面写得比较粗略,需要对java和struts有一定了解。
网上对国际化也有其他的做法,也可以参考。
如果上述有所偏颇,敬请斧正。

本想自己写一些东西的,但后来发现网上有为兄弟(不知是男是女,暂且成为兄弟)写的非常好,于是就把它的贴了上来!

写一些我个人在做struts中碰到的问题.

jsp页面上显现的语言种类和浏览器里设置的是一致的,在设置了多个语言的浏览器里是和最顶的那个语言一致的。如果中文在最上面,page上显示的就是中文,如果日文在上面page上显示的就是该死的日文(这一且的前提是你要有对应的资源文件!)。

  

至于struts是怎么知道该选那种资源文件来显示呢? 那就要看这句了!

request.getSession().setAttribute(Globals.LOCALE_KEY, Locale.ENGLISH);     

session中的Globals.LOCALE_KEY中存放着需要在页面上显示的语言种类,你也可以像上面的例子那样去修改Globals.LOCALE_KEY,让他根据你的喜好去显示相应的资源文件,而不是浏览器中设置的语言。

上面那个例子中使用了DispatchAction,如果对这个东西不明白的话,最好亲自去看一看,不然上面那个例子你可能不会太明白! 我自己也写了个,但用的是一般的action,下面是我写的:

package com.sharp.struts.action;

import java.util.Locale;

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

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

/**
* @author Administrator
*
* To change the template for this generated type comment go to
* Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
*/
public class ChangeAction extends Action{

public ActionForward execute(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response){
     Locale locale = getLocale(request);
        String language = request.getParameter("language");   
        System.out.println(request.getSession().getAttribute(Globals.LOCALE_KEY));
        if (language.equals("en")) {
       request.getSession().setAttribute(Globals.LOCALE_KEY, Locale.ENGLISH);    
        } else {    
       request.getSession().setAttribute(Globals.LOCALE_KEY, Locale.JAPANESE);
        }   
       return mapping.findForward("success");
      }
  
}

比较简单! 不过初学还是越简单越好!

今天就到这里了,改天想起什么再往上贴! 有不正之处还往路过的朋友指出!

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值