<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

    常用鏈接

    留言簿(19)

    隨筆檔案(115)

    文章檔案(4)

    新聞檔案(1)

    成員連接

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

      這是EasyJWeb新特性介紹的第三篇文章,主題是:簡約而不簡單,用最少的代碼,做盡可能多的事情。
      我們堅信,代碼量少,表達規(guī)范,語法結構穩(wěn)定的程序,更容易維護。EasyJWeb框架的一個最大特點,就是讓你能用最少、簡潔、規(guī)范的代碼,做盡可能多的事情。
      在寫程序這樣一個充滿藝術及哲學美的領域里,能用一句代碼解決的問題,決不能寫兩句代碼;能不用代碼解決的問題,就更不要寫代碼了:-)。我們要使用簡體字,是因為我們知道該簡化的一定要簡化。簡約而不簡單,是每一個程序員追求的一種境界。
      EasyJWeb的目標就是要讓大家書寫Java Web應用的時候,盡量的簡潔,代碼盡量少。但其實現(xiàn)的功能不簡單,其體系不簡單,其應用的領域不簡單。他能讓你用簡潔及簡約的表達方式,寫出正統(tǒng)、層次分明、可維護性高的JavaEE應用程序,實現(xiàn)企業(yè)級應用的需求。
      比如對于一個添刪除改查,我們使用正統(tǒng)OO分析的方式就是先進行建模,然后把模型轉化為java能識別的領域對象,或者是可持久化Entity對象。有了Entity或Domain,即可在這個基礎上構建業(yè)務邏輯、DAO以及前端表示層的界面操作。在DAO層,EasyJWeb的應用框架支撐平臺中提供了一些非常通用的解決方案,比如泛型DAO,JPA封裝等,他能使你根據(jù)情況選擇最適合你的持久層方案來解決專業(yè)問題。對于業(yè)務層來說,EasyJWeb通過引入了超級IOC容器,可以使得你用最適合自己的方式來解決業(yè)務層的問題,他同樣提供了一些通用的業(yè)務實踐及業(yè)務方法等輔助對象來幫助我們能使用盡量少、盡量簡潔的代碼來解決問題。
      下面我們看看在一個添刪改查、分頁、排序等針對Entity對象的能用操作中,一個基于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;
     }
     
    }


      對,只需要這么簡單的幾行代碼,告訴這個Action使用哪一個DAO及對哪一個Entity類進行操作,其它的一切都交由EasyJWeb提供的通用CRUD基類搞定。
      當然,我們使用其它的java mvc框架也能通過這樣的封裝來簡化用戶的Action,但實現(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性質應用的基類的代碼,如下:

    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ù),并更新到域對象中的相應屬性。toPo方法還會觸發(fā)數(shù)據(jù)較驗的執(zhí)行,true參數(shù)還會使得一但驗證過程中出現(xiàn)異常,則回滾對obj的操作,也就是不會更改任何obj的屬性。
      if (hasErrors())//有錯的話,則直接返回到數(shù)據(jù)錄入頁面
       return forward("edit");
      updateEntity(obj);
    //執(zhí)行更新操作
      return go("list");//跳轉到list命令執(zhí)行
     }

     

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

       

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

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

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

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

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


    網(wǎng)站導航:
     
    主站蜘蛛池模板: 最近免费中文字幕大全免费| 最近中文字幕mv免费高清电影 | 亚洲电影免费观看| 亚洲av极品无码专区在线观看| 浮力影院第一页小视频国产在线观看免费 | 久久精品国产亚洲AV麻豆网站| 成人免费无码大片A毛片抽搐色欲| 日日摸日日碰夜夜爽亚洲| 亚洲色自偷自拍另类小说| 一个人看www在线高清免费看 | 亚洲人成图片网站| 亚洲成人影院在线观看| 日韩精品极品视频在线观看免费| 亚洲精品欧美综合四区| 亚洲精品国产成人片| 性色av免费观看| 免费一级不卡毛片| 妇女自拍偷自拍亚洲精品| 亚洲avav天堂av在线不卡| 啦啦啦www免费视频| 国产成人精品免费久久久久| 亚洲av无码一区二区三区天堂| 亚洲av无码一区二区三区不卡| 四虎永久免费地址在线网站| 午夜不卡久久精品无码免费| 天堂在线免费观看| 亚洲大成色www永久网址| 亚洲综合伊人久久大杳蕉| 性xxxx视频播放免费| 最近2019中文字幕免费直播| 手机永久免费的AV在线电影网| 亚洲人成7777影视在线观看| 亚洲国产精品嫩草影院在线观看 | 嫩草影院在线免费观看| 国内精品久久久久影院免费| 国产一区二区三区亚洲综合| 亚洲综合色区中文字幕| 中文字幕亚洲精品资源网| 国产亚洲真人做受在线观看| 免费永久国产在线视频| 成年性生交大片免费看|