一下午花了將近兩個小時去找問題,就為了一個簡單的資訊顯示頁面
<struts>
<package name="user" extends="struts-default">
<action name="saveUser" class="saveUserAction">
<result name="success" type="redirect">listUser.action</result>
<result name="input">/saveUser.jsp</result>
</action>
<action name="listUser" class="listUserAction">
<result name="success" type="redirect">/list.jsp</result>
</action>
</package>
</struts>
原因竟然是在struts的results中添加了rype而修改了預設的類型
這畫蛇添足的一筆啊········謹記謹記
以下轉載自http://hi.baidu.com/ygq58/blog/item/50c2f237072754390b55a944.html
晚上忽然發現一個問題,Action轉寄的頁面裡面表單bean不可用,用logic:present 查看了幾遍都是 不存在於request中,不管我把映射定義裡面的scope設成session還是request,在這個頁面的request裡面都沒有這個bean。 真納悶了,仔細瞧了好久,才發現原來是轉寄標記裡加了個redirect=true 。改過來,一切正常了。看來就是這個redirect的問題。於是便從網上搜了一下這個玩意,發現它的方法是:
public void sendRedirect(String location)
throws IOException {
if (isCommitted())
throw new IllegalStateException
(sm.getString("coyoteResponse.sendRedirect.ise"));
// Ignore any call from an included servlet
if (included)
return;
// Clear any data content that has been buffered
resetBuffer();
// Generate a temporary redirect to the specified location
try {
String absolute = toAbsolute(location);
// public static final int SC_FOUND = 302;
setStatus(SC_FOUND);
setHeader("Location", absolute);
} catch (IllegalArgumentException e) {
setStatus(SC_NOT_FOUND);
}
引起的結果是:
如果採用redirect=true,那麼request是傳寄不再下一個頁面, 而false是可以.下面是摘抄的一篇對這個理解比較好的文章:
ActionMapping
ActionMapping將對Struts應用中有效商務邏輯進行分類,當一個請求到達時,ActionSevlet在ActionMapping目錄中尋找對應的資訊。ActionMapping是Struts應用的一個核心設計,當需要瞭解一個Struts應用,或編寫一個新的Struts應用的時候,都應該從ActionMapping入手。ActionMapping有較多的屬性資訊,具體參考相關文檔。
ActionForward
ActionForward是Struts的核心類之一,其基類僅有4個屬性:name / path / redirect / classname。在基於Struts的Web應用程式開發過程中,Action操作完畢後程式會通過Struts的設定檔struts- config.xml連結到指定的ActionForward,傳到Struts的核心類ActionServlet,ActionServlet使用 ActionForward提供的路徑,將控制傳遞給下一個步驟。ActionForward控制接下來程式的走向。ActionForward代表一個應用的URI,它包括路徑和參數,例如:
path=“/modify.do?method=edit&id=10”
ActionForward的參數除了在struts-config.xml和頁面中設定外,還可以通過在Action類中添加參數,或重新在Action中建立一個ActionForward。
在ActionForward中有一個重要的屬性redirect,當redirect=false時,將儲存儲存在http請求和請求上下文中的所有內容,僅在同一個應用中可用。當redirect=true時,Web用戶端進行一次新的http請求,請求的資源可以在同一個應用中,也可以不在,原來的請求參數不再儲存,原來的請求上下文也被清除,新的http請求僅包含ActionForward的path屬性裡所包含的參數。如果在同一個應用中,使用者會話的上下文會被維護。
ActionForward分為全域轉寄和局部轉寄,Action的Mapping對象的findForward方法首先會檢查局部轉寄列表,尋找失敗就會到全域轉寄列表中尋找。書寫格式中,我們一般將全域變數定義為String常數,避免誤解,使得轉寄列表結構清晰易讀。
在項目開發過程中經常碰到一種情況,當頁面已經改變了,瀏覽器中的地址如/modify.do或/modify.jsp卻沒有變化,當時沒有考慮這麼細,雖然存在疑問,但沒有影響到程式功能的實現,因此忽略過去了,今天尋找了一些資料才弄清楚。用戶端瀏覽器顯示的是瀏覽器最後被給定的URL,當URL被提交後,在某個組件返回一個響應給瀏覽器之前,Web應用可能已經轉寄請求多次,而這些過程都發生在伺服器端,用戶端瀏覽器並不知道有什麼變化。當一個 http響應被返回時,它並沒有包含地址欄的值,所以瀏覽器僅僅顯示其用來作為初始請求的地址。通過使用redirect可以改變瀏覽器地址的顯示,因為這樣可以向瀏覽器提交一個新的請求,但付出的代價是資料不能通過請求上下文傳遞到頁面,這也是使用forward和redirect的差異之一