隨筆 - 115  文章 - 481  trackbacks - 0
          <2007年8月>
          2930311234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          常用鏈接

          留言簿(19)

          隨筆檔案(115)

          文章檔案(4)

          新聞檔案(1)

          成員連接

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

            這是EasyJWeb新特性介紹的第三篇文章,主題是:簡約而不簡單,用最少的代碼,做盡可能多的事情。
            我們堅(jiān)信,代碼量少,表達(dá)規(guī)范,語法結(jié)構(gòu)穩(wěn)定的程序,更容易維護(hù)。EasyJWeb框架的一個(gè)最大特點(diǎn),就是讓你能用最少、簡潔、規(guī)范的代碼,做盡可能多的事情。
            在寫程序這樣一個(gè)充滿藝術(shù)及哲學(xué)美的領(lǐng)域里,能用一句代碼解決的問題,決不能寫兩句代碼;能不用代碼解決的問題,就更不要寫代碼了:-)。我們要使用簡體字,是因?yàn)槲覀冎涝摵喕囊欢ㄒ喕:喖s而不簡單,是每一個(gè)程序員追求的一種境界。
            EasyJWeb的目標(biāo)就是要讓大家書寫Java Web應(yīng)用的時(shí)候,盡量的簡潔,代碼盡量少。但其實(shí)現(xiàn)的功能不簡單,其體系不簡單,其應(yīng)用的領(lǐng)域不簡單。他能讓你用簡潔及簡約的表達(dá)方式,寫出正統(tǒng)、層次分明、可維護(hù)性高的JavaEE應(yīng)用程序,實(shí)現(xiàn)企業(yè)級應(yīng)用的需求。
            比如對于一個(gè)添刪除改查,我們使用正統(tǒng)OO分析的方式就是先進(jìn)行建模,然后把模型轉(zhuǎn)化為java能識別的領(lǐng)域?qū)ο螅蛘呤强沙志没疎ntity對象。有了Entity或Domain,即可在這個(gè)基礎(chǔ)上構(gòu)建業(yè)務(wù)邏輯、DAO以及前端表示層的界面操作。在DAO層,EasyJWeb的應(yīng)用框架支撐平臺中提供了一些非常通用的解決方案,比如泛型DAO,JPA封裝等,他能使你根據(jù)情況選擇最適合你的持久層方案來解決專業(yè)問題。對于業(yè)務(wù)層來說,EasyJWeb通過引入了超級IOC容器,可以使得你用最適合自己的方式來解決業(yè)務(wù)層的問題,他同樣提供了一些通用的業(yè)務(wù)實(shí)踐及業(yè)務(wù)方法等輔助對象來幫助我們能使用盡量少、盡量簡潔的代碼來解決問題。
            下面我們看看在一個(gè)添刪改查、分頁、排序等針對Entity對象的能用操作中,一個(gè)基于EasyJWeb寫的Action中的內(nèi)容:

           

          public class PersonAction extends CrudAction {
           @Inject(name
          ="personDao")
           
          private GenericDAO<Person> dao;
           
           
          public void setDao(GenericDAO<Person> dao) {
            
          this.dao = dao;
           }

           
          protected Class entityClass() {  
            
          return Person.class;
           }

           
          public GenericDAO getDao() 
            
          return dao;
           }
           
          }


            對,只需要這么簡單的幾行代碼,告訴這個(gè)Action使用哪一個(gè)DAO及對哪一個(gè)Entity類進(jìn)行操作,其它的一切都交由EasyJWeb提供的通用CRUD基類搞定。
            當(dāng)然,我們使用其它的java mvc框架也能通過這樣的封裝來簡化用戶的Action,但實(shí)現(xiàn)同樣的功能,EasyJWeb的基類Action所使用的代碼肯定是比較少的,而且也是非常直觀的。我們來看看添刪改查的CrudAction基類及其父類的代碼。

          abstract public class CrudAction extends AbstractCrudAction {
           
          public abstract GenericDAO getDao();
           
          protected Object findEntityObject(Serializable id) {
            
          return getDao().get(id);
           }

           
          protected IPageList queryEntity(IQueryObject queryObject) {
            
          return QueryUtil.query(queryObject, entityClass(), getDao());
           }

           
          protected void removeEntity(Serializable id) {
            getDao().remove(id);
           }

           
          protected void saveEntity(Object obj) {
            getDao().save(obj);
           }

           
          protected void updateEntity(Object obj) {
            getDao().update(obj);
           }

          }


            CrudAction的父類AbstractPageCmdAction,也就是添刪改查CRUD性質(zhì)應(yīng)用的基類的代碼,如下:

          public abstract class AbstractCrudAction extends AbstractPageCmdAction {
           
          protected abstract Class entityClass();
           
          public Page doInit(WebForm form, Module module) {
            
          return go("list");
           }

           
          public Page doNew(WebForm form, Module module) {
            
          return module.findPage("edit");
           }

           
          public Page doSave(WebForm form) {
            Object obj 
          = form.toPo(entityClass());
            
          if (hasErrors()) {
             form.set(
          "id"null);
             
          return forward("edit");
            }

            saveEntity(obj);
            
          return go("list");
           }

           
          public void doEdit(WebForm form) {
            Object obj 
          = findEntityObject(getIdValue(form));
            form.addPo(obj);
           }

           
          public Page doUpdate(WebForm form) {
            Object obj 
          = findEntityObject(getIdValue(form));
            form.toPo(obj,
          true);
            
          if (hasErrors())
             
          return forward("edit");
            updateEntity(obj);
            
          return go("list");
           }

           
          public void doDel(WebForm form) {
            removeEntity(getIdValue(form));
            go(
          "list");
           }

           
          public void doList(WebForm form) {
            IPageList pageList 
          = queryEntity((IQueryObject) form.toPo(getQueryClass()));
            CommUtil.saveIPageList2WebForm(pageList, form);
           }


           
          protected Serializable getIdValue(WebForm form) {
            
          return (Serializable) BeanUtils.convertType(form.get(getIdName()),
              getIdClass());
           }


           
          protected Class getQueryClass() {
            
          return QueryObject.class;
           }

           
          protected Class getIdClass() {
            
          return Long.class;
           }

           
          protected String getIdName() {
            
          return "id";
           }


           
          protected abstract void saveEntity(Object obj);
           
          protected abstract Object findEntityObject(Serializable id);

           
          protected abstract void updateEntity(Object obj);
           
          protected abstract void removeEntity(Serializable id);
           
          protected abstract IPageList queryEntity(IQueryObject queryObject);
          }


          以代碼比較多的doUpdate及doList為例,我們來看看他有哪些內(nèi)容:

           public Page doUpdate(WebForm form) {
            Object obj 
          = findEntityObject(getIdValue(form));//根據(jù)某一種方式先讀出需要修改的對象
            form.toPo(obj,true);//讀取客戶端Form表單中傳來數(shù)據(jù),并更新到域?qū)ο笾械南鄳?yīng)屬性。toPo方法還會(huì)觸發(fā)數(shù)據(jù)較驗(yàn)的執(zhí)行,true參數(shù)還會(huì)使得一但驗(yàn)證過程中出現(xiàn)異常,則回滾對obj的操作,也就是不會(huì)更改任何obj的屬性。
            if (hasErrors())//有錯(cuò)的話,則直接返回到數(shù)據(jù)錄入頁面
             return forward("edit");
            updateEntity(obj);
          //執(zhí)行更新操作
            return go("list");//跳轉(zhuǎn)到list命令執(zhí)行
           }

           

           public void doList(WebForm form) {
            IPageList pageList 
          = queryEntity((IQueryObject) form.toPo(getQueryClass()));//把form中傳來在查詢表單中輸入的信息,構(gòu)造查詢對象,并執(zhí)行查詢操作
            CommUtil.saveIPageList2WebForm(pageList, form);//保存查詢結(jié)果,并自動(dòng)使用list.html頁面模板來顯示查詢結(jié)果。
           }

             

            可以試著用Struts1.x來實(shí)現(xiàn)上面的同樣的功能,你會(huì)發(fā)現(xiàn)需要的代碼及配置文件字節(jié)會(huì)多僅一倍多。Struts2webwork的升級,代碼確實(shí)簡化了不少,大家可以用他實(shí)現(xiàn)上面的功能,對照一下代碼誰簡潔一比便知。

            當(dāng)然,如果熟悉動(dòng)態(tài)語言中的MVC框架,比如Rails,你會(huì)發(fā)現(xiàn),這些框架中要實(shí)現(xiàn)同樣的功能,他的代碼不會(huì)比EasyJWeb簡潔多少。當(dāng)然,造飛機(jī)、火箭的流程及所需要的技術(shù)肯定是比造拖拉機(jī)、摩托車要復(fù)雜得多,我們做的事情就是盡是簡化。下面我會(huì)從多個(gè)方面進(jìn)入介紹。
           

          posted on 2007-08-14 10:05 簡易java框架 閱讀(901) 評論(5)  編輯  收藏

          FeedBack:
          # re: 用盡量少的代碼,做盡量多的事情  2007-08-14 11:36 強(qiáng)
          嗯,你以后寫的代碼全部只有兩個(gè)字節(jié),那就是0和1。  回復(fù)  更多評論
            
          # re: 用盡量少的代碼,做盡量多的事情  2007-08-14 11:57 愛兼職
          首先聲明我不喜歡struts。框架的比較不是看需要幾行代碼,哪個(gè)少?而是看哪個(gè)更易于理解,程序員需要而且有比較了解框架的實(shí)現(xiàn)原理和細(xì)節(jié),否則就被忽悠了。  回復(fù)  更多評論
            
          # re: 用盡量少的代碼,做盡量多的事情  2007-08-14 12:44 terrybean
          為什么用rails能那么簡潔,而用java就要費(fèi)那么費(fèi)勁呢?  回復(fù)  更多評論
            
          # re: 用盡量少的代碼,做盡量多的事情  2007-08-14 12:52 pass86
          少的代碼中蘊(yùn)含這更多的內(nèi)容。  回復(fù)  更多評論
            
          # re: 用盡量少的代碼,做盡量多的事情  2008-01-24 15:22 小人物
          啥也別說了, 純屬一個(gè)SB而已.  回復(fù)  更多評論
            

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 雷山县| 乌鲁木齐县| 拜城县| 耿马| 尼勒克县| 翁牛特旗| 湟源县| 湖口县| 宁阳县| 逊克县| 富阳市| 湖南省| 阜宁县| 高阳县| 湘西| 仁布县| 科技| 清镇市| 寻乌县| 烟台市| 镇江市| 增城市| 建水县| 永福县| 巢湖市| 平利县| 全州县| 丹东市| 阜新| 双峰县| 蒙城县| 黄梅县| 沙河市| 东阳市| 临泉县| 洪泽县| 昌邑市| 宜春市| 明光市| 陆丰市| 邯郸市|