iNeo

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            30 Posts :: 8 Stories :: 2 Comments :: 0 Trackbacks
           在這篇ASP.NET 中Session 實現原理淺析[2] 狀態管理器Blog中,Flier老大向大家推薦了Java中幾種Cache的實現,于是我就按圖索驥,首先是找到OSCache的老家:OpenSymphony。哇,這里的資源真多啊,簡直就是一個寶藏。為什么原來就沒有發現呢?感謝Flier老大了!
                  在OpenSymphony的主頁上,我看到了兩個讓我覺得很親切的項目:WebWork和Quarts。WebWork作為一個實現了IOC的輕量級Web Application Framework一直備受開發者的青睞;而Quarts更是在異步信息處理上大展拳腳了。看到了老朋友,我就只好暫時將新歡OSCache擺一邊,找出我很久沒有聯系的老貓(Tomcat)去跟WebWork聊嗑了。
                  做好了一切的準備工作之后[1],我嘗試著做一個登陸注冊的功能,以體驗一下WebWork。跟其他的Web應用一樣,我們首先要建立一個標準的WEB-INF目錄(所謂標準就是目錄下面包含lib和classes子目錄以及Web.xml文件),接著在WEB-INF/lib下面放上WebWork所需要的.jar文件并在WEB-INF目錄下建立Web.xml文件[2]。在完成了這些千篇一律的工作之后,我仔細的看了一下Web.xml中內容,它里面只定義了一個servlet:webwork,其對應的class為com.opensymphony.webwork.dispatcher.ServletDispatcher,然后由webwork這個servlet去處理所有.action的請求。看到這里,我暗自竊喜,這跟我熟悉的WAF框架是十分類似的,只不過MainServlet變成了ServletDispatcher,.do的請求變成了.action而已。
                  接下來,就是到classes目錄下建立xwork.xml文件,這個文件跟WAF中的mappings.xml很相似,因為對.action的處理都是在這里被定義的,而WAF中關于.do的處理則定義在mapping.xml中。但是也有一些我并不清楚的東西,如package和Interceptor。在classes目錄下還要建立一個validator.xml文件,但是這個并不是必需的。做好了這些準備工作之后,就真正開始WebWork的體驗之旅了。
                  1、建立一個index.jsp(以下為主要部分):
           <form action="Login.action" method="post">
            
          <table cellspacing=0 width="100%">
              
          <tr>
                
          <td>Login ID:
                  
          <input type="text" name="loginId" width=100 />&nbsp;&nbsp;

                    Password:
                  
          <input type="password" name="loginPassword" width=100 />&nbsp;&nbsp;
                  
          <input type="submit" value="Login" />
                
          </td>
                
          <td align=right>
                   
          Hello, <ww:property value="loginId" />

                
          </td>
              
          </tr>
            
          </table>
          </form>

                  需要注意的地方就是form的action屬性的寫法了;
                  2、在xwork.xml中增加相應的處理action的節點

           <action name="Login" class="fantasysoft.webwork.Login">
             
          <result name="error" type="dispatcher">index.jsp</result>
             
          <result name="success" type="dispatcher">index.jsp</result>
          </action>

                  這里需要注意的是action節點中name的值要與index.jsp中定義的action的名字要嚴格匹配,對于大小寫是敏感的。在action節點中還包含了節點,以說明處理action之后會可能出現的不同結果(name)和相應的處理方式(type)。譬如說,如果Login的這個action處理success了,則使用dispatcher將結果分(dispatch)到相應的頁面。而在WAF框架中并沒有這樣的定義,因為在默認情況下如果不成功則會返回當前頁面,不過可以定義FlowHandler,并擁有類似的功能且更加靈活;
                  3、實現類Login的代碼:

          package fantasysoft.webwork;

          import com.opensymphony.xwork.ActionSupport;

          public class Login extends ActionSupport
          {
              
          private
           String loginId;
              
          private
           String loginPassword;

              
          public String getLoginPassword() 
          {
                  
          return
           loginPassword;
              }

              
          public void setLoginPassword(String loginPassword) {
                  
          this.loginPassword =
           loginPassword;
              }

              
          public String getLoginId() {
                  
          return
           loginId;
              }

              
          public void setLoginId(String loginId) {
                  
          this.loginId =
           loginId;
              }

              
          public String execute() throws Exception{             
                  
          if (!checkUserId()return
           ERROR;  // checkUserId is the method that will be implemented
                      
          else return
           SUCCESS;
              }

          }

                  在代碼中,你會發現有兩個繼承變量ERROR與SUCCESS。這兩個變量是定義在Action這個接口的,而ActionSupport則實現了Action接口。在接口Action的代碼中,我們可以看到ERROR = "error"、SUCCESS = "success"。我們可以發現這兩個變量的值與xwork.xml中result子節點中的name的值是相匹配。除此之外,在代碼中,我也找不到了原來在開發中經常要用到的一個API:getParameter。事實上,將表單中數據析取出來的工作是由webwork這個唯一定義的servlet去完成的,而這個類會調用Login類中set的方法將用戶輸入的數據賦給Login類的屬性:loginId和loginPassword。在這里,我們也要跟前面index.jsp中的包含的標簽聯系起來。當數據被dispatch回index.jsp的時候,在index.jsp頁面render的過程中是調用了get的方法去獲取相應的數據的。
                  最后,我們可以總結一下,整個Web應用程序的處理流程了:
                  首先,當用戶提交了表單(form)至Login.action后,由web.xml中定義的唯一的一個servlet:webwork去處理這個請求。webwork會以action的name:Login到xwork.xml中尋找相應的處理action的類,于是就找到了fantasysoft.webwork包中的Login類,由Login類中的execute方法來處理提交的form的數據了;
                  然后,根據execute方法的返回值,再到xwork.xml中對應的action節點中去找匹配的result子節點;
                  最后,根據result子節點的定義,將處理結果分發(dispatch)或者重定向(redirect)至下一個頁面[3]

                  
                  [1] 準備工作可以參考
          WebWork Getting Started
                  [2] web.xml文件的具體內容,可以參考
          WebWork Tutorial Lesson 2  
                  [3] 對于result的Type的更多介紹,可以參考
          WebWork Tutorial Lesson 3     

          posted on 2005-11-29 08:07 只牽這只狗 閱讀(122) 評論(0)  編輯  收藏

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


          網站導航:
           
          主站蜘蛛池模板: 德化县| 宽甸| 剑河县| 册亨县| 连南| 塔城市| 稻城县| 轮台县| 恩施市| 金塔县| 海南省| 梁河县| 甘德县| 科技| 塘沽区| 沁源县| 定日县| 巴塘县| 郸城县| 郓城县| 营口市| 滦平县| 泸水县| 方城县| 祁门县| 镇安县| 宜州市| 静安区| 精河县| 武胜县| 车致| 横峰县| 宁明县| 德昌县| 宁河县| 高阳县| 司法| 巴彦县| 密山市| 安仁县| 佛冈县|