JFinal中使用JSP的自訂Tag解決I18N

來源:互聯網
上載者:User

標籤:style   http   java   color   使用   os   

1. 設計原由

由於JFinal的國際化(I18N)支援在JSP中支援不好,因此,萌生瞭解決這一短板的念頭。

實現時也考慮了幾種方式,最終決定採用JSP中最原始的標籤。因為自訂標籤在JSP中容易實現,內容靈活且功能比較強大,可擴充性好。

 

2. I18N標籤

自訂的I18N標籤需要針對I18N的各個介面做最好的支援,使用<jf:i18n />作為標籤名,下面是JFinal中I18N類的幾個介面:

public static String getText(String key)public static String getText(String key, String defaultValue)public static String getText(String key, Locale locale)public static String getText(String key, String defaultValue, Locale locale)


完整的標籤被設計成:

<jf:i18n key="" defaultValue="" locale="" paras="" />

        參數說明:

參數名

作用

說明

key

對應介面中的key

 

defaultValue

對應介面中的defaultValue

 

locale

對應介面中的locale

資料類型有差別,這裡只能使用字串,如:zh_CN, en_US

paras

全新的屬性,為了支援參替換而設計

1.假如key對應字串為“早上好!{0}們,現在正實驗{1}。”;paras取值為“小白,I18N標籤”(參數間用逗號隔開);那麼得到的最終結果是“早上好!小白們,現在正實驗I18N標籤。”

2.另外,參數可以從Controller的attr中取值,例如:Controller中setAttr(“p1”, “小白”).setAttr(“p2”, “I18N標籤”);標籤中的paras取值為“p1,p2”,尋麼最終結果還是“早上好!小白們,現在正實驗I18N標籤。”

3. 代碼實現 3.1 I18nTag.java

package com.jfinal.tag;import java.io.IOException;import javax.servlet.jsp.JspException;import javax.servlet.jsp.JspWriter;import javax.servlet.jsp.tagext.Tag;import javax.servlet.jsp.tagext.TagSupport;import com.jfinal.i18n.I18N;import com.jfinal.kit.LocaleKit;import com.jfinal.kit.StringKit;/** * JSP頁面中用於支援I18N的標籤。 */public class I18nTag extends TagSupport {private static final long serialVersionUID = -8073376431317433802L;/** * I18N中的key值 */private String key;/** * 當key值不存在時使用的預設值 */private String defaultValue;/** * 地區屬性,如:zh_CN, en_US */private String locale;/** * 作為value格式化值使用的參數,多個用逗號隔開,如果參數值在Request中有對應的attribute,則取attribute值 */private String paras;@SuppressWarnings("deprecation")@Overridepublic int doStartTag() throws JspException {//if (StringKit.isBlank(this.getKey())) {//throw new JspException("The tag attribute of key is not exists.");//}// 定義輸出給頁面的textString text = null;try {if (StringKit.isBlank(locale)) {// 通過I18N介面拿到值text = I18N.getText(key, this.defaultValue);} else {// locale定義了值,說明指定了前端要顯示的語言類型,語言類型交由LocaleKit處理text = I18N.getText(key, this.defaultValue, I18N.localeFromString(locale));}} catch (Exception e) {text = defaultValue;}if (StringKit.notBlank(paras)) {// 如果tag中指定了paras,則將paras解析為arrayString[] attrs = paras.split(",");Object[] values = new Object[attrs.length];// 迴圈將參數到Request中取值,如果有值,則替換for (int i = 0; i < attrs.length; i++) {String a = attrs[i];values[i] = pageContext.getRequest().getAttribute(a) == null ? attrs[i] : pageContext.getRequest().getAttribute(a);}pageContext.getAttribute("");text = String.format(text, values);}try {// 將結果輸出到頁面pageContext.getOut().write(text);} catch (IOException e) {return Tag.SKIP_BODY;}return Tag.EVAL_BODY_INCLUDE;}public String getKey() {return this.key;}public void setKey(String key) {this.key = key;}public String getDefaultValue() {return this.defaultValue;}public void setDefaultValue(String defaultValue) {this.defaultValue = defaultValue;}public String getLocale() {return this.locale;}public void setLocale(String locale) {this.locale = locale;}public String getParas() {return this.paras;}public void setParas(String paras) {this.paras = paras;}


3.2 Jfinal.tld

    檔案與I18nTag.java放在同一目錄下:

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd"><taglib>    <tlibversion>1.0</tlibversion>    <jspversion>1.1</jspversion>    <shortname>bean</shortname>    <uri>http://www.jfinal.com/tag</uri>    <tag>        <name>i18n</name>        <tagclass>com.jfinal.tag.I18nTag</tagclass>        <bodycontent>JSP</bodycontent>        <attribute>            <name>key</name>            <required>true</required>            <rtexprvalue></rtexprvalue>        </attribute>        <attribute>            <name>defaultValue</name>            <required>false</required>            <rtexprvalue></rtexprvalue>        </attribute>        <attribute>            <name>paras</name>            <required>false</required>            <rtexprvalue></rtexprvalue>        </attribute>        <attribute>            <name>locale</name>            <required>false</required>            <rtexprvalue></rtexprvalue>        </attribute>    </tag></taglib>


4. Tag的使用 4.1 定義多國語言屬性檔案
  •         myi18n_en_US.properties

greeting=Today is %2$s/%3$s/%1$s


  •         myi18n_zh_CN.properties

greeting=今天是%1$s年%2$s月%3$s日


4.2 啟動時載入I18

在JFinalConfig.configConstant(Constants me)中加入如下代碼:

// 載入I18N檔案me.setI18n("myi18n", Locale.SIMPLIFIED_CHINESE, Integer.MAX_VALUE);
4.3 在Controller中設定屬性
Calendar c = Calendar.getInstance();c.setTime(new Date());this.setAttr("yyyy", c.get(Calendar.YEAR));this.setAttr("MM", c.get(Calendar.MONTH) + 1);this.setAttr("dd", c.get(Calendar.DAY_OF_MONTH));
4.4 JSP頁面中定義標籤
<%@ taglib prefix="jf" uri="/WEB-INF/classes/com/jfinal/tag/jfinal.tld"%><h5><jf:i18n key="non_key" defaultValue="沒有key值顯示我" paras="2014,7,8" /></h5><h5><jf:i18n key="greeting" defaultValue="沒有key值顯示我" paras="2014,7,8"  locale="zh_CN"/></h5><h5><jf:i18n key="greeting" defaultValue="沒有key值顯示我" paras="2014,7,8"  locale="en_US" /></h5><h5><jf:i18n key="greeting" defaultValue="沒有key值顯示我" paras="yyyy,MM,dd"  locale="en_US" /></h5>

    首先引入標籤,引入的是標籤定義檔案tld的位置,編譯後,tld的位置為"/WEB-INF/classes/com/jfinal/tag/jfinal.tld",它也是目標位置。


4.5 執行結果


5. 問題

細心的讀者可能已經發現了,paras參數是為替換{0},{1}這型別參數,結果卻替換了%1$s年%2$s這樣的參數。這是因為代碼使用String.format()格式化,卻不知為什麼不能支援{0},{1}。作者沒時間去探究,哪位讀者有時間幫我找出答案吧。


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.