大大毛 的筆記

            DDM's Note

          哪怕沒有辦法一定有說法,
          就算沒有鴿子一定有烏鴉,
          固執無罪 夢想有價,
          讓他們驚訝.

          posts - 14, comments - 23, trackbacks - 0, articles - 58
             :: 首頁 ::  :: 聯系 ::  :: 管理

          Struts中action之間控制權轉移的問題

          Posted on 2006-07-24 17:26 大大毛 閱讀(338) 評論(0)  編輯  收藏 所屬分類: Struts

          ????起因:
          ??????在學習那個addressbook例程中遇到這個問題的,當時我改變了例程的流程, 不讓menu.jsp直接使用<a link>來跳,而是配合JS提交action到menuAction,而對于那個display和displayAll兩個模塊,我當時也想改改,因為按書上的例程,是要把"生成SQL并壓入到session中"分放到兩處進行處理的,這樣的感覺很不爽,如果需要發生什么變化的話,需要到多個地方去對應著更改,因此我的作法是在menuAction 中壓入一個displayAll = 0 or 1,再forward,這樣在 searchAction 中 sql = "select * from address"; if(displayAll == 1) { ...;sql += where;}.
          ??????當時遇到了麻煩,我將displayall配成 "search.do" ;運行結果有些讓人意外,searchAction并沒有得到控制權,而是跳到了它的input頁面 search.jsp.現在問題已經解決,下面就詳細說明一下原因及解決方法:

          ???問題的分析:
          ??????之所以從menuAction --> searchAction時會跳到search.jsp頁面,是因為在轉移到 searchAction 時產生了 檢驗錯誤, Struts根據Action的配置參數,轉向到Action.input所指定的JSP文件,從而出現上面的一幕.

          ???解決方法:
          ??????方法1:
          ?????????步驟一:???查看Action的屬性,可以看到有一個 "validate"屬性,是個boolean屬性,缺省為true,它表明Action是否需要調用ActionForm.validate();將其設為false;或者去掉ActionForm中的校驗.
          ?????????步驟二:???既然去掉了視圖層的校驗,那就有必要在控制器中實現這個輸入值校驗的功能了.
          ??????方法2(取巧的辦法):
          ?????????利用一個比較特殊的東東,記得我在? 筆記02 中提到過的那個<html:cancel />標簽,現在就轉轉彎,用它了,來個

          request.setAttribute(Globals.CANCEL_KEY, "" );

          ?????????只要給它一個對象,Struts控制器就會認為是按下了Cancel,這樣的話也可以繞過ActionForm中的validate(),而且從正常的Input JSP頁面提交的話,ActionForm.validate()方法還是可以產生作用的.

          ???后記:
          ??????Myeclipse里面配置Action時能夠設置的屬性并不多,也不包含這個validate屬性,需要自己手工處理struts-config.xml
          ??????如果技術上達不到,暫時取取巧還是可以的,隨著技術的深入,解決問題的方法也會越來越中規中矩

          i am ddm

          主站蜘蛛池模板: 莱芜市| 乌拉特后旗| 江口县| 沅江市| 长沙市| 台中市| 綦江县| 浪卡子县| 永吉县| 乐至县| 杨浦区| 壤塘县| 大冶市| 安陆市| 鱼台县| 田阳县| 余干县| 贵港市| 平昌县| 双鸭山市| 奇台县| 东兰县| 香河县| 拉萨市| 南城县| 秦皇岛市| 开平市| 名山县| 东丽区| 登封市| 时尚| 莱西市| 蒙自县| 观塘区| 扶余县| 正阳县| 义马市| 仪陇县| 镇坪县| 彰化县| 黔东|