自定义JSP标签实现语言国际化(类似struts text标签),并同时支持图片、JS文件国际化

2 篇文章 0 订阅
0 篇文章 0 订阅

源代码及样例下载地址:
http://download.csdn.net/detail/u014569459/7169385
一、功能说明:
1. 支持语言国际化
2. 支持图片文件、JS文件国际化
(未加入java代码中获取资源串信息功能,后期可以扩展补充)
二、使用说明:
1. 将jm_localization.jar(JDK 1.6编译)文件拷贝到WEB-INF目录下lib目录下
2. 将localization.tld文件拷贝到WEB-INF目录下tld目录下
3. 页面头部要包含
<%@ taglib uri="/WEB-INF/tld/localization.tld" prefix="fmt"%>
4. 资源文件的字符集为UTF-8
5. 需要在web.xml文件中配置如下servlet
  <servlet>
    <servlet-name>ResServlet</servlet-name>

    <servlet-class>cn.jerry.mouse.ResServlet</servlet-class>
    <init-param>
      <param-name>resource</param-name>
      <param-value>/WEB-INF/classes/resources/res</param-value>
    </init-param>
    <load-on-startup>0</load-on-startup>
  </servlet>
6. 资源文件放到src目录下的resource目录中,命令为res.properties、res_zh_CN.properties等,如果要改变目录或者文件名,则相应修改web.xml中路径配置即可。
7. 图片名称后缀要跟上语言识别,如button_login_zh_CN.gif
<input type="image"src=<fmt:file path="images/button_login.gif"/> border="0"οnclick=doLogin();>
8. js文件名称要跟上语言识别,如validation_en_US.js
样例:
<script language="JavaScript" src=<fmt:file path="js/validation.js"/>></script>
9. 使用文本标签:
样例:<fmt:message key="login.name" />

主要代码:

package cn.jerry.mouse;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpSession;

import cn.jerry.mouse.jsptag.Resource;

public class ResServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected HttpSession session;

	protected ServletContext sc;

	public void init(ServletConfig _config) throws ServletException {
		super.init(_config);

		Resource.init(_config.getServletContext()
				.getRealPath("/")
				+ _config.getInitParameter("resource"));

		this.sc = _config.getServletContext();

	}
}
package cn.jerry.mouse.jsptag;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Properties;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

public class Resource {
	private final String PROPERTIES = ".properties";
	private final String FILE_CHARACTER_SET = "UTF-8";
	private static String configFile;
	private String language;
	public static final String SYSTEM_LANGUAGE = "system_lanuage";

	private Map
   
   
    
     propsMap = new HashMap
    
    
     
     ();

	public Resource() {
	}

	public Resource(String _language) {
		this.language = _language;
	}

	public Resource(Locale _locale) {
		this.language = getLanguage(_locale);
	}

	public Resource(HttpServletRequest request) {
		this.language = getLanguage(request);
	}

	public static void init(String _configFile) {
		configFile = _configFile.replace('\\', '/');
	}

	public void refreshLoacle(HttpServletRequest _request) {
		String localeStr = getLanguage(_request.getLocale());
		if (propsMap.get(localeStr) == null) {
			try {
				propsMap.put(localeStr, getPropeties(localeStr));
			} catch (Exception e) {
			}
		}
	}

	public String getLanguage(Locale _locale) {
		if (_locale == null)
			return "";
		String localeString = "";
		String country = _locale.getCountry();
		String language = _locale.getLanguage();

		if (country == null || "".equals(country))
			localeString = language;
		else
			localeString = language + "_" + country;

		return localeString;
	}

	/**
	 * 获取语言属性。 先检查session中是否有语言属性设置,再request变量中带有locale属性。
	 * @param request
	 * @return 用户选定的语言属性
	 */
	public String getLanguage(HttpServletRequest request) {
		HttpSession session = request.getSession();
		Locale locale = request.getLocale();
		return getLanguage(session, locale);
	}

	public String getLanguage(HttpSession session, Locale locale) {
		if (session.getAttribute(SYSTEM_LANGUAGE) != null)
			return (String) session.getAttribute(SYSTEM_LANGUAGE);
		else {
			return getLanguage(locale);
		}
	}

	public Properties getPropeties(String _language) throws Exception {
		Properties props = new Properties();
		File file = new File(LocalFile.getFile(configFile + PROPERTIES,
				_language));
		BufferedReader br = new BufferedReader(new InputStreamReader(
				new FileInputStream(file), FILE_CHARACTER_SET));
		String line;
		while ((line = br.readLine()) != null) {
			if (line.trim() != "" && line.indexOf("=") != -1) {
				String key = line.split("=")[0].trim();
				String value = line.split("=")[1].trim();
				props.put(key, value);
			}
		}
		br.close();

		return props;
	}

	public String get(String _key, String _language) {
		String value = "";
		if (propsMap.get(_language) == null) {
			try {
				propsMap.put(_language, getPropeties(_language));
			} catch (Exception e) {
			}
		}
		if (propsMap.get(_language) != null) {
			Properties props = propsMap.get(_language);
			if (props.get(_key) != null) {
				value = (String) props.get(_key);
			}
		}
		return value;
	}

	public String get(String _key) {
		return get(_key, language);
	}

	public String get(String _key, String[] _params) {
		return get(_key, language, _params);
	}

	public String get(String _key, Locale _locale) {
		String language = getLanguage(_locale);
		return get(_key, language);
	}

	public String get(String _key, Locale _locale, String[] _params) {
		String language = getLanguage(_locale);
		return get(_key, language, _params);
	}

	/**
	 * @param _key 要去字符串的key
	 * @param _params 要替代的相关参数
	 * @return 资源文件对应的字符串,并且其中的{0},{1}之类用制定_params替代
	 */
	public String get(String _key, String _language, String[] _params) {
		String value = get(_key, _language);
		List
     
     
      
       list = new ArrayList
      
      
       
       ();
		char c1value; // 匹配是否为'{'
		char c2value; // 匹配是否为'}'
		char c3value; // 匹配是否为数字
		String toReplace = null; // 存放要替换的字符串
		int parameterIndex = 0; // 存放要替换字符串的数组值的索引
		String[] params = _params;

		if (params == null || _params.length == 0) {
			return value;
		}
		for (int i = 0; i < value.length() - 2; i++) {
			c1value = value.charAt(i);
			if (c1value == '{') {
				c2value = value.charAt(i + 2);
				if (c2value == '}') {
					c3value = value.charAt(i + 1);
					if (c3value >= '0' && c3value <= '9') {
						// 在{和}之前需要添加转义字符,否则在下面调用String的replaceFirst函数时会出错
						// 但是如果使用jdk1.5中String的replace(String,String)方法就不用转义处理
						toReplace = "\\{" + c3value + "\\}";
						list.add(toReplace);
					}
				}
			}
		}
		for (int i = 0; i < list.size(); i++) {
			toReplace = list.get(i);
			parameterIndex = toReplace.charAt(2) - '0';
			if (parameterIndex <= params.length) {
				value = value.replaceFirst(toReplace, params[parameterIndex]);
			}
		}
		return value;

	}

	public String getLanguage() {
		return language;
	}

	public void setLanguage(String _language) {
		this.language = _language;
	}
}
package cn.jerry.mouse.jsptag;

import java.io.File;
import java.util.Locale;

public class LocalFile {

	/**
	 * 搜索文件, 搜索顺序为:
	 * 1.文件名+语言代码+"_"+国家代码+后缀 
	 * 2.文件名+语言代码+后缀 
	 * 3.文件名后缀
	 * @param path
	 * @param languageName
	 * @return 文件完整路径
	 */
	public static String getFile(String path, String languageName) {
		String originalPath = path;
		int dotIndex = path.lastIndexOf(".");
		String pathPrefix = path.substring(0, dotIndex);
		String suffix = path.substring(dotIndex);

		String filePath = pathPrefix + "_" + languageName + suffix;
		File file = new File(filePath);
		if (!file.exists()) {
			if (languageName.indexOf("_") != -1) {
				filePath = pathPrefix + "_"
						+ languageName.substring(0, languageName.indexOf("_")) + suffix;
				file = new File(filePath);
			}
			if (!file.exists()) {
				filePath = originalPath;
				file = new File(filePath);
			}
		}
		return file.getAbsolutePath();
	}

	/**
	 * 搜索文件, 搜索顺序为:
	 * 1.文件名+语言代码+"_"+国家代码+后缀 
	 * 2.文件名+语言代码+后缀 
	 * 3.文件名后缀
	 * @param path
	 * @param locale
	 * @return 文件完整路径
	 */
	public static String getFile(String path, Locale locale) {
		return getFile(path, getLocaleString(locale));
	}

	public static String getLocaleString(Locale locale) {
		String localeString;
		String country;
		String language;

		if (locale == null)
			return "";
		else {
			country = locale.getCountry();
			language = locale.getLanguage();
			if (country == null || "".equals(country))
				localeString = language;
			else
				localeString = language + "_" + country;
		}
		return localeString;
	}

}
package cn.jerry.mouse.jsptag;

import java.io.Serializable;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspTagException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.Tag;

public class MessageTag implements Tag, Serializable {
	private static final long serialVersionUID = 1L;
	private PageContext pc = null;
	private Tag parent = null;
	private String key = null;
	private static Resource resource = new Resource();
	public void setPageContext(PageContext p) {
		pc = p;
	}

	public void setParent(Tag t) {
		parent = t;
	}

	public Tag getParent() {
		return parent;
	}

	public String getKey() {
		return key;
	}

	public void setKey(String key) {
		this.key = key;
	}

	public int doStartTag() throws JspException {
		try {
			String value, language;
			try {
				if (pc.getSession().getAttribute(Resource.SYSTEM_LANGUAGE) != null) {

					language = (String) pc.getSession().getAttribute(
							Resource.SYSTEM_LANGUAGE);
					value = resource.get(key, language);
				} else
					value = resource.get(key, pc.getRequest().getLocale());
			} catch (Exception e) {
				value = resource.get(key, pc.getRequest().getLocale());
			}
			pc.getOut().write(value);
		} catch (Exception e) {
			e.printStackTrace();
			throw new JspTagException(e.getMessage());
		}
		return SKIP_BODY;
	}

	public int doEndTag() throws JspException {
		return EVAL_PAGE;
	}

	public void release() {
		pc = null;
		parent = null;
		key = null;
	}
}
package cn.jerry.mouse.jsptag;

import java.io.Serializable;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.Tag;

public class SetLocaleTag implements Tag, Serializable {
	private static final long serialVersionUID = 1L;

	private PageContext pc = null;

	private Tag parent = null;

	public String language = null;

	public void setPageContext(PageContext p) {
		pc = p;
	}

	public void setParent(Tag t) {
		parent = t;
	}

	public Tag getParent() {
		return parent;
	}

	public String getLanguage() {
		return language;
	}

	public void setLanguage(String language) {
		this.language = language;
	}

	public int doStartTag() throws JspException {
		pc.getSession().setAttribute(Resource.SYSTEM_LANGUAGE, language);
		return SKIP_BODY;
	}

	public int doEndTag() throws JspException {
		return EVAL_PAGE;
	}

	public void release() {
		pc = null;
		parent = null;
		language = null;
	}
}
package cn.jerry.mouse.jsptag;

import java.io.Serializable;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.Tag;

public class SetLocaleTag implements Tag, Serializable {
	private static final long serialVersionUID = 1L;

	private PageContext pc = null;

	private Tag parent = null;

	public String language = null;

	public void setPageContext(PageContext p) {
		pc = p;
	}

	public void setParent(Tag t) {
		parent = t;
	}

	public Tag getParent() {
		return parent;
	}

	public String getLanguage() {
		return language;
	}

	public void setLanguage(String language) {
		this.language = language;
	}

	public int doStartTag() throws JspException {
		pc.getSession().setAttribute(Resource.SYSTEM_LANGUAGE, language);
		return SKIP_BODY;
	}

	public int doEndTag() throws JspException {
		return EVAL_PAGE;
	}

	public void release() {
		pc = null;
		parent = null;
		language = null;
	}
}

      
      
     
     
    
    
   
   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值