[转帖]java自定义标签的使用_Tomcat, WebLogic及J2EE讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Tomcat, WebLogic及J2EE讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 4499 | 回复: 0   主题: [转帖]java自定义标签的使用        下一篇 
hryczlgii
注册用户
等级:新兵
经验:66
发帖:0
精华:0
注册:2014-6-30
状态:离线
发送短消息息给hryczlgii 加好友    发送短消息息给hryczlgii 发消息
发表于: IP:您无权察看 2012-4-9 13:58:03 | [全部帖] [楼主帖] 楼主

目标:

    在页面上只需要单独的语句<lt:Label res="res.common" key="pvg_invalid"/>,不需要用户设置,自动根据用户当前的语言环境显示不同的字符串。如简体中文环境下显示字符串“对不起,您无法访问该页面!”;在繁体中文环境下显示字符串“對不起,您無法訪問該頁面!”;在日文环境下显示“残念に思う、この機能を使用する許可を持っていない”(google来的,不知道对不对^_^)……

原理:

    使用JAVA自带类java.util.ResourceBundle

    资源包包含特定于语言环境的对象。当程序需要一个特定于语言环境的资源时(如 String),程序可以从适合当前用户语言环境的资源包中装入它。以这种方式可以编写很大程度上独立于用户语言环境的程序代码,它将资源包中特定于语言环境的信息隔离开来。这就使您所编写的程序可以:

· 轻松地本地化或翻译成不同的语言

· 一次处理多个语言环境

· 以后可以轻松地进行修改,支持更多的语言环境……

    更详细内容参考JAVA_API文档

    然后通过使用Taglib自定义标签可以封装该实现方法,从而简化页面代码。

过程:

一、在项目下新建类。

package com.ronghz.mytest;
import java.util.Locale;
import java.util.ResourceBundle;
import javax.servlet.jsp.tagext.TagSupport;
import org.apache.log4j.Logger;
public class LabelTag extends TagSupport
{
      public LabelTag()
      {
            logger = Logger.getLogger((com.ronghz.mytest.LabelTag.class).getName());
            res = "";
            key = "";
      }
      public void setRes(String res)
      {
            this.res = res;
      }
      public void setKey(String key)
      {
            this.key = key;
      }
      public int doEndTag()
      {
            try
            {
                  String str = "";
                  Locale locale = Locale.getDefault();
                  try{
                        //关键代码
                        ResourceBundle rb = ResourceBundle.getBundle(res, locale);
                        str = rb.getString(key);
                        //如果资源文件的编码与JSP页面的编码不一致,需要进行转码
                        str = new String(str.getBytes("ISO8859-1"), "utf-8");
                  }catch(Exception e){
                  logger.error("LoadString: resource=" + res + " key=" + key + " " + e.getMessage());
                  e.printStackTrace();
            }
            //��页面上输出字符串
            pageContext.getOut().print(str);
      }
      catch(Exception e)
      {
            logger.error(e.getMessage());
      }
      return EVAL_PAGE;
}
Logger logger;
String res;
String key;
}


   其中变量“res”,“key”是标签里定义的属性。res表示资源文件的路径和文件文件名,key是res所指定的资源文件里的其中一个值。

    该函数返回值是 EVAL_PAGE . EVAL_PAGE是一个预定义的整型常量,它指示容器处理页面的剩下部分。另一种选项就是使用 SKIP_PAGE,它将中止对页面剩下部分的处理。如果您要将控制转移到另一个页面,例如您要前进(forward)或者重定向(redirect)用户,那么只需要使用 SKIP_PAGE。

二、创建TLD文件

路径:WebContent\WEB-INF\tlds\

文件名:LabelTag.tld

<?xml version="1.0" encoding="gb2312" ?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
<!-- a tag library descriptor -->
<taglib>
<tlibversion>1.0</tlibversion>
<jspversion>1.1</jspversion>
<shortname>LabelTag</shortname>
<uri></uri>
<info>LabelTag</info>
<tag>
<name>Label</name>
<tagclass>com.ronghz.mytest.LabelTag</tagclass>
<bodycontent>JSP</bodycontent>
<info>LabelTag</info>
<attribute>
<name>res</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>key</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>


三、创建语言资源

路径:\WebContent\WEB-INF\classes\res\

文件名:文件名_国家_语言.properties

如common_zh_CN.properties,common_ja_JP.properties

更详细说明参考:http://www.leftworld.net/online/j2sedoc/javaref/java.util.resourcebundle_dsc.htm

文件内容:

key=value

如:pvg_invalid=对不起,您无法访问该页面!

    pvg_invalid=残念に思う、この機能を使用する許可を持っていない

    pvg_invalid=<strong>对不起,您无法访问该页面!<strong>

    ……

四、使用自定义标签

页面开头加入

<%@ taglib uri="/WEB-INF/tlds/LabelTag.tld" prefix="lt"%>


在需要显示文字的地方加入

<lt:Label res="res.common" key="pvg_invalid"/>

    “lt”是在该页面定义的“前缀”。

    “Label”是在TLD文件中定义的“name”属性。在同一个TLD文件中,可以类可以定义多个不同的<name>。

    “res”资源文件相对于\WebContent\WEB-INF\classes\的相对路径和文件名,文件名不包括国家和语言部分。

    如果所指定的res或key不存在,会报Can't find resource for bundle java.util.PropertyResourceBundle的错




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论