tory320

            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            10 隨筆 :: 0 文章 :: 1 評(píng)論 :: 0 Trackbacks
          ? 在這篇 ASP.NET 中Session 實(shí)現(xiàn)原理淺析[2] 狀態(tài)管理器 Blog中, Flier 老大向大家推薦了Java中幾種Cache的實(shí)現(xiàn),于是我就按圖索驥,首先是找到OSCache的老家: OpenSymphony 。哇,這里的資源真多啊,簡(jiǎn)直就是一個(gè)寶藏。為什么原來(lái)就沒(méi)有發(fā)現(xiàn)呢?感謝Flier老大了!
          ??????? 在OpenSymphony的主頁(yè)上,我看到了兩個(gè)讓我覺(jué)得很親切的項(xiàng)目:WebWork和Quarts。WebWork作為一個(gè)實(shí)現(xiàn)了IOC的輕量級(jí)Web Application Framework一直備受開(kāi)發(fā)者的青睞;而Quarts更是在異步信息處理上大展拳腳了。看到了老朋友,我就只好暫時(shí)將新歡OSCache擺一邊,找出我很久沒(méi)有聯(lián)系的老貓(Tomcat)去跟WebWork聊嗑了。
          ??????? 做好了一切的準(zhǔn)備工作之后[1],我嘗試著做一個(gè)登陸注冊(cè)的功能,以體驗(yàn)一下WebWork。跟其他的Web應(yīng)用一樣,我們首先要建立一個(gè)標(biāo)準(zhǔn)的WEB-INF目錄(所謂標(biāo)準(zhǔn)就是目錄下面包含lib和classes子目錄以及Web.xml文件),接著在WEB-INF/lib下面放上WebWork所需要的.jar文件并在WEB-INF目錄下建立Web.xml文件[2]。在完成了這些千篇一律的工作之后,我仔細(xì)的看了一下Web.xml中內(nèi)容,它里面只定義了一個(gè)servlet:webwork,其對(duì)應(yīng)的class為com.opensymphony.webwork.dispatcher.ServletDispatcher,然后由webwork這個(gè)servlet去處理所有.action的請(qǐng)求。看到這里,我暗自竊喜,這跟我熟悉的WAF框架是十分類似的,只不過(guò)MainServlet變成了ServletDispatcher,.do的請(qǐng)求變成了.action而已。
          ??????? 接下來(lái),就是到classes目錄下建立xwork.xml文件,這個(gè)文件跟WAF中的mappings.xml很相似,因?yàn)閷?duì).action的處理都是在這里被定義的,而WAF中關(guān)于.do的處理則定義在mapping.xml中。但是也有一些我并不清楚的東西,如package和Interceptor。在classes目錄下還要建立一個(gè)validator.xml文件,但是這個(gè)并不是必需的。做好了這些準(zhǔn)備工作之后,就真正開(kāi)始WebWork的體驗(yàn)之旅了。
          ?????? ?1、建立一個(gè)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 > < SPAN>

          ????????需要注意的地方就是form的action屬性的寫(xiě)法了;
          ??????? 2、在xwork.xml中增加相應(yīng)的處理action的節(jié)點(diǎn)

          ?<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節(jié)點(diǎn)中name的值要與index.jsp中定義的action的名字要嚴(yán)格匹配,對(duì)于大小 寫(xiě)是敏感的。在action節(jié)點(diǎn)中還包含了節(jié)點(diǎn),以說(shuō)明處理action之后會(huì)可能出現(xiàn)的不同結(jié)果(name)和相應(yīng)的處理方式(type)。譬如說(shuō),如果Login的這個(gè)action處理success了,則使用dispatcher將結(jié)果分(dispatch)到相應(yīng)的頁(yè)面。而在WAF框架中并沒(méi)有這樣的定義,因?yàn)樵谀J(rèn)情況下如果不成功則會(huì)返回當(dāng)前頁(yè)面,不過(guò)可以定義FlowHandler,并擁有類似的功能且更加靈活;
          ??????? 3、實(shí)現(xiàn)類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;
          ????}

          }

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

          ????????
          ????????[1] 準(zhǔn)備工作可以參考
          WebWork?Getting Started
          ??????? [2]?web.xml文件的具體內(nèi)容,可以參考
          WebWork Tutorial Lesson 2 ?
          ??????? [3] 對(duì)于result的Type的更多介紹,可以參考
          WebWork Tutorial Lesson 3 ?????

          /SPAN>
          posted on 2006-12-24 22:42 tory 閱讀(165) 評(píng)論(0)  編輯  收藏

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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 洪江市| 绥棱县| 开鲁县| 旬阳县| 清涧县| 雷山县| 冕宁县| 鲁山县| 丹江口市| 邹城市| 偏关县| 内黄县| 罗平县| 健康| 泰顺县| 洪湖市| 龙南县| 治县。| 县级市| 山东省| 灌云县| 无锡市| 调兵山市| 铜鼓县| 安新县| 保亭| 普兰县| 当雄县| 田阳县| 建始县| 武乡县| 海伦市| 镇巴县| 天长市| 西畴县| 桦甸市| 大埔县| 铁岭市| 百色市| 洛川县| 东乡|