上篇講述了[struts控制器Action和DispatchAction](http://blog.csdn.net/lovesummerforever/article/details/18967831)以及LookupDispatchAction,本篇主要說說struts中的頁面轉發控制,struts提供了ActionForward和ActionMapping兩個類來控制頁面轉發。
### ActionForward
在使用struts框架開發web應用程序時,Action在完成用戶邏輯處理后,需要把處理結果展示給用戶,這個時候就需要程序控制頁面的轉發,在struts中使用ActionForward對象控制程序轉向。ActonForward對象是一種配置對象,代表了一般的web資源,可以是jsp頁面,servlet以及其他的Action,ActonForward對象映射的是struts配置文件struts-config.xml中的<forward>元素,在這個元素中封裝了目標頁面的URI。ActionForward是struts中的核心類,以下主要參數。
(1)Name屬性:指定ActionForward名稱,在其他類中也可以通過這個名字調用ActionForward。
(2)Path屬性:指明了ActionForward對應的URI。
(3)redirect屬性:屬性設置為true時被設置為重定向,默認false。
在struts中ActionForward有全局轉發ActionForward和局部轉發ActionForward,全局ActionForward應用于全部的Action和局部的轉發僅僅對于當前的Action有效。
例如對用戶登錄的判斷,提交表單后,把用戶登錄信息保存到session中,然后設置<forward>中redirect為true,設置為重定向方式,然后再進行判斷
~~~
<action path="/must_login"??type="com.bjpowernode.struts.MustLoginAction"
????????????????????????>
??????????????????????<forwardname="login" path="/login.jsp"redirect="true"/>
????????????????</action>
~~~
這樣當用戶已經登錄的時候會給出提示已經登錄。
如果有十個Action,每個都要驗證是否登錄,每個Action都要進行判斷是否登錄,如果沒有登錄或者超時登錄則轉到Login.jsp上。<forwardname=”login” path=”/login.jsp” redirect=”true”/>如果有100個Action都要重復一百個上一行代碼,因為這個forward只能被自己的這個Action使用,不能被其他的Action使用,所以我們稱為局部的Action。為了避免不必要的重復我們可以使用全局Action,代碼如下所示。
~~~
???<global-forwards>
??????????<forwardname="login" path="/login.jsp"redirect="false"/>
???</global-forwards>
~~~
雖然通過對session的判斷和全局forward的設置,但是用戶可以通過輸入地址來訪問jsp頁面。我們可以把頁面放到WEB-INF下,WEB-INF下的頁面是無法在客戶端訪問到的,我們把頁面放到這個目錄下,避免用戶通過輸入地址訪問到我們不想讓用戶訪問的頁面。
我們也可以自己手動轉到想要轉到的頁面,不需要返回ActionForward對象。
~~~
//手動轉向。
Response.sendRedirect(request.getContextPath()+”/login.jsp”);
//同時設置返回值為null。
Return null;
~~~
ActionForward和動態ActionForward。
我們想要實現當用戶輸入1轉到頁面page1.jsp,輸入2轉到page2.jsp頁面。代碼如下所示。
~~~
packagecom.bjpowernode.struts;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importorg.apache.struts.action.Action;
importorg.apache.struts.action.ActionForm;
importorg.apache.struts.action.ActionForward;
importorg.apache.struts.action.ActionMapping;
/**
*動態的ActionForward
* @author summer
*
*/
public classDynaActionForwardTestAction extends Action {
???@Override
???public ActionForwardexecute(ActionMapping mapping, ActionForm form,
?????????????????HttpServletRequestrequest, HttpServletResponse response)
?????????????????throwsException {
??????????
??????????intpage = Integer.parseInt(request.getParameter("page"));
??????????//自己new一個ActonForward。動態ActionForward
??????????ActionForwardaf = new ActionForward();
??????????af.setPath("/page"+ page+".jsp");
??????????//設置為重定向方式。
??????????af.setRedirect(true);
??????????//如果輸入時1則重定向到page1.jsp.
??????????if(page==1)
??????????{
?????????????????af= mapping.findForward("page1");
??????????}
??????????//如果輸入時2則重定向到page2.jsp.
??????????if(page==2)
??????????{
?????????????????af= mapping.findForward("page2");
??????????}
??????????returnaf;
???}
}
~~~
在這里采用動態ActionForward實現設置為重定向方式,而靜態的ActionForw是不能動態的修改配置文件的。
### ActionMapping
在struts-config.xml配置文件中,每個<action>元素都對應著一個ActionMapping,當用戶請求被ServletAction接受以后,ActionServlet會根據用戶請求URL以及<action>元素設定的path屬性確定對應的ActionMapping對象,ActionMapping對象會告訴ActionServlet使用哪個Action對象處理用戶請求。
ActionMapping描述了struts中用戶請求路徑和Action的映射關系,在struts中每個ActionMapping都是通過path屬性和一個特定的用戶請求URL關聯。它負責轉發用戶請求給具體的Action,同時還轉發了其他的一些相關信息,這種請求和處理動作之間的映射關系保存在struts-config.xml這個配置文件中,在web服務器初始化的時候,會加載這個配置文件,struts給每個Action都創建一個ActionMapping對象,用來提供給Action使用,當ActionServlet轉發請求的時候,ActionMapping對象會被作為參數傳遞給Action的execute()方法。
struts的學習就總結到此,學習永遠是在學習中,不是一蹴而就的,在后續的學習和項目中加深學習,加深認識。加油!
- 前言
- Struts旅程(一)Struts簡介和原理
- struts旅程(二)Struts登錄示例
- Struts旅程(三)Struts表單處理器ActionForm(靜態動態)
- Struts旅程(四)MVC向struts MVC框架演變過程
- Struts旅程(五)struts控制器DispatchAction
- Struts旅程(六)Struts頁面轉發控制ActionForward和ActionMapping
- Hibernate旅程(一)Hibernate架構概述
- Hibernate旅程(二)Hibernate實例
- Hibernate旅程(三)Hibernate持久化對象的三個狀態
- Hibernate旅程(四)Hibernate對數據庫刪除、查找、更新操作
- Hibernate旅程(五)Hibernate映射--基本類映射和對象關系映射
- Hibernate旅程(六)Hibernate映射--繼承映射
- Hibernate旅程(七)Hibernate緩存機制--一級緩存
- Hibernate旅程(八)Hibernate緩存機制--二級緩存
- Hibernate旅程(九)Hibernate緩存機制--查詢緩存
- Spring旅程(一)為什么使用Spring
- Spring旅程(二)非Spring向Spring過渡-- Spring IOC容器的使用
- Spring旅程(三) AOP--Spring AOP容器基礎
- Spring旅程(四) AOP--Spring AOP實例
- SSH旅程(五)Spring運用到Hibernate中
- SSH旅程(六)Spring和struts結合(方案一)