struts2註解@Result的幾個跳轉方式說明

最近做一個項目,Struts2+Spring+Hibernate這三個開源框架下的,基本上拋棄了傳統的XML配置方式,採用了註解(annotation),的確註解減輕了程序員很多工作量,注入也變得簡單多了,只是有些細節還在慢慢適應中:


先來說個“chain”方式跳轉的問題


action的訪問,我們採用了動態方法調用的方式來訪問,也就是使用歎號“!”,有些需求是需要跳轉到另一個action的,這種跳轉有兩種方式,一個是redirect,另外一個是chain。

redirect這種方式下,會有比較大的問題:

redirect把一個http返回碼(SUCCESS)以及返回的頁面位置一起重新發給web服務器,容納後由web服務器產生一個新的HTTP請求,就會產生一個新的線程,保存在原來Action執行的線程中的數據就無法訪問。
所以,result需要包含Action的數據,那麼redirect不是一個可行的辦法。因爲新的HTTP請求時在Servlet容器的新的線程中處理的,ActionContext中的所有狀態都不會存在。

chain 用於把相關的幾個action連接起來,共同完成一個功能。

所以很多情況下,我們需要用chain這種方式。

redirect註解方式比較簡單:

@Result(name="grapass",location = "courseinfo!graColCheckCourse.action",type = "redirect"),

這樣就能實現action的跳轉。

習慣的,我就用了下面這種註解方式來跳轉chain這種方式:

@Result(name="grapass",location = "courseinfo!graColCheckCourse.action",type = "chain"),

後來發現這樣是不行的,Struts不能識別courseinfo!graColCheckCourse.action,提示找不到該action。

無奈,百度,未找到解決方案,後來讀官方文檔,發現result還有一個參數是params(裏面的參數必須是成對的,一個是參數名,一個是參數值),這個可以向Struts傳遞參數,chain這種方式下,我們需要傳遞三個參數“actionName”、“namespace”、“method”,突發奇想,直接發送這三個參數會是什麼結果?於是我這樣寫:

@Result(name = "insertProfessionalCourse",  params={"actionName","cultivateTeachtask","namespace","/cultivate","method","beforeInsertProfessionalCourse"}, type = "chain")

沒想到竟然OK了,不知道這種是不是唯一的解決方式,但真的可以解決問題,呵呵。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章