1. 程式人生 > >struts2配置type="redirect"傳引數資料會丟失解決辦法!

struts2配置type="redirect"傳引數資料會丟失解決辦法!

   上一使用struts是【樣式有問題】之後 又發現 解決了樣式 只要你後面要新增資料那麼就會資料失效! 2.在加了type="redirect"後,相當於重新發送一個請求到某一個jsp頁面上,請求不包含任何引數,而預設方式是forward,即不產生一個新的請求,包含原來的引數,後遺症是跳轉到jsp頁面後會保持原來的URL 。這在找辦法如何將URL變為***.jsp而不是***.action,而且又能傳遞引數到JSP中。嘗試著用request或者requestScope 方法一:傳遞方法:
  1. <prename="code"class="java">
  2. <result
    name="success"type="redirect">/main/main.jsp</result>
  3. //這樣redirect是定向指向一個url頁面,傳引數的話用request會使得資料丟失。
  4. //錯誤傳參:  ServletActionContext.getRequest().setAttribute("TreeList", list);  
  5. 獲取資料:#request.TreeList
  6. //正確傳參:  ServletActionContext.getRequest().getSession().setAttribute("TreeList", list);  
  7. 獲取資料:# .TreeList  
  8. request不行,就用session。雖然還不是很理解,但是問題解決了,記錄一下!
      第二型別方法: struts.xml
<result name="passForeignlands" type="redirectAction">LoansForeignlandsSituation.action</result>

type可以用“chain”,如果還不行,那麼你應該這麼寫

1 2 3 4 <result name="passForeignlands" type="chain"> <param name="actionName"
>LoansForeignlandsSituation</param> <param name="loans">${loans}</param> </result>

首先你應該在passForeignlands中有一個getLoans的方法,在LoansForeignlandsSituation中有一個setLoans的

Action之間傳遞引數有如下方法:

(方法一):

Xml程式碼

  1. <result name="topic" type="redirect">findTopics.action?topicId=${topicId}</result>

(方法二):

Xml程式碼

  1. <result name="topic" type="redirect-action">
  2. <param name="actionName">findTopics</param>
  3. <param name="topicId">${topicId}</param>
  4. </result>
如果是多個引數的話,繼續再加幾個<param>就行了,對於(方法一)如果是多個引數的怎麼辦?

Xml程式碼

  1. <result name="topic" type="redirect">findTopics.action?topicId=${topicId}&amp ;elementId=${elementId}</result>

使用redirect重置連結需要字尾名,使用了redirect-action就不能使用了,就例如使用chain一樣,只需要寫action的配置名,如果加入字尾名.action,就會報出異常,action未配置正確。在這個配置檔案裡,多個引數的連線符使用了"&amp ;"(分號要挨著amp,此處由於轉義無法正常書寫故新增空格),這是由於XML的語法規範,應該使用"&amp ;"代替"&",原理和HTML中的轉義相同。

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

Java程式碼

  1. <action name="step1" class="test.Step1Action">
  2. <result name="success" type="chain">step2.action</result>
  3. </action>
  4. <action name="step2" class="test.Step2Action">
  5. <result name="success">finish.jsp</result>
  6. </action>

處於chain中的action屬於同一個http請求,共享一個ActionContext


方法三

在struts2中通常用addActionMessage()來儲存操作提示並通過<s:actionmessage />標籤在頁面顯示. 但是如果我們通過redirect來重定向的話, 會丟失儲存在request裡的資訊, 這樣就會導致actionmessage裡的資訊無法在頁面顯示.

那麼如何儲存這個actionmessage呢?查看了一下struts2的struts.xml,發現有一個名為store的攔截器,類名為 org.apache.struts2.interceptor.MessageStoreInterceptor,這個攔截器的作用就是將我們放在 ActionMessaage中的資訊儲存到session中,而不丟失,那麼接下來的問題就好解決了。

在struts.xml中配置此攔截器即可.

<interceptor-ref name="store">
<param name="operationMode">AUTOMATIC</param>
</interceptor-ref>