一口一口喫掉struts(七)——ActionForward知多少 .

通過前面幾篇的介紹,我們對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 就說的這吧,下篇繼續……

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章