Jakarta Commons
#ASF#




昨天看到報紙, 剛好講到中國石油所有直營店全國大概有 610 家全部更換了 3S ( Gas Service Station) POS 系統, 造成了需要先背誦 100 多個指令, 存量具有負數, 結帳要人工比對, 每個加油站員工都需要加班來處理這堆奇怪的數字. 如果是工讀生更是痛苦, 還要臨時翻操作手冊. 中油的軟體建置廠商表示, 3S 系統是將資料先暫存各個加油站的硬碟之中, 為了避免頻寬的浪費, 所以每隔一段時間自動匯到 Server 上, 如果網路發生問題, 將造成伺服器端的困擾. 不過, 中油行銷事業部指出, 3S 可以分析消費者消費習性, 認為初期的導入不適應是必然的現象.


這則新聞告訴了我們, 這個 3S 系統有很多問題, 我歸類成幾個
  1. 操作介面不友善
  2. 測試不完整
  3. 交易處理 ( Transaction Commit/Rollback ) 過於複雜
這是在台灣軟體界很常發現的一個現象, 反正我開發出去了, 所有的 User 就是我的測試人員, 當錯誤發生了, 我再來想該怎麼修改, 操作介面大概是以工程師或坐在辦公室的企劃人員為角度來思考, 而不是由廣大的使用群代表來使用. 複雜的商業邏輯, 應該是雜亂無章的開發方式, 破一洞補一洞的開發, 造成了交易處理由原有的簡單明瞭, 到現在複雜堆疊, 所以才會造成穩定性的下降.


.NET 之於 J2EE 開發, .NET 非常直覺, 操作介面上, 就領先了 j2ee. 不知道 Project Rave 能不能迎頭趕上落後的進度, 不過如同我上週說的 BEA Weblogic Workshop 就是希望減少開發者學習的負擔, 沒有友善的 UI , 再怎麼好的程式也是無法運作正常的.


測試的部分, java 的 solution 就很多了, JUnit, Cactus, XXXUnit 等等, 可以設計各式各樣的 test script, 準備各種的 TestCase, TestData 等等去測試. 甚至 refactory 也有 jRefactory 這些工具. 讓我們可以完成單元測試, 系統測試, 連結測試等等....


我一直強調, 好的程式一定要簡單, 簡單建置, 簡單閱讀, 簡單修改, 越複雜的程式越容易出錯, 我看過工程師寫了一個 method 幾百行的程式沾沾自喜, 這就是沒有辦法搞清楚元件化的意義. 利用各種 Design Pattern 去創造更好的程式架構. 除了程式註解, 更需要有說明文件或 UML Diagram 來輔助說明...


OO 似乎還有一條漫長的路要走.
因為要了解 Maven 這個專案之前, 必須要先了解一些 commons library 的使用, 除了上週介紹的 jakarta commons-betwixt 之外, 還有 jakrta commons-jelly & commons-jexl, 甚至包含了一些還在 commons sandbox 中的專案, 如 commons-grant & commons-graph 等等. 本週則先介紹 commons-jexl, 這種底層的東西, 或許有點枯燥, 但是懂了, 會對於大系統有更深的了解.


歡迎參觀 jini(99% jakarta) 的部落格 -


贊助 -- 如果你覺得這個電子報對你有幫助, 可以匯款贊助, 如果需要刊登廣告, 也可聯絡 !
匯款帳號 : 第一銀行 板橋分行 201-10-071238

帳戶名稱 : 松凌科技股份有限公司

聯絡電話 : (02)8951-9554 # 121 王先生

聯絡Email: johnny@softleader.com.tw

本週主題 -- jakarta commons-jexl
SECTION 01 JSTL 簡介

JSR#052 ,JSTL ( Java Standard Taglib ) 出來之後, 就風靡了所有 jsp 的程式界, 到底他有什麼魅力, 基本上, JSTL 是採用一組 taglib 來處理網頁呈現部分的狀況, JSTL 目前有 1.0 和 1.1 的版本, 1.0 是在 jsp 1.2 的 container ( ex. Tomcat4.x ) 執行的, 1.1 是在 jsp 2.0 的 container ( ex. Tomcat 5.x ) 執行的. 至於 JSTL 的基本概念大家可以由 這幾篇教學文章去了解, 大概對 JSTL 就會有基本概念了. 如果想要更深入, 可以去買 Manning 出版的 JSTL in Action 這本書, 我本身對這本書的評價很高 ^^~


我就簡短說明一下 JSTL ,總共分為四類別:
  • core (c) : 大多是處理網頁資料的處理
  • xml Processing (x) : XML 相關的執行
  • i18 & formatting (fmt): 設定國際化及區域格式化
  • database access (sql): 資料庫存取的方法
不過最令人激賞的是他的 Expression Language 簡稱 EL , 如果使用過 JavaScript 的人感覺上應該就不會陌生, 他的標準表示法是 ${expr}, 我們可以使用 ${MyObject.property} 取得一般物件的屬性值, ${myObj["myProperty"]} 如果是 java.util.Map 屬性的物件可以這麼取得屬性值. ${myObj[varWithTheName]} 如果是 java.util.List 屬性的物件可以這麼取得屬性值.


SECTION 02 Jexl 簡介

Jexl 就是一個 Expression Language 的解析引擎, 是為了方便嵌入你的系統或著程式框架的開發中, 他算是實作了 JSTL 中 EL 的延伸版本. 不過也採用了一些 Velocity 的觀念.


目前還沒有正式 dist release 出來, 我是採用 2003/10/09 日的版本, 可以自行到 CVS Nightly Build 取得最新的 binary 以及 source 版本.


SECTION 03 Jexl 使用說明

首先, 我們會利用 ExpressionFactory.createExpression() 建立相關的表示法, 接著, 採用 JexlHelper.createContext() 建立相關的內容, 最後用, Expression.evluate(JexlContext) 處理最後的結果. 相當的簡單.
import org.apache.commons.jexl.Expression;
import org.apache.commons.jexl.ExpressionFactory;
import org.apache.commons.jexl.JexlContext;
import org.apache.commons.jexl.JexlHelper;

import java.util.List;
import java.util.ArrayList;

public class ArrayExample
{
    public static void main(String args[])
        throws Exception
    {
        /*
         *  First make a jexlContext and put stuff in it
         */
        JexlContext jc = JexlHelper.createContext();

        List l = new ArrayList();
        l.add("Hello from location 0");
        l.add(new Integer(2));
        jc.getVars().put("array", l);

        Expression e = ExpressionFactory.createExpression("array[1]");
        Object o = e.evaluate(jc);
        System.out.println("Object @ location 1 = " + o);

        e = ExpressionFactory.createExpression("array[0].length()");
        o = e.evaluate(jc);

        System.out.println("The length of the string at location 0 is : " + o);
    }
}
這一個程式是說, 我建立了一個 List l, 先放入 "Hello from location 0", 接著放入 2 這個數字, 接著, JexlContext jc 的內容就是這個 List. 第一個 Expression 我們採用 array[1] 的表示法, 他去 evaluate jc 值, 會得到 Object @ location 1 = 2 的結果印出來, 因為 array[1] 是存放著 2 這個數字.


第二個 Expression 我們採用 array[0].length() 的表示法, 他還是 evaluate 相同的 jc 值, 得到的結果是 The length of the string at location 0 is : 21, 因為 "Hello from location 0" 的長度是 21.


SECTION 04 Jexl 使用技巧

接著, 我們來探討直接採用 JexlContext jc = JexlHelper.createContext(); , jc.getVars().put 一個 Object 或 一個 method 的狀況.
import org.apache.commons.jexl.JexlHelper;
import org.apache.commons.jexl.JexlContext;
import org.apache.commons.jexl.Expression;
import org.apache.commons.jexl.ExpressionFactory;

public class MethodPropertyExample
{
    public static void main(String args[])
        throws Exception
    {
        /*
         *  First make a jexlContext and put stuff in it
         */
        JexlContext jc = JexlHelper.createContext();

        jc.getVars().put("foo", new Foo());
        jc.getVars().put("number", new Integer(10));

        /*
         *  access a method w/o args
         */
        Expression e = ExpressionFactory.createExpression("foo.getFoo()");
        Object o = e.evaluate(jc);
        System.out.println("value returned by the method getFoo() is : " + o);

        /*
         *  access a method w/ args
         */
        e = ExpressionFactory.createExpression("foo.convert(1)");
        o = e.evaluate(jc);
        System.out.println(
        "value returned by the method convert() w/ arg = 1 is : " + o);

        e = ExpressionFactory.createExpression("foo.convert(1+7)");
        o = e.evaluate(jc);
        System.out.println(
        "value returned by the method convert() w/ arg = 1+7 is : " + o);

        e = ExpressionFactory.createExpression("foo.convert(1+number)");
        o = e.evaluate(jc);
        System.out.println(
        "value returned by the method convert() w/ arg = 1+number is : " + o);

        /*
         * access a property
         */
        e = ExpressionFactory.createExpression("foo.bar");
        o = e.evaluate(jc);
        System.out.println("value returned for the property 'bar' is : " + o);

    }

    public static class Foo
    {
        public String getFoo()
        {
            return "This is from getFoo()";
        }

        public String get(String arg)
        {
            return "This is the property " + arg;
        }

        public String convert(long i)
        {
            return "The value is : " + i;
        }
    }

}
這程式執行的結果是
value returned by the method getFoo() is : This is from getFoo()
value returned by the method convert() w/ arg = 1 is : The value is : 1
value returned by the method convert() w/ arg = 1+7 is : The value is : 8
value returned by the method convert() w/ arg = 1+number is : The value is : 11
value returned for the property 'bar' is : This is the property bar
很簡單的方法, 因為你 new Foo() 放到 jc 之中, 利用 foo.getFoo() 的表示法, 就可以取得 foo.getFoo() 的結果.

foo.convert(arg) 的觀念也是一樣的, 就是相當於 (new Foo()).convert(arg);

當然, 你要用到 jc 中的 "number" ( 預設是給 10 ), 直接利用 "foo.convert(1+number)" 就可以呼叫到啦,

如果你只有寫 get(String arg) 在 Object 之中的 method, foo.bar 相當於呼叫 (new Foo()).get("bar");


SECTION 05 結論

Jexl 和 Jelly 是 Jakarta Je*l* 特殊的專案, 單看這 Jexl 你可能會覺得, 幹麼要這麼麻煩, 介紹 Jelly 的時候, 會用到 Jexl 許多的 EL 語法, 所以在 大型專案或Framework 開發的時候, 除了網頁可以用 JSTL 之外, 商業邏輯部分也可採用 el 的表示法, 可以讓程式碼的容錯更高, 撰寫起來更方便, 我們只需要 Expression e = ExpressionFactory.createExpression(expr), 就可以透過 e.evaluate(jc); 來取得該物件的數值.
參考 -- 相關書目或相關文章

  1. jakarta commons
    http://jakarta.apache.org/commons/
  2. jakarta commons-jexl
    http://jakarta.apache.org/commons/jexl/
  3. jakarta commons-jexl api
    http://jakarta.apache.org/commons/jexl/apidocs/index.html
人才招募 -- 松凌科技 徵才



>>徵求 Java 工程師 1 名<<



徵求有心向學的 Java 工程師加入我們的行列, 本公司的 Framework 採用 Struts 為基礎, 主要著重於 J2EE 相關系統開發 及 金融資訊的資訊整合應用, 目前的產品涵蓋了證券/期貨/基金 及 EIP/CMS 等, 工作內容以 WEB-Based J2EE 程式設計為主, 歡迎大家的加入.


應徵職稱: Java 軟體工程師

員工福利: 享有勞健保, 保障 14 個月年薪, 股票分紅等福利.

工作年資: 不拘, 也歡迎剛退伍或畢業的新鮮人加入

性別: 不拘, 只要能夠吃苦耐勞即可

人格特質: 聰明, 外向, 肯拼, 肯學

學經歷需求: 大專學校資訊相關科系畢業尤佳, 或具有 SCJP 認證, 有 SCWCD 將優先錄用

基本技能: JSP, MVC 概念, 了解 Struts 者優先錄用

聯絡電話: (02)8951-9554 #9 陳小姐

聯絡Email: yvonne@softleader.com.tw

履歷格式: http://www.softleader.com.tw/resume/resume.doc

廣告 -- 松凌科技 獨家贊助



>>軟體生產力提升計畫 -- 企業包班方案<<



如果你們公司正在想要轉型成為 java 的軟體公司,

或是已經採用 java 卻發現不得其門而入,

甚至工程師一直無法突破瓶頸,

松凌科技技術顧問團隊將帶領你們技術人員在五天的課程中,

了解整個 j2ee 的概觀以及標準的開發流程.



課程名稱: 建立 J2EE 標準的開發流程

課程編號: SLJ-021

課程時數: 40 小時

課程規劃:
  • J2EE 架構與概觀
  • 使用 Struts 建立一套完善的 MVC Framework
  • 建立自己的設計模組 Design Pattern
  • 使用 Hibernate 建立 O/R Mapping 的環境
  • 透過 JSTL 處理頁面端邏輯
  • 實作教育
基本開班人數: 10 人

收費標準: 每人 30,000 元, 超過一人酌收 5,000 元 ( 含稅, 大台北地區外需加上車馬費 )

聯絡電話: (02)8951-9554 # 111 陳先生

聯絡Email: kevin@softleader.com.tw

政府補助: 短中期輔導課程, 可申請軟體策進協會補助約 50% 的教育訓練費用

快速訂閱 -- 覺得好就訂閱吧~~~~
目前訂戶數: ; 目前發報數: ;
欣賞之前發行電子報 ;
投票區 ~ 覺得好就投票吧 !
有夠讚 不錯啦 普普說 蠻爛的 爛到最高點