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

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

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

    where the amazing happens

    一個WEB框架功能的分析:用編碼規(guī)定代替配置文件

    Ruby on Rails有個設(shè)計思想是:用編碼規(guī)定代替繁瑣的配置文件。jvm平臺已經(jīng)有一些類似ror的實現(xiàn),比如
    grails:http://docs.codehaus.org/display/GRAILS/2006/03/29/Groovy+on+Rails+(Grails)+0.1+Released

    雖然由于java自身的局限,它很難做出像ruby或者groovy那樣動態(tài)語言那樣隨心所欲的動作,但是利用它的運行時反射、動態(tài)代理等特性來盡可能體現(xiàn)“用編碼規(guī)定代替繁瑣的配置文件”這一思想。下面就轉(zhuǎn)入正題。

    ServletAPI對HTTP協(xié)議進行了封裝,通過配置Web.xml來把不同的請求轉(zhuǎn)發(fā)給不同的servlet來處理。Web框架則用一個ActionServlet,根據(jù)自己的對Action的定義來轉(zhuǎn)發(fā)請求。
    拋開那些繁瑣的配置文件,設(shè)想一下這樣一種方法:

    1.Web動作的處理和響應(yīng)

    假設(shè)這樣一個POST請求:

    < form? action ="logic/group/NewTopic" ?method ="post" >

    Web動作實現(xiàn)Bean:

    org.qqsns.web.logic.group.NewTopic

    注意后面的logic/group/NewTopiclogic.group.NewTopic, 動作類和Web動作是通過請求路徑和包名相互關(guān)聯(lián)。
    這樣,對Web動作的響應(yīng)就依賴于編譯期的代碼的組織結(jié)構(gòu)而不是執(zhí)行期的配置文件。這樣的好處是避免了維護繁瑣的配置文件,特別是在沒有IDE支持的情況下。

    org.qqsns.web.logic.group.NewTopic類是一個實現(xiàn)net.wff.servlet.WebAction接口的POJO,下面是NewTopic中execute的方法片段:???

    // Only?method?must?be?implemented?for?interface?net.wff.servlet.WebAction
    ? public ?String?execute(HttpServletRequest?request,?HttpServletResponse?response)
    ?
    throws ?ServletException,?IOException {
    ??
    ??
    // return?"redirect?/success.html";?? // 請求重定向
    ?? return ? " /success.jsp " ;?????????????? // 請求轉(zhuǎn)發(fā)
    }

    ?execute方法的返回值手動指定了一個轉(zhuǎn)發(fā)或重定向的路徑。

    2.輸入驗證

    普通的Web框架都帶數(shù)據(jù)輸入驗證功能,一般復雜程度和功能強大與否成正比。
    這里簡單地要求從setter方法里拋出一個包含驗證信息的異常,以此來實現(xiàn)輸入異常處理。
    ??????
    普通setter方法

    public ? void ?setName(String?name) {?
    ??
    this .name? = ?name;
    }

    添加輸入驗證后的setter方法

    public ? void ?setName(String?name)? throws ?InputException {????
    ?
    if (name.length() < 3 )
    ????
    throw ? new ?InputException( " Topic?name?must?has?a?length?greater?than?3 " );?
    ??
    this .name? = ?name;
    }


    WaterFallServlet是如何處理驗證信息的:

    WebAction?wa? = ?
    ????(WebAction)Class.forName(classPath).newInstance();
    ??????????
    // procces?forwarding
    ?????????? try ? {
    ????ActionHelper.setProperties(request,wa);
    ???}
    ? catch ?(InputException?e)? {
    ????
    // return?to?input?view
    ????
    // header:referer
    ????String?rtn? = ?request.getHeader( " referer " );
    ????
    // clear?old?errors
    ???? if (rtn.indexOf( " ? " ) != 1 ) {
    ?????rtn?
    = ?rtn.substring( 0 ,rtn.indexOf( " ? " ));
    ????}

    ????rtn
    = rtn + " ?error= " + URLEncoder.encode(e.getMessage(), " UTF-8 " );
    ????response.sendRedirect(rtn);
    ????
    return ;
    ???}

    這樣驗證信息通過請求參數(shù)傳回到輸入頁面.

    3.數(shù)據(jù)綁定

    假設(shè)有這樣的html輸入:?

    < input? type ="text" ?name ="name" />
    < input? type ="text" ?name ="number" />
    < input? type ="text" ?name ="price" />

    ?下面是NewTopic中execute的方法全部:???

    public ?String?execute(HttpServletRequest?request,?HttpServletResponse?response)
    ?
    throws ?ServletException,?IOException {
    ??System.out.println(getName());
    ??System.out.println(getNumber());
    ??System.out.println(getPrice());
    ??System.out.println(getLength());
    ??
    return ? " /success.html " ;
    }

    自動從request注入parameter,這也許是很多人喜歡Struts DynamicActionForm的原因之一。
    不過這里實現(xiàn)更類似多了類型轉(zhuǎn)換的<jsp:setProperty name="bean" property="*"/>
    因為Name的類型是String,Number的類型是Integer,Price的類型是float,length的類型是double.至于其他復雜的類型,也許jsf的轉(zhuǎn)換器是個更好的主意。
    這樣就初步解決了數(shù)據(jù)的輸入綁定和驗證。余下的就是業(yè)務(wù)邏輯的問題。WaterfallWebFramework源代碼:
    http://m.tkk7.com/Files/zqc/WaterfallWebFramework.rar?(只有一個配置文件,其中只有1行配置信息!)

    以上就是框架的主要功能。用編碼規(guī)定代替配置文件,也許這會是一種更加高效率的開發(fā)方式。

    posted on 2006-05-17 13:12 where the amazing happens 閱讀(2114) 評論(3)  編輯  收藏 所屬分類: 自制土器

    評論

    # re: 一個WEB框架功能的分析:用編碼規(guī)定代替配置文件 2006-05-17 18:28 原創(chuàng)專欄 開源學習

    http://forum.javaeye.com/viewtopic.php?t=10894

    可以看看這個討論。
    大規(guī)模的項目這種方法還是不行滴。

      回復  更多評論   

    # re: 一個WEB框架功能的分析:用編碼規(guī)定代替配置文件 2006-05-17 19:44 鳥不生蛋蛋的地方

    去看仔細了下,覺得比較重要的是下面幾個問題:
    1.url mapping pattern的問題,就對一些特殊url的處理
    2.action對象重用的問題.
    3.頁面rendering的問題
    還沒使用jsp以外的腳本,所以不知道第3點怎么樣.
    1和2應(yīng)該算是url->class映射的副作用,傳統(tǒng)的通過mapping文件的定義可以使action對象從請求過程中脫離出來,達到可重用性.這一點url->class映射也許就做不到.畢竟依賴的都是編譯期的代碼,如果抽出來,那就又是配置文件了.

    對,沒錯.大型項目上百個action,比起結(jié)構(gòu)整潔或者配上IDE支持的配置文件,這樣的方法確實不好管理.雖然它方便了開發(fā)者.  回復  更多評論   

    # re: 一個WEB框架功能的分析:用編碼規(guī)定代替配置文件 2006-05-17 20:43 mixteluoyi

    對于維護和擴展開發(fā)不利。
    前兩批的開發(fā)人員走后,這種很多靠默認行為固定的邏輯誰明白。
    做軟件最重要的是維護性好,換過幾批人以后,仍然結(jié)構(gòu)清晰,后來的人能快速上手  回復  更多評論   

    公告

    點擊這里給我發(fā)消息

    導航

    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    統(tǒng)計

    常用鏈接

    留言簿(3)

    隨筆分類(18)

    隨筆檔案(17)

    文章分類

    相冊

    其他我的blog

    技術(shù)Blog

    最新隨筆

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 日韩免费在线观看| 亚洲精品国产精品乱码视色| 国产免费福利体检区久久| 亚洲中文字幕无码久久综合网| 最近的中文字幕大全免费8 | 亚洲国产区男人本色| 伊人亚洲综合青草青草久热| 亚洲成人免费电影| 四虎成人精品国产永久免费无码| 久久丫精品国产亚洲av不卡 | 亚洲国产综合精品| 亚洲国产婷婷香蕉久久久久久| 99蜜桃在线观看免费视频网站| 国产亚洲精品国产福利在线观看| 亚洲色图国产精品| xvideos亚洲永久网址| 4399好看日本在线电影免费| 精品97国产免费人成视频| 中文字幕亚洲男人的天堂网络 | 国产亚洲一区二区手机在线观看| 天天摸夜夜摸成人免费视频 | 麻豆国产精品入口免费观看| 毛片在线全部免费观看| 国产亚洲福利一区二区免费看| 亚洲爱情岛论坛永久| 可以免费观看的一级毛片| 亚洲人成免费电影| 亚洲粉嫩美白在线| 亚洲av无码一区二区三区网站| 国产成人一区二区三区免费视频| 亚洲人成免费网站| 久久精品一区二区免费看| 成人免费网站视频www| 亚洲精品人成网线在线播放va| 亚洲精品日韩专区silk| 97热久久免费频精品99| 少妇人妻偷人精品免费视频 | 免费少妇a级毛片人成网| 午夜国产大片免费观看| 1000部免费啪啪十八未年禁止观看| 一个人看的免费观看日本视频www 一个人看的免费视频www在线高清动漫 |