struts中的redirect

來源:互聯網
上載者:User

一下午花了將近兩個小時去找問題,就為了一個簡單的資訊顯示頁面

<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的差異之一

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.