自定義JSP標籤實現語言國際化(類似struts text標籤),並同時支持圖片、JS文件國際化

源代碼及樣例下載地址:
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;
	}
}

發佈了23 篇原創文章 · 獲贊 0 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章