今日的課程內(nèi)容是JavaWEB國際化和EL表達式,EL表達式在之前的課程中有使用過,但并未深入。今日的內(nèi)容整體上比較輕松,當我看到JavaWEB國際化時,還以為內(nèi)容很多。國際化嗎!以為在某些編寫操作上有什么國際化的特殊要求?呵呵,其實我們的編寫方式本身就已經(jīng)是國際化的了。這里的國際化是指WEB應(yīng)用國際化,跟桌面應(yīng)用國際化沒什么區(qū)別。EL表達式使用起來到是方便許多。
今日每位同學的學習效果整體上感覺不錯!可能是學習完了WEB基礎(chǔ),學習高級部分都相對容易些吧!不過方老師為了讓大家吸收的好,對課程內(nèi)容進行了調(diào)整,沒有講基礎(chǔ)時那么緊縮,拿出了些時間給學生們做練習。明天就開始講數(shù)據(jù)庫了,之后就是JSP自定義標簽,等這些講完了,終于可以進行高級開發(fā)了!學習基礎(chǔ)是枯燥的,學習應(yīng)用才有樂趣。這是正常現(xiàn)象,比如我在學校時特別不喜歡學習語文,學習完不知做什么用。話我說的不差勁!直到參加工作時,發(fā)現(xiàn)寫作是很重要的,這時我開始喜歡上了語文。哎,枯燥的教育好煩!我與其為此而煩,還不如為此做些事情!
國際化開發(fā)就是,為了應(yīng)對不同國家用戶。將軟件的語言,數(shù)據(jù),使用習慣等,適合相應(yīng)的國家。
我們在實際的軟件使用中,桌面軟件的語言設(shè)置選項也比較常見,這就是國際化。WEB被廣泛應(yīng)用后,一些國際化的網(wǎng)站也有針對不同國家訪問的本地語言。
1. 編寫一個配置文件(*.ini)。
2. 在配置文件中設(shè)置節(jié)點名為國家或語言的名字,比如“中文簡體”、“中文繁體”、“English”…。
3. 在各語言節(jié)點中添加配置項,各節(jié)點的配置項名稱必須相同,比如在“中文簡體”中添加“open=文件”節(jié)點,在“中文繁體”節(jié)點中添加“open=打開”,在“Englis”節(jié)點中添加“open=open”。
4. 軟件在啟動時,根據(jù)用戶選擇的語言,去對應(yīng)的節(jié)點下讀取指定的配置項,并使用配置項的值做為菜單顯示。
上面就是桌面軟件國際化的實現(xiàn)過程。接下來讓我們看一下WEB應(yīng)用中,國際化的實現(xiàn)方法。
將WEB應(yīng)用國際化,比如將登錄頁面國際化:
1. 根據(jù)WEB應(yīng)用面向的重點區(qū)域,編寫相應(yīng)的的配置文件(*.properties)。比如中國的配置文件“login_zh.properties”、美國的配置文件“login_en.properties”。注意:配置文件的命名,必須是“文件名+語言代碼.properties”。
2. 所有的配置文件必須使用相同的鍵名稱,比如“name=用戶名”、“name=name”。
3. JAVA提供了一個類ResourceBundle,專門用于讀取這種用于特定語言環(huán)境的資源。調(diào)用ResourceBundle.getBundle方法時,我們只需要傳遞參數(shù)一“配置文件所在WEB應(yīng)用下的目錄+login”和參數(shù)二本地信息(Locale)即可!ResourceBundle類會自動根據(jù)Locale信息中的語言代碼,去讀取指定的配置文件。
4. 在登錄頁面,使用ResourceBundleobj.getString(“鍵名稱”),讀取相應(yīng)該的值并顯示到頁面上。
可見JAVA將應(yīng)用做的如此完美,將配置文件分開這樣有助于減小文件的大小。并且ResourceBundle會自動根據(jù)Locale設(shè)置的信息,去讀取相應(yīng)的配置文件。
以上我們說的都是對靜態(tài)數(shù)據(jù)的國際化,那動態(tài)數(shù)據(jù)應(yīng)該如何實現(xiàn)國際化呢?動態(tài)數(shù)據(jù),比如數(shù)值,貨幣,時間,日期等數(shù)據(jù)。JAVA對此也做了相應(yīng)的工作,處理時間有DateFormat類,處理數(shù)值有NumberFormat類。關(guān)于這兩個類的使用,我也不做練習了十分簡單,查看JDK文檔,已經(jīng)說明的很詳細了。
動態(tài)文本(MessageFormat),用于處理一個字符串包含了多個與國際化相關(guān)的數(shù)據(jù)。看下面的代碼:
import java.text.MessageFormat; import java.util.Date; public class MessageFormatTest { public static void main(String[] args) { //比如有這樣一片段文字:在 String str = "在{0,date,long}我來到了北京,我買的是打折機票,票價{1, number, currency}。"; Object[] reargs = {new Date(), 330}; MessageFormat mf = new MessageFormat(str); StringBuffer sb = new StringBuffer(); System.out.println(mf.format(reargs)); } } |
與DateFormat和 NumberFormat相比,MessageFormat使用起來復(fù)雜一點。但功能比較強大,對于它的國際化應(yīng)用,我還不明朗。在學習框架時,我想可能會明朗些吧!
下午重點學習EL表達式,使用上并不復(fù)雜。只過JAVA應(yīng)用總是搞出來這么多名堂,其實就是為了簡化開發(fā)。這也是可以理解的!
EL——ExpressionLanguage,它是用于替換JSP頁面中的腳本表達式。之前也有提到過,在JSP頁面中使用腳本表達式進行數(shù)據(jù)顯示是一件痛苦的事。若想使用EL表達式,WEB服務(wù)器必須支持Servlet2.4/JSP2.0技術(shù)。EL都有哪些功能呢?比如${標識符},EL拿到標識符后會到自己的隱式對象中去查找,如果隱式對象中不存在,則到page域、request域、session域、application域中去查找。
舉例:${abcd},abcd不是EL的隱式對象。但它在request域中(request.setAttribute (“abcd”,”hi”);),所以會調(diào)用pageContext.findAttribute方法進行查找,${abcd}代表的就是request.getAttribute(“abcd”);,EL都具有哪些隱式對象呢?
pageContext、pageScope、requestScope、sessionScope、applicationScope,param、paramValues、header、headerValues、cookie、initParam。這些都是Servlet中相關(guān)的作用域?qū)ο螅热?/span>${requestScope.abcd}就是獲取request中的abcd屬性。既然${abcd}與${requestScope.abcd}有什么區(qū)別,使用${abcd}不是更簡單嗎?咱們來看一下這種情況:request.setAttribute(“abcd”,”hiRequest”); session.setAttribute(“abcd”,”hiSession”);,${abcd},獲取的是request中的abcd,如果request中沒有abcd它獲取的就是session的abcd。這下明白了吧!如果兩個域中具有相同的屬性,那么些時EL的隱式對象就發(fā)揮了作用。EL中的隱式對象完全可以操作相應(yīng)域的數(shù)據(jù)。
EL也具有基本的運算處理能力:算術(shù)運算、邏輯運算和關(guān)系運算。在此就不一一列舉了!
在EL中也可以編寫自己的函數(shù):
1. 編寫一個類,定義靜態(tài)方法:
public class MyEl { public static String getMessage(){ return "HI,我是EL自定義函數(shù)!!!"; } } |
2. 在WEB-INF目錄中添加一個*.tld配置文件:
<?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/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0"> <description>A tag library exercising SimpleTag handlers.</description> <tlib-version>1.0</tlib-version> <short-name>SimpleTagLibrary</short-name> <uri>/SimpleTagLibrary</uri> <function> <name>print</name> <function-class>cn.itcast.cc.el.MyEl</function-class> <function-signature>java.lang.String getMessage()</function-signature> </function> </taglib> |
3. 在要調(diào)用本函數(shù)的JSP頁面中添加引用:
%@taglib prefix="cc" uri="/SimpleTagLibrary" % |
4.調(diào)用方法:${cc:print()}
上面就是編寫自定義EL函數(shù)的過程,Apache組織為EL提供了一些比較常用的函數(shù)。比如文件處理函數(shù),
Apache提供的EL常用函數(shù)在Standard.jar包中的“org.apache.taglibs.standard.functions.Functions”包中。UIR是http://localhost:8080/jsp/jstl/functions。