Struts就是一個MVC框架,下麵Struts1 是如何實現MVC 的。參考圖如下: M主要是ActionForm和JavaBean。負責程式的數據收集和業務處理,ActionForm屬於Struts的框架的,這裡的JavaBean是應用本身的業務邏輯。 V層主要是Jsp。主要用於動態頁面的顯示, ...
Struts就是一個MVC框架,下麵Struts1 是如何實現MVC 的。參考圖如下:
M主要是ActionForm和JavaBean。負責程式的數據收集和業務處理,ActionForm屬於Struts的框架的,這裡的JavaBean是應用本身的業務邏輯。
V層主要是Jsp。主要用於動態頁面的顯示,Struts本身是沒有V層的,作為一個框架只是一個大體結構。這個V層是由開發人員補全的。
C層是Struts的主要部分,包含了Struts框架本身的很多大部分內容,有:
struts-config.xml Struts框架自身的配置文件,包含了很多配置信息。
ActionServlet Struts框架核心控制類(替代servlet實現的抽象物)。
RequestProcessor 配合ActionServlet完成截取URL功能。
Struts通過內部對象及配置文件的協同工作,完成了對頁面和Action靈活控制。從而實現Model和View的分離,降低他們之間的耦合程度。
一、配置ActionServlet (web.xml)
Struts 最核心的控制器,ActionServlet 是一個標準的Servlet ,在web.xml 文件中配置,該Servlet 用於攔所有的HTTP 請求,井將用戶請求轉入到Struts 體系內。因此,應將該Servlet 配置成自啟動Servlet ,即為該Servlet 配置load-on-startup 屬性。
註意:在應用Struts 的很多場景下,為Servlet 配直load-on-startup 屬性都是必需的。因此,筆者建議應為ServletAction 配直load-an-startup 屬性,關於load-an-startup請詳見load-an-startup的作用。
<!-- 將ActionServlet配置成自啟動的Servlet --> <servlet> <!-- 指定Servlet 的名字 --> <servlet-name>actionSevlet</servlet-name> <!-- 指定該Servlet 的實現類 --> <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> <!-- 配置自啟動的級別 --> <load-on-startup>2</load-on-startup> </servlet> <servlet-mapping> <!-- 配置ActionServlet的URL 映射 --> <servlet-name>actionSevlet</servlet-name> <!-- 所有以.do 結尾的請求由ActionServlet攔截 --> <url-pattern>*.do</url-pattern> </servlet-mapping>
下麵的配置片段中指定了兩個配置文件:struts-config1.xml 和struts-config2.xml 文件。這兩個配置文件分別被配置到config 和config/wawa 的路徑下。
表明將struts-config1.xml 中的Action 映射到應用的根路徑下,而struts-config2.xml 文件中的Action 則被映射到應用的wawa 子路徑下。也就是說wawa 將作為系統的一個模塊使用。
<servlet> <!-- ActionServlet 的名 --> <servlet-name>actionSevlet</servlet-name> <!-- 配置Servlet 的實現類 --> <servlet-class> org.apache.struts.action.ActionServlet </servlet-class> <!-- 指定Struts 的第一個配置文件 --> <init-param> <!-- 指定配置文件的映射 --> <param-name>config</param-name> <param-value>/WEB-INF/struts-configl.xml</param-value> </init-param> <!-- 指定Struts 的第二個配置文件 --> <init-param> <!-- 指定配置文件的映射 --> <param-name>config/wawa</param-name> <param-value>/WEB-INF/struts-config2.xml</param-value> </init-param> <!-- 將ActionServlet配置成自啟動Servlet --> <load-on-startup>2</load-on-startup> </servlet>
二、配置ActionForm類 (JavaBean)
配置ActionForm ,必須包含ActionForm 類才行。Struts 要求ActionForm 必須繼承Struts 的基類: org.apache.struts.action.ActionForm,ActionForm 的實現非常簡單,該類只是一個普通的JavaBean,只要為每個屬性提供對應的setter 和getter 方法即可。根據前面的講解, ActionForm 用於封裝用戶的請求參數,而請求參數是通過JSP 頁面的表單域傳遞過來的。因此應保證ActionForm 的參數與表單域的名字相同。
註意: JavaB ean 的參數是根據getter 、setter 方法確定的。如果希望有一個A 的屬性,則應該提供getA 和setA 的方法。
所有的ActionForm 都被配置在struts-config.xml 文件中,該文件包括了一個form-beans 的元素,該元素內定義了所有的ActionForm,每個ActionForm 對應一個form-bean 元素。
為了定義LoginForm. 必須在struts-config.xml文件中增加如下代碼:
<!-- 用於定義所有的ActionForm --> <form-beans> <!-- 定義ActionForm,至少指定兩個屬性: name , type--> <form-bean name="loginForm" type="com.entity.User" /> </form-beans>
配置ActionForm非常簡單,只需指定ActionForm 的name 屬性即可。該屬性定義了ActionForm的id. 用於標識該Form; 另外還需要一個type 屬性,該屬性定義了ActionForm的實現類。
三、配置Action
Action 的配置比ActionForm 相對複雜一點,因為Action 負責管理與之關聯的ActionForm. 它不僅需要配置實現類,還需要配置Action 的path 屬性,該屬性用於被用
戶請求。對於只需在本Action 內有效的Forward. 還應在Action 元素內配置局部Forward。
(1)Action 的實現
package com.struts.action; /** * @struts.action path="/login" name="loginForm" input="/login.jsp" * scope="request" validate="true" */ public class LoginAction extends Action { /* * 登錄界面的Action */ // 必須重寫該核心方法,該方法actionForm 將表單的請求參數封裝成值對象 public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { //將ActionForm強制類型轉換為LoginForm User loginForm = (User) form; UserDAO userdao = new UserDAO(); User user = userdao.login(loginForm.getUser_name(), loginForm.getUser_password()); if (user != null) { System.out.println("用戶存在 登入成功,跳轉至pro.do"); return mapping.findForward("success"); } else { System.out.println("用戶不存在 登入失敗,跳轉至login.jsp"); return mapping.findForward("error"); } } }
實際的過程是: ActionServlet 攔截到用戶請求後,根據用戶的請求,在配置文件中查找對應的Action , Action 的name 屬性指定了用於封裝請求參數的ActionForm; 然後ActionServlet 將創建預設的ActionForm 實例,並調用對應的setter 方法完成ActionForm的初始化。
ActionServlet 在分發用戶請求時,也將對應ActionForm 的實例一同分發過來。
(2)Action 的配置
Action 需要配置如下幾個方面。
- Action 的path: ActionServlet 根據該屬性來轉發用戶的請求,即將用戶請求轉發與之同名的Action 。同名的意思是:將請求的.do 尾碼去掉,匹配Action 的path屬性值。
- Action 的name: 此處的name 屬性並不是Action 本身的名字,而是與Action 關聯的ActionForm(javabean)。因此該name 屬性必須是前面存在的ActionForm 名。
- Action 的type: 該屬性用於指定Action 的實現類,也就是負責處理用戶請求的業務控制器。
- 局部Forward: Action 的轉發並沒有轉發到實際的JSP 資源,而是轉發到邏輯名,即Forward 名。在Action 內配置的Forward 都是局部Forward (該Forward 只在該Action 內有效)。
<action-mappings > <action name="loginForm" path="/login" scope="request" attribute="loginForm" input="/login.jsp" type="com.struts.action.LoginAction"> <set-property property="cancellable" value="false" /> <forward name="error" path="/login.jsp" redirect="true" /> <forward name="success" path="/pro.do?func=select" redirect="true" /> </action> <action name="pro" parameter="func" path="/pro" type="com.struts.action.ProAction"> <forward name="success" path="/success.jsp" redirect="false" /> </action> </action-mappings>
四、配置Forward
正如前面所講, Forward 分局部Forward 和全局Forward 兩種。前者在Action 里配置,僅對該Action 有效:後者單獨配置,對所有的Action 都有效。
配置Forward 非常簡單,主要需要指定以下三個屬性。
- name: 該Forward 的邏輯名。
- path: 該Forward 映射到的JSP 資源。
- redirect: 是否使用重定向。
局部Forward 作為Action 的子元素配置;全局Forward 配置在global-forwards 元素里。
下麵是配置全局Forward 的代碼:
<!-- 配置全局Forward --> <global-forwards> <!-- 配置Forward對象的name 和path 屬性 --> <forward name="error" path="/WEB-INF/jsp/error.jsp" /> </global-forwards>
上面的配置代碼中,配置了一個全局Forward,該Forward 可以被所有的Action 訪問。通常,只將全局資源配置成全局Forward。當每個Action 在轉發時,首先在局部Forward 中查找與之對應的Forward,如果在局部Forward 中找不到對應的Forward 對象,才會到全局Forward 中查找。因此,局部Forward 可以覆蓋全局Forward。
下麵提供了web.xml文件的全部源代碼(參考):
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <display-name>user-pro-bills</display-name> <servlet> <servlet-name>action</servlet-name> <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> <init-param> <param-name>config</param-name> <param-value>/WEB-INF/struts-config.xml</param-value> </init-param> <init-param> <param-name>debug</param-name> <param-value>3</param-value> </init-param> <init-param> <param-name>detail</param-name> <param-value>3</param-value> </init-param> <load-on-startup>0</load-on-startup> </servlet> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>login.jsp</welcome-file> </welcome-file-list> </web-app>web.xml
下麵提供了struts-config.xml文件的全部源代碼(參考):
<?xml version="1.0" encoding="UTF-8"?> <!-- Struts 配置文件的文件頭,包含DTD 等信息 --> <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd"> <!--Struts 配置文件的根元素 --> <struts-config> <!--配置所有的ActionForm --> <form-beans> <!--配置第一個ActionForm,指定ActionForm的name 和type 屬性 --> <form-bean name="loginForm" type="lee.LoginForm" /> </form-beans> <!--配置全局Forward對象 --> <global-forwards> <!--該Forward對象的name 屬性為error. 映射資源為/WEB-INF/jsp/error.jsp --> <forward name="error" path="/WEB-INF/jsp/error.jsp" /> </global-forwards> <!--此處配置所有的Action 映射--> <action-mappings> <!--配置Action 的path. type 屬性name 屬性配置Action 對應的ActionForm--> <action path="/login" type="lee.LoginAction" name="loginForm"> <!--還配置了兩個局部Forward. 這兩個局部Forward僅對該Action有效--> <forward name="welcome" path="/WEB-INF/jsp/welcome.jsp" /> <forward name="input" path="/login.jsp" /> </action> </action-mappings> </struts-config>struts-config.xml