where the amazing happens

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

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

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

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

          1.Web動作的處理和響應

          假設這樣一個POST請求:

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

          Web動作實現Bean:

          org.qqsns.web.logic.group.NewTopic

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

          org.qqsns.web.logic.group.NewTopic類是一個實現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 " ;?????????????? // 請求轉發
          }

          ?execute方法的返回值手動指定了一個轉發或重定向的路徑。

          2.輸入驗證

          普通的Web框架都帶數據輸入驗證功能,一般復雜程度和功能強大與否成正比。
          這里簡單地要求從setter方法里拋出一個包含驗證信息的異常,以此來實現輸入異常處理。
          ??????
          普通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 ;
          ???}

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

          3.數據綁定

          假設有這樣的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的原因之一。
          不過這里實現更類似多了類型轉換的<jsp:setProperty name="bean" property="*"/>
          因為Name的類型是String,Number的類型是Integer,Price的類型是float,length的類型是double.至于其他復雜的類型,也許jsf的轉換器是個更好的主意。
          這樣就初步解決了數據的輸入綁定和驗證。余下的就是業務邏輯的問題。WaterfallWebFramework源代碼:
          http://www.aygfsteel.com/Files/zqc/WaterfallWebFramework.rar?(只有一個配置文件,其中只有1行配置信息!)

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

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

          評論

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

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

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

            回復  更多評論   

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

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

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

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

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

          公告

          點擊這里給我發消息

          導航

          <2006年5月>
          30123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910

          統計

          常用鏈接

          留言簿(3)

          隨筆分類(18)

          隨筆檔案(17)

          文章分類

          相冊

          其他我的blog

          技術Blog

          最新隨筆

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 柞水县| 彰武县| 延庆县| 平舆县| 濮阳市| 贡山| 文化| 南京市| 阳山县| 沙田区| 三都| 舒城县| 芜湖县| 普兰店市| 三门县| 马鞍山市| 建湖县| 安福县| 阜平县| 长岭县| 秀山| 衡山县| 砀山县| 镇雄县| 龙岩市| 潞西市| 常山县| 施甸县| 乳山市| 敦煌市| 远安县| 夏河县| 包头市| 林州市| 和平县| 类乌齐县| 焉耆| 绵阳市| 石渠县| 旺苍县| 黄平县|