只要你願意嚴肅規矩的java也同樣可以變得動態靈活起來動有動的好處靜有靜的好處俗話說得好沒有規矩不成方圓但生命誠可貴愛情價更高若為自由故兩者皆可拋那麼作為忙碌在程序藝術世界裡的子民們我們何去何從呢?投奔動態語言陣營還是繼續在四平八穩的Java領域奮戰? 在我看來動或不動需要一個黃金分割點
尋找動與不動的黃金分割點
兩年前以Martin Fowler為代表的一群大師們突然集體投奔到了動態語言陣營手持RoR這個核武器大喊著要滅了Java要取代Java現在回頭來看動態語言給我們確實帶來了一些的革命性的思想但同時我們也發現被大師們忽悠了一把
對於強類型的Java語言來說與真正的動態語言比起來確實要受限制很多在我看來借某位大師的比喻Ruby的敏捷相當草書而java就是正楷用Ruby十個程序員寫出來的程序就是十種風格這跟我們寫文章是一樣的而Java就是規規矩矩宋體方塊字橫是橫豎是豎先寫哪一筆後寫哪一劃一切都是規定好了的強類型的靜態語言從語法的底層就建立了一套較為穩固的規則體系因此更加規范從長遠來說或者是對於大型項目來說肯定是有規范並且規范嚴格的較之規范不嚴格的表現起來從擴展性可維護性等要優秀得多
動態語言與強類型的靜態語言他們各有自己的特長范圍在企業級應用領域JavaEE的優勢不是一天兩天建立起來的而動態語言其實由來已久最優秀我覺得應該算是javascript了想想以前用asp寫程序服務器及客戶端腳本都用的js對於小型的應用來說確實很舒服而近兩年由於Ajax概念股的走紅javascript更加春風得意prototypejs等一批的Ajax框架及引擎更是把javascript的OO及動態特性發揮到極致對於來勢凶猛的RoR來說在我看來最好先去跟phpPython這種同類的競爭者好好PK幾年如果不被他們滅掉的話然後再來研究要花多少光年來滅掉java這樣的命題
對於小型的應用來說小巧靈活簡單的動態語言肯定在先機上占有一定優勢但對於大型的企業級應用來說動態語言的這種巧活隨意性恰好成為其劣勢這其中的原因除了本身能力(多核線程系統資源等)有限以外太草了也是限制其發展的原因事實證明動態語言能做到的咱們靜態語言稍為動動腦子調整一下也能做到比如Groovy;而靜態語言能做到的動態語言打死也做不到除非他自己變成靜態的強類型語言比如多核線程二階段分布式事務如果做到了他可能就不僅僅是動態語言了
動有動的好處靜有靜的好處俗話說得好沒有規矩不成方圓但生命誠可貴愛情價更高若為自由幫兩者皆可拋那麼作為忙碌在程序藝術世界裡的子民們我們何去何從呢?投奔動態語言陣營還是繼續在四平八穩的Java領域奮戰?
在我看來動或不動需要一個黃金分割點而在EasyJWeb之所以提供一些動態特性的支持也就是尋找這樣一個分割點而做的把動與靜的好處進行分析權衡然後讓JavaEE應用開發變得更加的容易努力尋找這樣的黃金分割點對一些非常好的動態特性及思想提供應用級的支持而對於一些必須規范才能產生效率的特性則堅持推廣應用Java社區中的很多人都在為尋找這個分割點而努力Java本身也已經意識到這一點在其新的版本中都增加了對一些優秀的動態語言特性的支持
當然對一直覺得受約束受限制的我們來說能動一點想草的時候草兩下這是一件非常快樂的事兒因此EasyJWeb在基於Java這樣一個具有規范的平台及環境作為基礎的前提下做了一些工作使得我我們在一定的范圍內也可以靈活的動起來隨性地草起來這樣使得我們可以放開手腳輕松大膽的往前走下面我通過一些例子來說明
百變CmdActionAbstractCmdAction
在EasyJWeb新版本的Command類型的Action基類即AbstractCmdAction中提供了足夠的靈活特性使你得可以像使密宗拳一樣書寫Java Web Action可以根據你不同的應用場景像用動態語言那樣書寫Action中的command
假如我們在一個模塊中要執行一個名為create操作下面的方法簽名都是合法的
public Page doCreate(WebForm formModule module)
public Page doCreate(WebForm form)
public Page doCreate(Module module)
public Page doCreate();
public void doCreate(WebForm formModule module)
public void doCreate(WebForm form)
public void doCreate(Module module)
public void doCreate();
另外把方法名稱改成create系統也一樣能識別如
public Page create(WebForm formModule module)
public Page create(WebForm form)
public Page create(Module module)
public Page create();
public void create(WebForm formModule module)
public void create(WebForm form)
public void create(Module module)
public void create();
我們可以使用xxxejf?easyJWebCommand=create的方式來調用這個方法也可以使用xxxejf?cmd=create的方式來調用甚至我們還可以使用/ejf/xxx/create的形式來調用
這種靈活的Action中的命名方法一方面可以使代碼更加簡潔易維護同時也使我們的代碼看起來更cool另外一個主要原因是其使我們可以非常容易書寫這些方法的測試代碼不需要任何Web容器我們就能運行EasyJWeb的單元測試
看看Struts那種每個方法都必須生搬硬套的生成下面的方法
public ActionForward command(ActionMapping mapping ActionForm form HttpServletRequest request HttpServletResponse response) {
…
}
對照EasyJWeb中提供的百變Command方法簽名您是否感覺到這個世界正在前進呢?
更多的動感地帶
想動就動起來吧不僅僅體現在方法的書寫方式上在EasyJWeb中很多地方都用到了這種動態的特性比如forward及go方法提供的多種調用方法驗證標簽中以自然語言為主體的動態參數配置信息都體現了EasyJWeb能動起來的特性
以驗證為例我們可以通過多種方式來告訴EasyJWeb我們需要進行驗證比如我可以通過在@FormPO中針對一個或多個屬性指定驗證規則看示例
@FormPO(name=personvalidators=
{@Validator(name=requiredfield=namesexheigthborndate)
@Validator(name=rangefield=borndatevalue=min:;max:)})
public class Person{
…屬性及getter/setter方法
}
你應該猜得出來上面的標簽中我們指定Person對象的namesexheigthborndate等屬性為必填屬性在驗證數據范圍的RangeValidator中你可以不用去管要驗證的目標類型是Integer還是BigDecimal或者是Date只要他能比較就可以應用該驗證器來對其值范圍進行驗證確保我們的域模型得到的是一個合理的值
在標識驗證的時候可以設置自定義的驗證提示信息比如你可以使用下面的方式來標識一個范圍驗證
@Validator(name=rangefield=borndatevalue=min:;max:;min_msg:出生日期不能小於年;max_msg:出生日期不能大於年!)
除了min_msg及max_msg以外你還可以使用基於java習慣的minMsg及maxMsg來標識同樣的驗證提示信息
From:http://tw.wingwit.com/Article/program/Java/hx/201311/25663.html