天天看點

Struts2注解(annotation)方式下chain的設定方式

最近做一個項目,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了,不知道這種是不是唯一的解決方式,但真的可以解決問題,呵呵。

繼續閱讀