2012-08-23 78 views
0

我想在我的Struts2(2.2.3.1)應用程序中使用Scope攔截器實現類似嚮導的功能。範圍攔截器Struts 2:後退按鈕行爲

我struts.xml的文件如下:

<action name="actionA class="classA" method="methodA"> 
    <interceptor-ref name="basicStack" /> 
    <interceptor-ref name="scope"> 
     <param name="session">stringA</param> 
     <param name="key">consultGuides</param> 
     <param name="type">start</param> 
    </interceptor-ref>  
    <result>/resultA.jsp</result> 
</action> 
<action name="actionB" class="classA" method="methodB"> 
    <interceptor-ref name="scope"> 
     <param name="session">stringA, listA</param> 
     <param name="key">consultGuides</param> 
     </interceptor-ref> 
     <interceptor-ref name="basicStack" />    
     <result>/resultB.jsp</result> 
</action> 
    .... 
    .... 

「resultA.jsp」 提交給 「actionB」 填充 「listA的」。但是現在,如果我按下後退按鈕(到達resultA.jsp,其中resultA.jsp剛剛從其緩存中加載到瀏覽器而沒有向服務器發出新請求)並對該列表進行任何更改,則新條目將追加到「listA」而不是完全取代它。

在「resultA.jsp」修飾「listA的」代碼是

<s:iterator value="listB" status="statusB"> 
    <li> 
     <a title="%{varA}"> 
      <s:checkbox name="listA.id" fieldValue="%{varB}" /> 
     </a> 
    </li> 
</s:iterator> 

我不落實SessionAware,只是依靠scopeInterceptor來養活listA的到會話。

如何使用請求中的新列表替換「listA」?

回答

0

我不完全瞭解您的問題。

  1. 你可以不記分,你做什麼,你在哪裏修改'listA',你在哪裏保存它,你去哪裏?

  2. 你使用的是什麼版本的struts?

  3. 如何保存「listA」?你是否在struts動作中實現了intefrace SessionAware,並將它保存在會話中?

  4. 如果您點擊返回運行'actionA'或只是重定向到.jsp?

0

爲了不讓單擊後退或瀏覽器的前進按鈕,你可以嘗試在HTTP響應,這將您單擊後退或前進按鈕每次清除緩存增加了一些頭之後緩存的網頁。

如果你在攔截器中添加這個,這是非常有效的。

response.setHeader("Cache-Control", "no-cache, no-store"); //HTTP 1.1 
response.setHeader("Pragma", "no-cache"); //HTTP 1.0 
response.setDateHeader("Expires", 0); //prevents caching at the proxy server 

通過這樣做,按下按鈕不會加載緩存頁面,但會向服務器發出新請求。 這應該可以解決您的問題。

+0

我試圖從服務器上按下後退按鈕來獲取頁面。但即使手動刷新頁面也不起作用,因爲會話仍在繼續,而新值僅附加到會話中已有的變量。 – Manu