通過前面幾篇的介紹,我們對ActionForward已經不再陌生,這篇我們再進一步瞭解一下它。
1、轉發or重定向
ActionForward封裝轉向路徑,用來完成頁面的轉向。那它既然是轉向,到底是轉發還是重定向呢?
可以通過配置文件來設置,加入redirect屬性,true重定向,false轉發。
默認的情況下,actionForward採用的是轉發的方式進行頁面跳轉的。
<forward name="success" path="/loginsuccess.jsp" redirect="true"/>
轉發和重定向的區別:轉發的時候,頁面的url地址不變,而重定向的時候頁面的url地址會發生變化。簡單說明一下原因,因爲轉發的時候是採用的一個request(請求),既然頁面跳轉前後是同一個request,頁面url當然不會變了;而重定向採用的是2個request,頁面跳轉前後的url當然會不同了。
2、局部 or 全局
先舉一個例子,在判斷是否已經登錄的時候,登錄繼續訪問,沒有登錄跳轉到登錄界面,這個時候我們每個action都要配置<forward name="error" path="/mustLogin.jsp" />,來struts接下來跳轉到哪裏。如果有100個action,那豈不是這句話要寫100次。這裏肯定要更簡潔的方式。
我們在action標籤下配置的forward稱爲局部forward,我們也可以配置全局forward
<global-forwards> <forward name="error" path="/mustLogin.jsp" /></global-forwards>
那麼如果局部ActionForward和全局ActionForward同時出現,到底是按照哪個配置進行頁面跳轉呢?採用的是就近原則,如果有局部ActionForward,就按照局部ActionForward就近跳轉,如果沒有就按照全局的跳轉
如果我們在沒有登錄的情況下訪問一個沒有配置action的jsp又會怎麼樣?當然可以訪問。
我們可以採用另一種方式讓它不可訪問,就是把這些沒有配置action的jsp組織起來放到web-inf目錄下,
Web-inf下的資源是安全的,客戶端不能訪問,只有服務器可以訪問
3、struts-config.xml在運行期修改會引發異常
如果我們在運行期,將重定向改爲轉發,
ActionForward af=mapping.findForward("error");
af.setRedirect(false);//改爲轉發
return af;
會拋如下異常
throw new IllegalStateException("Configuration is frozen");
那麼,怎麼在運行期修改呢?繼續
4、動態actionforward
有動態actionform,自然要有動態actionforward,一般只要掛上動態,自然是非常靈活的。
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
//這個actionforward是我們自己創建的,並不是從mapping中取得
ActionForward af=new ActionForward();
af.setRedirect(true);//重定向
af.setPath("/mustLogin.jsp");//轉向路徑
return af;
}
動態forward自然不能從mapping中獲取,我們要手動創建,這樣就可以避免“3、struts-config.xml在運行期修改
會引發異常"
5、手動控制轉向
如果我們想拿到response做點事,輸出個圖片什麼的,手動控制轉向,完全可以不依託於actionforward
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
// ActionForward af=mapping.findForward("error");
// af.setRedirect(false);
// return af;
response.sendRedirect(request.getContextPath()+"/mustLogin.jsp");
return null;//必須返回null
}
這個時候,必須返回null給struts框架,不能返回actionforward對象。
ActionForward 就說的這吧,下篇繼續……