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

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

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

    where the amazing happens

    Waterfall framework 開發日志

    TODO:
    繼續測試和改進,不滿意的地方:@ToSession標簽

    更新日志:

    2006-06-18?增加和改進 @ToList 標簽,用來修飾一個參數為java.util.List<T>的setter方法?
    2006-05-23 增加 VelocityView接口,方便velocity視圖調用.
    2006-05-23 增加 WebParam接口,封裝掉request和response以及ServletContext

    2006-05-22 增加 5.1 初始化 velocity
    2006-05-21 增加 4.1 - 4.2 HttpSession操作


    更新note:
    1.HttpServletRequest的getParameterNames()?方法返回的Enumeration相對于頁面參數的物理順序剛好是相反的,所以實現@ToList標簽時候需要先用一個Stack來對所有參數進行反轉.不知tomcat在這個api方法上是怎么實現的,為什么就倒過來。c語言函數可以根據不同的call類型來指定不同的壓棧的順序,莫非這個慣例也被用到servlet里面來了,挺有意思的東西,看來需要留意一下。

    問題和解決方式:

    1.關于@ToSession標簽.如果是登陸的話,那么就有個判斷條件決定某個login token是否應該被加到session中,這時候可以在@ToSession標記的getter方法中加入邏輯判斷,來決定返回一個token實體或者null(這樣做有點古怪..).

    2.路徑的問題.比如一個http://host/logic/bbs/admin/ListUsers.wff 摸版的相關資源目錄(比如,圖片,css,js等)就必須存在webproject/bbs/admin響應的目錄下,有點像struts的多模塊.

    開始:

    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.wff" method="post">

    Web動作實現Bean:
    ?? org.qqsns.web.logic.group.NewTopic??
    注意后面的logic/group/NewTopic和logic.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(WebParam param,?VelocityView view)
    ?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(WebParam param, VelocityView view)
    ?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的轉換器是個更好的主意。
    這樣就初步解決了數據的輸入綁定和驗證。余下的就是業務邏輯的問題。

    4.如何操作Session中的信息
    ?
    ?獲取session中的信息:

    ? @FromSession(
    ???? sessionKey=User.key
    ???? )
    ?public void setCurrentUser(String currentUser) {
    ??this.currentUser = currentUser;
    ?}

    ?信息保存到session中:?

    ? @ToSession(
    ????? sessionKey = User.key??
    ??? )
    ?public String getName() {
    ??if(login())return name;
    ??else return null;
    ?}

    ?這2個方法定義在WebAction的實現類中。
    ?框架在execute()之前執行@FromSession動作,在execute()之后執行@ToSession動作。
    ?這里使用了annotation,所以要求必須是jdk5.0以上版本.
    ?
    ?5.1 Velocity
    ? waterfall啟動時候自動在WEB-INF目錄下尋找并初始化Velocity.properties文件
    ?操作:
    ?public String execute(WebParam param,?VelocityView view)
    ?throws ServletException, IOException{
    ??view.addElement("msg","Hello");
    ? view.go("index.vm");
    ??return null;
    }

    posted on 2006-05-24 16:58 where the amazing happens 閱讀(900) 評論(1)  編輯  收藏 所屬分類: 自制土器

    評論

    # re: Waterfall framework 開發日志 2006-07-14 16:20 pesome

    呵呵,老兄的文章很有質量阿,我推薦了幾篇  回復  更多評論   

    公告

    點擊這里給我發消息

    導航

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

    統計

    常用鏈接

    留言簿(3)

    隨筆分類(18)

    隨筆檔案(17)

    文章分類

    相冊

    其他我的blog

    技術Blog

    最新隨筆

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲砖码砖专无区2023| 亚洲国产精品一区二区久久| 亚洲精品成a人在线观看夫| 99精品国产免费久久久久久下载| 亚洲综合亚洲国产尤物| 91精品成人免费国产片| 亚洲黑人嫩小videos| 亚洲一区二区三区免费观看| 亚洲成av人片不卡无码| 中文字幕无码成人免费视频| 亚洲色大成网站www| 亚洲 另类 无码 在线| 一级做a免费视频观看网站| 亚洲婷婷五月综合狠狠爱| 久99久精品免费视频热77| 亚洲精品视频免费看| 免费国产黄线在线观看| 美女视频黄a视频全免费网站一区| 免费人成网站在线播放| 97在线免费视频| 亚洲美女免费视频| 成人五级毛片免费播放| 黄页免费视频播放在线播放| 国产gv天堂亚洲国产gv刚刚碰| 午夜不卡久久精品无码免费 | 午夜视频在线观看免费完整版| 亚洲AV日韩AV无码污污网站| 亚洲国产婷婷综合在线精品| 西西人体免费视频| 亚洲AV无码一区二区三区人| 国产成人无码区免费A∨视频网站 国产成人涩涩涩视频在线观看免费 | 亚洲中文字幕在线乱码| 一级毛片全部免费播放| 亚洲色无码专区一区| 亚洲综合色视频在线观看| 97在线视频免费公开观看| 国产精品国产亚洲区艳妇糸列短篇| 久久亚洲2019中文字幕| 国产成人精品免费视频网页大全 | 亚洲JIZZJIZZ妇女| 精品久久久久久亚洲|