Jun 02

Hiding the Implementation

讓變動的事物與不變的事物彼此隔離,是 OOD 的首要考慮因素。

一、package:library unit
(1)package name 採用反相 internet 域名,以確保其唯一性,並且規定皆爲小寫(Java2 開始規定);

(2)import 的兩個 library 如含有同名的 class 則仍會發生衝突,可通過在使用時通過指定具體的 package.class 名來解決,如:

java.util.Random random = new Random();

二、Access Specifiers
(1)public:所定義的成員可爲所有人使用;

(2)private:除其所在的 class,沒有任何人(包括 package 成員)可以訪問;

(3)protected:允許 class 自身、subclasses 以及 package 成員訪問;

(4)friendly(默認、隱式):不加任何 Access Specifiers 的默認權限,類似於 protected,唯一的區別是 friendly 不能被繼承使用;

(5)default package:假設成員皆爲 friendly(或是更高級別的權限),那麽同一目錄下的所有 class 即使不加任何 package、import 聲明也可以相互調用;這是因爲 Java 會將這些 class 視爲隸屬於該目錄的 default package,也就是說,會爲它們加上當前的目錄做爲 default package。

三、Interface 與 Implementation
(1)訪問權限

  • 建立界限,保護(密)代碼;
  • 使得接口和實現分離、獨立。

(2)class 的訪問權限

  • 每個編譯單元(即文件)都僅能有一個 public class;
  • public class 的名稱(包括大小寫)必須與其編譯單元名稱完全相同;
  • 編譯單元內可不含任何的 public class;
  • 除 inner class,class 不能聲明爲 private 或 protected;
  • 使用 private class:

A. 可在 private class 內增加起接口作用的 static 成員,通過 static 成員來使用 private 成員;
B. 使用 Singleton。

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 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:)

May 20

最煩就是每天寫 Blog 的時候還得想用什麽題目,不寫,不寫不寫。

發現 jEdit 越來越好用了,安裝完 jEdit 後,通過它的 Plug-in Manager 裝上 BufferTabs(分頁管理)、Console(這個沒什麽好說的,不會你也別混這行了)、JavaFold(代碼摺疊)、 JIndex(API文檔索引)、DotComplete(自動代碼補全,based on JIndex)這幾個常用的 Plug-in,儼然就是一個輕量級的 IDE 了,編輯功能非常好用,粗略的看了看,jEdit 的插件雖然不算多,但分門別類,做得很細致、貼心。我記得有個猛人說過:“做 IDE 很不容易,因爲你面對的是世界上最挑剔和最有 Preference 的軟件用戶:程序員”,屢獲大獎的 jEdit 確實是很牛叉,看來我以前是錯過好東東了。

jEdit的 Plug-in 分類如下:

  • Applications
  • Enterprise
  • File Management
  • Formatters and Checkers
  • HTML and XML
  • Java-Centric
  • Language Support
  • Network
  • Project Management
  • Support
  • Text
  • Version Control
  • Visual

怎樣?不錯吧?我想如果 Eclipse 的老爸不是老不死的 IBM,又或者 jEdit 不是個人而是某某公司的話(這公司甚至不用很大),相信我們現在就不會聽到 Eclipse 這個名字了。

晚上的老師㊣點,是一個王姓的老太太,自稱 60 歲,很有活力,據她說自己可以連做 15 個 Push-up 不帶喘的…這個…本人有所保留。以下摘自王老太的講話:

…….所以說,除了清晰正確的直覺外,嚴謹的理性邏輯思維也是極其重要的,這也是現今一個領導所必備的基本、根本。我知道你們肯定又會問我:“老師,您不是具有清晰正確的直覺以及嚴謹的理性邏輯思維嗎?怎麽您就沒當上領導呢?”我告訴你們,全都去當領導了,那誰來培養領導呢?所以我呢,就擔當起這重任了!

笑~
自信的人總是很能吸引眼球的,我想老王當年大概也不乏追求者叻。

晚上走過一段路,忽然心頭有一陣莫名的壓力,突如其來,壓得我幾乎透不過氣,我就這麽突然的蹲在了路上,大口的喘著氣。最近腦子裏總是壓制不住的翻滾,反覆的炒著那碟冷飯,做著些無用功,所以最近我挺討厭自己的。於是我把它們釘入骨子,深入到骨髓裏,那就看不見了,痛雖依然,但卻會好的。