Posted on 2006-07-24 17:26
大大毛 閱讀(335)
評論(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
??????如果技術上達不到,暫時取取巧還是可以的,隨著技術的深入,解決問題的方法也會越來越中規中矩