piliskys

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            25 隨筆 :: 0 文章 :: 40 評論 :: 0 Trackbacks
          用過struts都清楚,struts的開發一般要寫兩個類,FormBean和Action類,通常情況下Action是這樣的:
          public???class?XXXAction??extends?Action?{
          ????
          public?ActionForward?execute(ActionMapping?mapping,?ActionForm?form,
          ?????????????????????????????????HttpServletRequest?request,?HttpServletResponse?response)?
          throws?Exception?{
          ????????XXXXForm?theform?
          =(XXXXForm)?form;//form的強制轉型
          ????????
          //這里就是你要處理的業務邏輯了?
          ????????return?mapping.findForward("XXXX");
          ????}
          這是一個Action最少的代碼了,它沒有處理任何邏輯,只是一個跳轉,FormBean的話,只要繼承ActionForm,代碼到沒有規定,到時,我們可能會想,每個Action里面都必須寫上面那些代碼,煩啊,還有在每個FormBean里我們一般都會定義一些常用的屬性,如event,根據event的值,我們來決定一些邏輯的處理及頁面的跳轉,每次要寫,也煩啊。
          ?? 好,煩的話,那我們要開始做點事情了,首先,寫一個formBean代碼如下:
          public?class?XXXForm?extends??ActionForm{
          ????
          private?String?event;//事件名
          ????public?String?getEvent()?{
          ????????
          return?event;
          ????}

          ????
          public?void?setEvent(String?event)?{
          ????????
          this.event?=?event;
          ????}

          }
          我想這誰都應該清楚,然后我們再寫frombean時,就不要extends? ActionForm,而是extends? XXXForm了,這樣,我們省了些代碼,我們再來看Action,也這樣試試:
          public?abstract?class?XXXAction??extends?Action?{
          ????
          public?ActionForward?execute(ActionMapping?mapping,?ActionForm?form,
          ?????????????????????????????HttpServletRequest?request,?HttpServletResponse?response)?
          throws?Exception?{
          ????????XXXForm?theform?
          =(XXXForm)?form;
          ????????
          return?mapping.findForward(doAction(theform));
          ????}

          ?????
          /**
          ??????*?處理一些業務
          ??????*?
          @param?form
          ??????*?
          @return????返回mapping指向的字符串
          ??????
          */

          ???
          public?abstract??String?doAction(BaseForm?form);//抽象
          }
          這樣的話,我們再寫Action類時,就不extends Action而是extends XXXAction,代碼就像:
          public?class?***Action?extends?XXXAction?{
          ????
          public?String?doAction(XXXForm?form)?{
          ????????
          ***Form?theform?=?(***Form)?form;//強制轉成你真正的formbean
          ?????
          //這里就是你要處理的業務邏輯了???
          ?????return?"success";
          ????}

          }

          就是以上一些代碼,簡單多了吧,return一個字符串就行了,感覺還有點像webwork了,到此完了嗎,有沒

          有什么還沒有做呢,對了,這樣的話,我們定義的Action都成無會話的bean了,所以request是要得到的

          ,很多情況下的url是***action.do?id=cctv,而且一般是系統都是把用戶的信息放入session中的,所以

          request是強烈要求要還給我們的,好,那我們來重構下formbean和action吧,以下我們用BaseForm,及

          BaseAction來定義,兩個類都放在同一個包中

          public?class?BaseForm?extends??ActionForm{
          ????
          private?String?event;
          ????
          private?HttpServletRequest?request;
          ????
          /**
          ??????*?注:這個是得到用戶信息,這個只是一個例子,也可不實現,由request得到session,再得到

          user,
          ??????*?但reguser字符串對一般開發人員可能是不可見的
          ??????
          */

          ????
          public?User?getUser()?{
          ????????
          return???(User)?getRequest().getSession().getAttribute("reguser");
          ????}

          ????
          public?HttpServletRequest?getRequest()?{
          ????????
          return?request;
          ????}

          ????
          /**
          ??????*?注:這里用的protected,這樣可以就同一包的類可調用,其它類是不可見的
          ??????
          */

          ????
          protected?void?setRequest(HttpServletRequest?request)?{
          ????????
          this.request?=?request;
          ????}

          ????
          public?String?getEvent()?{
          ????????
          return?event;
          ????}

          ????
          public?void?setEvent(String?event)?{
          ????????
          this.event?=?event;
          ????}

          }
          BaseAction代碼:
          public?abstract?class?BaseAction??extends?Action?{
          ????
          public?ActionForward?execute(ActionMapping?mapping,?ActionForm?form,
          ?????????????????????????????????HttpServletRequest?request,?HttpServletResponse?response)?

          throws?Exception?{
          ????????BaseForm?theform?
          =(BaseForm)?form;
          ????????theform.setRequest(request);
          //加了這句
          ????????return?mapping.findForward(doAction(theform));
          ????}

          ?????
          /**
          ??????*?處理一些業務
          ??????*?
          @param?form
          ??????*?
          @return????返回mapping指向的字符串
          ??????
          */

          ???
          public?abstract??String?doAction(BaseForm?form);
          }

          到此算為結束,可能有為會問,那還有response呢,response的話,一般出現在內部跳轉等情況,感覺用

          的比較少,所以在此就不把它給大家了,如覺得一定要得到的話,那就跟request一樣進行設置吧,不過

          萬事都應該有個度,自己衡量。

          posted on 2006-04-18 09:10 霹靂火 閱讀(2687) 評論(1)  編輯  收藏

          評論

          # re: struts的輕量架構(新手有用) 2006-05-05 12:18 綠色使者、綠色心情
          如果要用一個action執行多個方法,其實完全可以用DispatchAction或者LookupDispathAction,你這樣的封裝,我覺得實際好像作用不大,不過倒是可以跟著這個思路下去,實現一些復雜的通用控制  回復  更多評論
            


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


          網站導航:
           
          主站蜘蛛池模板: 潞西市| 商都县| 祁阳县| 舒城县| 丹巴县| 织金县| 资源县| 泌阳县| 方城县| 陈巴尔虎旗| 枝江市| 瑞昌市| 尚志市| 额敏县| 兰考县| 东光县| 禄丰县| 龙游县| 健康| 安远县| 凉山| 仪征市| 凤山县| 奎屯市| 宁海县| 金门县| 凤凰县| 岑巩县| 息烽县| 铜川市| 牟定县| 高台县| 深水埗区| 阿拉尔市| 抚宁县| 乐业县| 义马市| 靖宇县| 宜兰县| 佛山市| 娄烦县|