May 27

JSP 很贊,這點地球人都知道。對於小型項目,可以像 PHP、ASP 一樣作爲純腳本語言使用,極大的提高開發效率;大中型的項目,有 Servlet 做爲 filter、controller,組件有 JavaBean 和 EJB,再結合 XML,成爲了靈活而強大的 J2EE,再加上它的平台無關性,Wooooo….這個世界清靜了。

好了,YY完畢,該批鬥它了,靈活和強大的另一面,也正意味著它的門檻高,很難學(當然如果你只用 JSP,就當我沒說過好了,不過我想你不會那麽笨吧…);另一方面就是 localize 的問題,發明 Java 的是使用26個字母的人,不是使用雙字節中文的我們,所以本地化問題也就順理成章的成爲了我們使用 JSP 的其中一個障礙。

要解決 JSP 的中文問題,首先就要先了解 JSP。我們知道 JSP 需要 Container來裝載運行,Container 的其中一項重要功能就是把 JSP 轉換成 Servlet 然後編譯成 class 執行,也就是說 JSP 本質上就是 Servlet,一個純正的 B/S(Browser/Server)架構。所以,要解決它的中文問題,就得從 Browser 和Server 這兩個方面同時入手,然後 Browser 和 Server 要通信的對不對?那就是要傳遞了?Yeah,所以這個中間環節也不要忽略,現在先來總結一下我們需要面對的問題:

  • Client 端對中文的處理:Browser
  • Server 端對中文的處理:Server
  • Browser/Server 間交互的處理

好了,現在可以著手解決問題了。要正確的顯示某種字符集,那就得對各各環節統一編碼。對於中文,我們可以使用國內的 GB2312,GBK(擴充集,非標准)、GB18030 這幾種編碼,繁體?別擔心,GBK 和 GB18030 可以兼容 BIG5。但是,GB2312 容量太小,GBK 是GB2312 的擴展而不是標准編碼,GB18030 太新,並沒有獲得廣泛的支持,所以現在國內使用最廣泛的還是 GB2312。Poor~如果有幸又很不幸的,你的系統有法國、德國、俄羅斯、日本、韓國….的用戶使用,那麽情況會更糟糕些,Hey,別擔心,可以解決的,我們有 Unicode:)

目前 Unicode 在Web端使用的最多的是 UTF-8,它可以保證系統對多語言的正確處理,下面就來看看怎樣用它來解決煩人的中文問題。

(1)Client 端對中文的處理:Browser
把它放在第一位是因爲它最簡單最好解決,不至於把人嚇跑:)
只需要在你的頁面內指定 Encoding,告訴 Browser 使用哪種 Encoding 顯示就行了,一行代碼可以搞定。

<%@page contentType="text/html; charset=UTF-8"%>

上面的代碼加在首行,它告訴 Browser,該頁面的內容類型是 “ text/html ”,使用 “ UTF-8 ” 字符集顯示,用於視圖層,這條代碼是 JSP 頁面專用的,和靜態頁面中 meta 的 content、charset 作用是一樣的。

如果你想保險些,可以連 meta 也用上,沒有問題。

(2)Server 端對中文的處理:Server
Server 端的處理也很簡單,只需在頁面的起始位置加上:

<%@page pageEncoding="UTF-8"%>

指定 Server 端使用 “ UTF-8 ” 編碼集來處理 JSP 內的 Java 代碼(也就是 Servlet)。

(3)Browser/Server 間交互的處理
做完上面的兩步,你的 JSP 和 Servlet 就可以使用 UTF-8 編碼集進行正確的中文處理了,但還僅限於獨立、沒有交互的單個 JSP 和 Servlet。系統需要交互,所以最後我們要解決的就是頁面間的交互問題。

JSP 之間的交互是由 Container 來完成的,而 Tomcat 和 Resin 默認使用的都是 ISO8859,所以使用雙字節的字符就會出現煩人亂碼,對了,如果將這個默認的編碼另行指定,就可以解決了。JSP 中可以用request.setCharacterEncoding來進行指定。只需要在兩個傳遞的頁面內加入:

<%request.setCharacterEncoding("UTF-8");%>

很簡單吧,一行就 OK 了。不過….也很笨。譬如說,你有一個現成的系統需要進行這樣的更改,裏面又有一千幾百個頁面,那麽你….

Take is easy!有 Jim 在,我們可以寫一個 Filter 來解決這個問題:)我寫了一個:

/*
  * @author Jim
  * @version 1.0
  * RequestEncodingFilter.java
  * ToDo: To filter the parameter sent by jsp pages, encode them into customize
  * encoding instead of system's "ISO8859-1" encoding.
  */
 
 package cn.jwing.cms.common;
 
 import java.io.*;
 import javax.servlet.*;
 import javax.servlet.http.*;
 
 public class RequestEncodingFilter implements Filter {
     String charset = null;
 
     public void init(FilterConfig config) throws ServletException {
         charset = config.getInitParameter("charset");
         if (charset == null) charset = "UTF-8";
     }
 
     public void doFilter(ServletRequest request, ServletResponse response,
                         FilterChain chain) throws IOException,ServletException {
         request.setCharacterEncoding(charset);
         chain.doFilter(request, response);
     }
     public void destroy() {
     }
 }

把它扔到 classes 下,在 web.xml 中加入相應的 servlet、filter 項就行了,simple:)

到此爲止,你的系統已經可以正確的處理中文了(其實應該說什麽文都沒問題了),結束?No!還有最基本的一點要說一下,相信無論是高手還是低手,都很有可能在這點上疏忽了,就是 Editor/IDE 的默認文件編碼!這也是最根本的一點,可別把系統想得那麽聰明,會幫你自動進行轉碼的工作,計算機可是最笨的。如果你編輯産生的文件,根本就不是 UTF-8 而是系統默認的 GBK 或是 CP1252 之流,那麽上面所做的一切,都是無用功。所以在做上面的三步之前,先確認你的 Editor/IDE 支持並使用 UTF-8。

最後總結一下,解決方案的四個要點:

  • Browser 端 Encoding 的指定
  • Server 端 Encoding 的指定
  • 頁面間傳輸的 Encoding 的指定
  • Editor/IDE Encoding 的指定

好了,收工, Good luck~

May 26

TMD,老子捧哪隊哪隊就輸,上半場 3:0 領先完全是壓著 Liverpool 來打的,簡直就是不同級別的比賽,讓人很難想像 Liverpool 是怎麽走進 Final 的,可下半場…….

如果說下半場 Gerrard 第一粒的入球只是 Milan 大意之下的意外的話,那麽下半場 Milan 的表現又算是什麽呢?判若兩隊,我無法想像這是一支站在世界足壇最頂尖位置的俱樂部,無法想像這是衆多出色的頂級巨星合作多年早已默契無間的足壇巨人,但 Milan 卻讓我們看到了,Suck!

我不喜歡 Liverpool,甚至整個英超,又或者應該說是傳統的英式足球,盡管現今裏面的英式元素已經不算太多了。可是今天 Liverpool 的表現,是讓人尊敬的,沒人可以想像在歐洲最頂級的冠軍杯決賽上,上半場就給灌3粒球會是什麽樣的一種感覺,絕望?放棄?可在 Liverpool 的字典裏似乎沒有這些字,如果不看比分,沒人會知道這是一支落後3球的球隊。而 Milan 在下半場,尤其是被追平之後,完全成了一支業餘球隊,像隻鬥敗了的公雞,加時賽結束的哨聲一響,我已經知道這樣的意大利人是不可能在12碼中勝出的。果然,Liverpool 就像它們的不死鳥一樣,憑著頑強的意志和永不服輸的精神,把冠軍杯帶回了英格蘭,Gerrard 完全憑著一已之力,挽救了 Liverpool,把紅軍送上了天堂。

這是一支讓人敬畏的偉大球隊。

嗯,這個杯,二千九百萬歐元。

May 25

最近偶然看了一次電視,TVB 在播新劇《老婆大人》,看了後狂愛,然後猛追,發現 TVB 能一直占據著香港無線廣播電視一哥的位置,長期的讓 ATV 擡不起頭來,真是有它獨到之處的,有創意,總能給人新鮮的感覺。來看看《老婆大人》制定的婚前協議書吧:

第一章 夫妻間生活守則
第一條 婚後不與家公家婆同住。

  • 同住之定義是指不能共同居住於同一區。
  • 同區之定義是根據香港特區政府之區域劃分法。
  • 同住之定義亦指於廿四小時內共同逗留於同一室內超過十二小時。
  • 家公家婆亦泛指男家之所有親友。

第二條 未得妻子同意,恕不招待男家之親友。

第三條 未得妻子同意,丈夫不能勉強妻子與男家親友聚會。

第四條 丈夫不得向妻子說謊。

  • 不論謊話是善意或惡意,均不被接納。
  • 丈夫對妻子不得有任何隱瞞,所講的必需是事實之部份或全部。

第五條 男主內,女主外,丈夫要負責家中一切家務雜務,包括湊仔、煮飯、洗衫、洗廁所等等。

  • 不論人前人後,均要貫徹男主內,女主外的大前提。
  • 妻子不會再為丈夫的面子作任何掩飾或做戲,以圖瞞騙男方的親友。

第六條 一切以妻子的工作為重,丈夫不得干涉妻子的工作,或作出任何影響妻子工作的舉動。

第七條 夫妻間各自財政獨立,唯丈夫需負責家用及兒子的生活費。

第二章 丈夫個人守則
第一條 不得出入色情場所。

  • 包括合法或非法之色情場所。
  • 不得以任何藉口在有關場所經過、出入或逗留。

第二條 不可沉迷賭博。

  • 包括合法或非法之賭博。

第三條 不可服食違禁藥物。

第四條 不可攝取過量酒精。

第五條 不得與妻子或家人以外的異性有過份、及不必要之親暱舉動。

  • “是否必要〞、〝過份〞或〝 親暱〞之定義由妻子介定。

第六條 不可作出傷害妻子的行為,包括心理上、生理上,〝傷害〞之定義以妻子的感覺為依歸。

第七條 不可觸犯任何法例。

第八條 不可相約損友蘇亞基,又名 AK 見面。

  • 蘇亞基的身份証號碼為K267xx3(2)
  • 蘇亞基姓名之中文電碼為1667 2348 3233

第九條 不可違反婚前協議書的內容。

第三章 夫妻間相處細節
第一條 丈夫需要定時向妻子報告行蹤。

第二條 丈夫在任何時刻,均不能與妻子失去聯絡。

  • 任何藉口,例如沒有帶電話、電話冇電…之類原因,皆不被接納。

第三條 丈夫不能探問或提及妻子的工作內容。

第四條 丈夫不能企圖或意圖影響妻子的觀點意見、以及對事物的看法。

第五條 若夫妻間對事物持有不同意見,以妻子的意見為最後依歸。

第六條 丈夫不可沉迷工作,忽略家庭生活,一切需以家庭為重。

第七條 丈夫需關心愛護妻子,每晚要服侍妻子,待妻子入睡方能睡覺。

第八條 丈夫有責任了解妻子之喜好,並應盡其所能滿足妻子的要求。

第九條 丈夫應尊重妻子意願,不可勉強妻子做任何非自願去做的事。

第十條 不可在家發脾氣,更不能在孩子面前發生爭執。

美女?Yeah,劇中是有美女沒錯,但本人最喜歡的是他:

BB from 《老婆大人》

㊣ 吧?如果有個這麽可愛的 Baby,我倒是不介意去簽這份 Contract :)

May 24

我是做 Java 的,也經常在網上混。混多了,多少有些體會,尤其是我這種挨踢人士。我上很多的技術論壇,用多了就發現這些論壇程序不太合意,當然了,這是人家的東西,域名和空間都是別人的,沒有我說話的份,而稍微好用一些的,都賣得很貴,而且,還不一定好用。Discuz 的精簡型(也就是最低級最便宜的版本)¥899(沒有任何技術支持,2 年 Upgrade ),CJSDN 的 Jute 個人版¥500 ( 1 年 Upgrade ),一個 PHP,一個 Java,都代表了論壇程序的最高水平。可是,太貴了,尤其對一些只是想搭建一個小小的空間讓朋友聚首的人來說。所以,就有了寫論壇程序的打算。Jwing 是網名及用在一些技術論壇的 ID,這個名字是很久以前想的,確切來說,應該是 J+Wing,J Stand For Java & Jim(Yeah, it’s me.),Wing 是希望自己能寫一個很棒的 Forum,有 Wing 的 Forum,飛快:)

一個論壇程序可大可小,不過我知道如果要做好,所要投入的時間和精力是巨大的,尤其是一個人業餘來做,Discuz 的大 C 用了三年(全職)把它做出了名堂,CJSDN 的 Jute 好像更久些,我不曉得我一個人能做出什麽來,我只是相信,堅持和努力是一定會有成果的~

現在說 License 問題好像有點遠,但是我想以後我業餘寫的所有東西,都會使用 BSD License,大概是因爲開源社區泡多了,受共産主義的思想影響比較大,我希望自己寫的東西能不受什麽 Copyright 這類東東的約束而幫到有需要的人,BSD License 可以做到這一點,Great~

其實呢,Forum 只是一部分,真正想做的,是一個完全而完整的 CMS,J2EE 做這類的東東有很多先天的優勢,我希望我能把它做好,盡管我知道開源在國內並不好混,沒關系,堅持自己的理想和信念,就是成功,就是勝利,Right?

May 23

返嚟衝完涼洗埋衫睇番發覺 12 點都嚟緊,時間過得真系快。不過都好,充實 D 會少好多無謂嘢諗,而且都唔覺攰,可能因爲平時有 Keep 住運動,所以都仲頂得順,博殺時期啊~

今晚家家冇乜人,其實系我去得早啫,所以食完都未有耐夠鍾,於是去一樓買咗本《Programmer》嚟睇,呢期幾個 Topic 都幾有意思,其中有講番 Joel 俾 CS Department 學生嘅一 D 建議,我睇完之後覺得幾好,決定 Post 其中 D 重點上嚟同大家分享下:

      Learn how to write before graduating.
      Learn C before graduating.
      Learn microeconomics before graduating.
      Don’t blow off non-CS classes just because they’re boring.
      Take programming-intensive courses.
      Stop worrying about all the jobs going to India.
      No matter what you do, get a good summer internship.

呢篇嘢系 Joel 系自己嘅 Weblog 上發表嘅,Title 系《Advice for Computer Science College Students》,如果有興趣可以上佢嘅 Weblog 度睇睇,除咗技術方面外,仲可以系度了解到處於 IT 業界絕對領先地位嘅美國呢方面嘅情況,有 SO:)