利用数据库管理国际化资源配置以及自定义标签实现国际化效果

利用数据库管理国际化资源配置以及自定义标签实现国际化效果

对于国际化资源的管理一般采用.properties进行配置,对于资源信息的修改或新增国际化资源文件均需要重启服务才能生效,将包括国际化资源在内的系统信息存储在数据库中,并在启动服务的同时读取并纳入缓存,即可以实现系统配置信息的即时生效。

对于国际化资源的存储表结构如下:

基于国际化资源表建立国际化资源管理的增删改查模块,一经修改即更新缓存,同时利用自定义标签更新国际化效果。后端的国际化即是从缓存中读取资源,然后对应替换。以下自定义标签的国际化实现方案主要针对页面以及js。

获取国际化资源的方法:

/**
	 * 获取所有国际化资源
	 * @author chao.gao
	 * @date 2013-12-30 上午10:51:39
	 * @return Map<language,Map<moduleName,Map<key,value>>>
	 */
	private Map<String,Map<String,String>> getAllMsgs() {
		Map<String, Map<String, String>> i8nMap = new HashMap<String, Map<String, String>>();
		Map<String, String> map = new HashMap<String, String>();

		Locale defaultLocale = Locale.getDefault();
		I18nresourceEntity queryEntity = new I18nresourceEntity();
		queryEntity.setLanguage(defaultLocale.getLanguage());
		List<I18nresourceEntity> i18nresourceEntityListLocacle = queryI18nresourceList(queryEntity);
		if (!CollectionUtils.isEmpty(i18nresourceEntityListLocacle)) {
			for (I18nresourceEntity entity : i18nresourceEntityListLocacle) {
				map.put(entity.getI18nKey(), entity.getI18nValue());
				i8nMap.put(entity.getModuleName(), map);
			}
		}
		return i8nMap;
	}

下面介绍一下利用JSP2.0提供的tagext功能的自定义标签实现页面的国际化效果。tagext 包是提供自定义标签的相关类, 当你需要开发JSP的自定义标签,那你的tablib的类就必须继承或者实现tagext 包中的类。tagext 即对tag的扩展。

首先,我们自定义标签类,必须继承SimpleTagSupport

本例中,自定义标签定义类代码如下:

/**
 * 
 * JS国际化标签
 * @author chao.gao
 * @date 2014-1-14 下午2:14:22
 * @version <b>1.0.0</b>
 */
public class I18nJsTag extends SimpleTagSupport implements IJspTag {

	private String id;
	private String moduleName;

	/**
	 * @author chao.gao
	 * @date 2013-12-31 下午1:31:25
	 * @see javax.servlet.jsp.tagext.SimpleTagSupport#doTag()
	 * @throws JspException
	 * @throws IOException
	 */
	public void doTag() throws JspException, IOException {
		I18nJsTagAdapter.getI18njsptagAdapter().doTag(this, getJspContext());
	}

	/**
	 * 获得id
	 * @return String
	 */
	public String getId() {
		return id;
	}

	/**
	 * 设置id
	 * @param id
	 */
	public void setId(String id) {
		this.id = id;
	}

	/**
	 * 获得moduleName
	 * @return String
	 */
	public String getModuleName() {
		return moduleName;
	}
	/**
	 * 设置moduleName
	 * @param moduleName
	 */
	public void setModuleName(String moduleName) {
		this.moduleName = moduleName;
	}

}

自定义标签处理类,简单自定义标签可以直接在doTag中定义该逻辑

/**
 * @author chao.gao
 * @date 2013-12-31 下午3:58:06
 * @version <b>1.0.0</b>
 */

public class I18nJspTagAdapter {

	private static final Map<String, Map<String, String>> I18NMAP = new ConcurrentHashMap<String, Map<String, String>>(); 

	private static final I18nJspTagAdapter I18NJSPTAGADAPTER = new I18nJspTagAdapter(){};

	private I18nJspTagAdapter() {
	}

	/** 
	 * 
	 * @author chao.gao
	 * @date 2013-12-12 下午9:54:27
	 * @see com.gaochao.platform.web.tag.IJspTagSpi#doTag(com.fx.platform.web.tag.IJspTag, javax.servlet.jsp.JspContext)
	 * @param jspTag
	 * @param jspContext
	 * @throws IOException
	 */
	public void doTag(IJspTag jspTag, JspContext jspContext) throws IOException {

		I18nTag i18nTag = (I18nTag) jspTag;
		String moduleName = i18nTag.getModuleName();
		String key = i18nTag.getKey();

		if (StringUtils.isBlank(moduleName) || StringUtils.isBlank(key) || StringUtils.isEmpty(moduleName) || StringUtils.isEmpty(key)) {
			return;
		}

		String message = I18NMAP.get(moduleName) == null ? "" : I18NMAP.get(moduleName).get(key);
		jspContext.getOut().write(message);
	}

	public static I18nJspTagAdapter getI18njsptagAdapter() {
		return I18NJSPTAGADAPTER;
	}

	public void putI18nresourceMap(Map<String, Map<String, String>> i18nMap) {
		I18nJspTagAdapter.I18NMAP.putAll(i18nMap);
	}
}

  然后编写描述符配置文件tagext.tld放置在META-INF下

<?xml version="1.0" encoding="UTF-8"?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2eeweb-jsptaglibrary_2_0.xsd" version="2.0"> 
	<description>fx jsp tag </description>
	<tlib-version>2.2</tlib-version>
	<short-name>gaochao</short-name>
	<jsp-version>2.0</jsp-version>
	<uri>/gaochao</uri>
	<tag>
		<name>i18n</name>
		<tag-class>com.gaochao.platform.web.tag.impl.I18nTag</tag-class>
		<body-content>empty</body-content>
		<attribute>
			<name>moduleName</name>
			<required>true</required>
			<rtexprvalue>true</rtexprvalue>
		</attribute>
		<attribute>
		    <name>id</name>
		    <required>false</required>
		</attribute>
		<attribute>
			<name>key</name>
			<required>true</required>
			<rtexprvalue>true</rtexprvalue>
		</attribute>
	</tag>
	<tag>
		<name>i18nJs</name>
		<tag-class>com.gaochao.platform.web.tag.impl.I18nJsTag</tag-class>
		<body-content>empty</body-content>
		<attribute>
			<name>moduleName</name>
			<required>true</required>
			<rtexprvalue>true</rtexprvalue>
		</attribute>
		<attribute>
		    <name>id</name>
		    <required>false</required>
		</attribute>
	</tag>
</taglib>

 

  先行添加国际化信息language=”zh”,moduleName=”sys”,key=”type”,value=”类型:”

  然后在jsp页面添加

<%@ taglib uri="/gaochao" prefix="g"%>

  原代码:

<td>类型:</td>

  替换后:

<td><p:i18n moduleName=”sys” key=”type”></td>

  以上是jsp页面的国际化标签,下面是js的自定义标签逻辑处理类,其定义类基本与jsp自定义标签相同,而描述信息在上文的tagext.tld中已有定义。

/** 
	 * 
	 * @author chao.gao
	 * @date 2013-12-12 下午9:54:27
	 * @see com.gaochao.platform.web.tag.IJspTagSpi#doTag(com.fx.platform.web.tag.IJspTag, javax.servlet.jsp.JspContext)
	 * @param jspTag
	 * @param jspContext
	 * @throws IOException
	 */
	public void doTag(IJspTag jspTag, JspContext jspContext) throws IOException {

		I18nJsTag i18nTag = (I18nJsTag) jspTag;
		String moduleName = i18nTag.getModuleName();

		if (StringUtils.isBlank(moduleName) || StringUtils.isEmpty(moduleName)) {
			return;
		}
		Map<String, String> message = I18NMAP.get(moduleName);
		StringBuilder msgObject = new StringBuilder("");
		msgObject.append("<script type=‘text/javascript‘> \n");

		if(message != null){
			msgObject.append("var i18nJs={");
			Iterator<String> it = message.keySet().iterator();
			while(it.hasNext()){
				String element = it.next();
				msgObject.append("\"" + element + "\":\"" + message.get(element) + "\",");
			}
			msgObject.deleteCharAt(msgObject.length() - 1);
			msgObject.append("}");
		}

		msgObject.append("</script>");
		jspContext.getOut().write(msgObject.toString());
	}

  从以上的逻辑可以看出,通过该自定义标签,我们生成一段js代码,在代码中定义了一个类似map的变量,在该jsp中引用的js均可以利用i18nJs这个变量获取想要的国际化信息。

时间: 2024-12-07 14:38:45

利用数据库管理国际化资源配置以及自定义标签实现国际化效果的相关文章

JavaWeb之自定义标签&amp;JSTL&amp;国际化(九)

自定义标签 简介 自定义标签由于没练习,所以掌握的不是很深,但是对于我而言足够可以应付用户登录注册案例和购物车案例,有时间还是多了解的好 1. 自定义标签简介 1.作用:替换JSP页面中的java脚本(<%%>).(官方推荐:JSP2.0开始) 2. 开发步骤 1. 自定义一个类继承SimpleTagSupport实现doTag方法 2. WEB-INF,建立tld文件,定义标签地址/定义标签内容 3. jsp页面使用taglib指令引入uri地址,prefix定义标签名,直接在页面调用这个标

12 自定义标签/JSTL标签库/web国际化/java web之设计模式和案例

EL应用 自定义一个标签,实现两个字符串的相加 1回顾 1.1servlet生命周期 init(ServletConfig) service(ServletRequest,ServletResponse) destory() 1.2回话技术 cookie:浏览器端 (服务器需要浏览器保存少量的数据) 服务器创建对象:new Cookie(name,value) cookie.setMaxage(秒);  有效时间 cookie.setMaxage(0)  删除cookie cookie.setP

SSM框架利用自定义标签分页

分页通常是令人头疼的一件事,然而,这里将介绍一种新方法 这是一种巧妙地方法: 后端自定义JSP标签,这样在前端方面做分页会变得很简单 这里需要一种新技术:自定义标签 举例:在JSP动态页面技术中:我们都知道有c标签: 只需要在头导入: <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> 使用示例: <c:forEach items="${industry}&quo

web day13 JSTL标签库(c标签,自定义标签),MVC设计模式,JavaWeb经典三层框架

JSTL 1. jstl的概述 *apache的东西,依赖EL * 使用jstl需要导入jstl1.2.jar * 四大库: > core:核心库,重点 > fmt:格式化:日期.数字 > sql:过时 > xml:过时 2. 导入标签库 *jar包 * 在jsp页面中:<%@taglib prefix="前缀" uri="路径"%> ---------------------- core --> c标签! 1. out和s

JavaWeb-12 (自定义标签库开发&amp;JSTL标签库)

JavaWeb-12:自定义标签库开发&JSTL标签库 自定义标签库开发 一.自定义标签简介 自定义标签主要用于移除Jsp页面中的java代码. 使用自定义标签移除jsp页面中的java代码,只需要完成以下两个步骤: 1.编写一个实现Tag接口的Java类(标签处理器类). 2.编写标签库描述符(tld)文件,在tld文件中把标 实验:项目架构如下: a.tld <?xml version="1.0" encoding="utf-8" ?> &l

Javaweb学习笔记6—EL表达式与JSTL及自定义标签

 前几天博客被黑了,导致博客登陆不上,把前几天应该发的东西的东西重新发一遍 今天来讲javaweb的第六阶段学习. EL表达式与JSTL及自定义标签是对上篇文章介绍的JSP的扩展,不能说是很重要的东西,但是也要了解. 老规矩,首先先用一张思维导图来展现今天的博客内容. ps:我的思维是用的xMind画的,如果你对我的思维导图感兴趣并且想看到你们跟详细的备注信息,请点击下载 另外:如果图看不清的话请右击---在新窗口中打开会清楚很多. 一.EL表达式 1,EL简介 Expression Lan

zTree更新自定义标签&gt;&gt;&gt;

zTree>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> x 本来想自己敲一个zTree的例子的>>> 但是一想zTree文档做的这么好,直接拷贝过来一个得了... 哈哈>>> <!DOCTYPE html> <html> <head> <

自定义标签

1 如果在jsp页面中写java代码 是很不合适的 而且坏处很多像这样: <%@page import="java.util.ArrayList"%><%@page import="java.util.List"%><%@page import="com.atguigu.javaweb.Customer"%><%@ page language="java" contentType=&q

如何编写自定义标签?具体流程与分析(自定义标签快速入门)

1.自定义标签简介 自定义标签主要用于移除Jsp页面中的java代码 使用自定义标签移除jsp页面中的java代码,只需要完成以下两个步骤: 1.编写一个实现Tag接口的Java类(标签处理器类) 2.在WEB-INF中编写标签库描述符(tld)文件,在tld文件中对标签处理器类描述成一个标签 (参考tomcat中的examples 项目中jsp部分) 2.自定义标签的执行流程的分析 JSP引擎将遇到自定义标签时,首先创建标签处理器类的实例对象,然后按照JSP规范定义的通信规则依次调用它的方法.