程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> JSP編程 >> 關於JSP >> Struts中的URL傳遞的問題(forward標簽的redirect屬性)

Struts中的URL傳遞的問題(forward標簽的redirect屬性)

編輯:關於JSP

 

在一個struts項目中,碰到這麼一個問題:

用戶的登錄頁面地址是:

http://localhost:8080/sduprs/user/user_login.jsp

登錄後顯示的地址為:

http://localhost:8080/sduprs/userLogin.do

更悲劇的是我們在後台使用了frame框架。這樣登錄後所有的操作地址都顯示為上面的那個地址。大師兄不滿意,要求修改為實際地址。在網上查了半天資料,發現是url轉發問題,具體點就是ActionForward的問題。下面是關於ActionForward的資料:

(1)ActionForward是Struts的核心類之一,其基類僅有4個屬性:name / path / redirect / classname。在基於Struts的Web應用程序開發過程中,Action操作完畢後程序會通過Struts的配置文件struts- config.xml鏈接到指定的ActionForward,傳到Struts的核心類ActionServlet,ActionServlet使用 ActionForward提供的路徑,將控制傳遞給下一個步驟。ActionForward控制接下來程序的走向。ActionForward代表一個 應用的URI,它包括路徑和參數。
(2)ActionForward的參數除了在struts-config.xml和頁面中設置外,還可以通過在Action類中添加參數,或重新在 Action中創建一個ActionForward。
(3)在ActionForward中有一個重要的屬性redirect,當redirect=false時,將保存存儲在http請求和請求上下文中 的所有內容,僅在同一個應用中可用。當redirect=true時,Web客戶端進行一次新的http請求,請求的資源可以在同一個應用中,也可以不 在,原來的請求參數不再保存,原來的請求上下文也被清除,新的http請求僅包含ActionForward的path屬性裡所包含的參數。如果在同一個 應用中,用戶會話的上下文會被維護。
(4)ActionForward分為全局轉發和局部轉發,Action的Mapping對象的findForward方法首先會檢查局部轉發列表,查 找失敗就會到全局轉發列表中查找。書寫格式中,我們一般將全局變量定義為String常數,避免誤解,使得轉發列表結構清晰易讀。

實際上,struts有兩種定向方式:轉發和重定向(redirect)。當我們用了重定向的時候,是把頁面完全轉向到請求的視圖去了。同時,浏覽器上邊的url也更新了。這樣的優點是請求完全轉移,缺點是無法用request.setAttribute傳遞參數值;當我們使用轉發的時候,是將本次請求的request傳遞給了要定向的jsp或者servlet。同時執行被請求的jsp或 servlet,結果顯示出來。但是,浏覽器上看到的依然是發出請求的url,而不是結果的url,這種方式的優點:可以向被請求的jsp或 servlet傳遞值request.setAttribute,缺點是url依然是請求的url,不是結果的url,刷新的話,將再次執行該請求。

根據上面的介紹我發現使用redirect必須謹慎。仔細排查了下處理登錄頁面的action,發現只是向session寫入了user變量,並沒有使用request.setAttribute傳參。因此就把struts-config.xml裡ActionForward的redirect屬性設置為了true:

這樣我遇到的問題就解決了

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved