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

简介:

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

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

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

wKiom1TUd9zzC7YcAAEuQb9zwz8656.jpg

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

获取国际化资源的方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/**
      * 获取所有国际化资源
      * @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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
/**
 
  * 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中定义该逻辑

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
/**
  * @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下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<? 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页面添加

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

  原代码:

1
< td >类型:</ td >

  替换后:

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
/** 
     
      * @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这个变量获取想要的国际化信息。




     本文转自 gaochaojs 51CTO博客,原文链接:http://blog.51cto.com/jncumter/1612468,如需转载请自行联系原作者


相关文章
|
4月前
|
Oracle 关系型数据库 Linux
【赵渝强老师】Oracle数据库配置助手:DBCA
Oracle数据库配置助手(DBCA)是用于创建和配置Oracle数据库的工具,支持图形界面和静默执行模式。本文介绍了使用DBCA在Linux环境下创建数据库的完整步骤,包括选择数据库操作类型、配置存储与网络选项、设置管理密码等,并提供了界面截图与视频讲解,帮助用户快速掌握数据库创建流程。
415 93
|
7月前
|
关系型数据库 MySQL 数据库连接
Django数据库配置避坑指南:从初始化到生产环境的实战优化
本文介绍了Django数据库配置与初始化实战,涵盖MySQL等主流数据库的配置方法及常见问题处理。内容包括数据库连接设置、驱动安装、配置检查、数据表生成、初始数据导入导出,并提供真实项目部署场景的操作步骤与示例代码,适用于开发、测试及生产环境搭建。
320 1
|
4月前
|
Ubuntu 安全 关系型数据库
安装与配置MySQL 8 on Ubuntu,包括权限授予、数据库备份及远程连接指南
以上步骤提供了在Ubuntu上从头开始设置、配置、授权、备份及恢复一个基础但完整的MySQL环境所需知识点。
484 7
|
4月前
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
669 5
|
10月前
|
关系型数据库 MySQL Java
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
|
9月前
|
安全 Linux 网络安全
YashanDB数据库服务端SSL连接配置
YashanDB支持通过SSL连接确保数据传输安全,需在服务端生成根证书、服务器证书及DH文件,并将根证书提供给客户端以完成身份验证。服务端配置包括使用OpenSSL工具生成证书、设置SSL参数并重启数据库;客户端则需下载根证书并正确配置环境变量与`yasc_env.ini`文件。注意:启用SSL后,所有客户端必须持有根证书才能连接,且SSL与密码认证独立运行。
|
7月前
|
安全 Java 数据库
Jasypt加密数据库配置信息
本文介绍了使用 Jasypt 对配置文件中的公网数据库认证信息进行加密的方法,以提升系统安全性。主要内容包括:1. 背景介绍;2. 前期准备,如依赖导入及版本选择;3. 生成密钥并实现加解密测试;4. 在配置文件中应用加密后的密码,并通过测试接口验证解密结果。确保密码安全的同时,保障系统的正常运行。
456 3
Jasypt加密数据库配置信息
|
6月前
|
SQL XML Java
配置Spring框架以连接SQL Server数据库
最后,需要集成Spring配置到应用中,这通常在 `main`方法或者Spring Boot的应用配置类中通过加载XML配置或使用注解来实现。
507 0
|
9月前
|
Java 关系型数据库 MySQL
JDK、Tomcat、MariaDB数据库和Profile多环境的配置与使用
以上就是JDK、Tomcat、MariaDB数据库和Profile多环境的配置与使用的基本步骤。这些步骤可能会因为你的具体需求和环境而有所不同,但是基本的思路是一样的。希望这些信息能够帮助你更好地理解和使用这些工具。
304 17
|
9月前
|
Oracle 关系型数据库 Linux
YashanDB异构数据库链接配置
本指南介绍在YashanDB中配置异构数据库链接(DBLINK)的方法,特别是连接至Oracle数据库的前置要求与步骤。需确保YashanDB服务端安装plugin插件包、Oracle Instant Client及libaio库,否则可能导致错误或进程崩溃。文档还提供了Oracle Instant Client和libaio库的具体安装指导,帮助管理员顺利完成配置。