使用struts2的validateXXX()進行驗證,出錯後自動返回之前的畫面,但是Form中的數據全部丟失了,如何才能保存出錯前的Form是要解決的問題。
調查:
調查後發現如果把Action的scope設置成session就應該可以在session範圍內保存Form數據,但是struts2不支持直接設定Action的scope屬性,沒關係,有辦法,因爲把bean的注入交給了spring容器,spring自然可以管理它自己的bean,只需要在spring的配置文件中定義Action的bean的時候把scope設置爲session就可以了。
如果在spring中定義bean時指定scope爲session,那麼請小心使用struts2的Action中的validateXXX()方法,因爲校驗出錯的狀態會一直保存直到session結束(當然這是因爲struts2的默認攔截器在作怪)。
解決方案:
STEP 1:
定義bean的作用域爲session (注1)
例: <bean id="LoginAction" class="testLogin.action" scope="session">
<property name....../>
</bean>
STEP 2.
因爲校驗的錯誤狀態ActionError會在session範圍內保存,導致每次的Action請求會直接跳轉到input視圖。以下準備了兩種解決辦法
①重寫默認的負責校驗的攔截器。
②放棄使用validateXXX()這個方法,在Action中進行校驗,使用ActionMessage代替ActionError。
注1:同時不要忘記在web.xml中追加一個監聽。
<listener>
<listener-class>
org.springframework.web.context.request.RequestContexgListener
</listener-class>
</listener>
ok,到此爲止問題已經解決,需要說明的是,解決問題的辦法並不只是這一種,根據具體情況可以採用不同的方法,例如通過hidden項目傳遞Form就是一種不錯的方法。