Action, ActionForm, ActionForward ,這三個對象構成了Struts 的核心。
Struts 最核心的控制器是ActionServlet ,該Servlet 攔截用戶請求,井將用戶請求轉入到Struts 體系內。
一、配置ActionServlet
ActionServlet 是一個標準的Servlet ,在web.xml 文件中配置,該Servlet 用于攔所有的HTTP 請求。因此,應將該Servlet 配置成自啟動Servlet ,即為該Servlet 配置load-on-startup 屬性。
注意:在應用Struts 的很多場景下,為Servlet 配直load-on-startup 屬性都是必需的。因此,筆者建議應為ServletAction 配直load-an-startup 屬性。
在web.xml 文件中配置ActionServlet 應增加如下片段:
- <!--?將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 > ??
該ActionServlet作為一個標準Servlet,配置在Web 應用中,負責攔截用戶請求。該Servlet 還有加載Struts 配置文件的責任。但這里并未告訴它如何加載Struts 的配置文
件,以及Struts 的配置文件放在哪里及文件名是什么。ActionServlet默認加載WEB-INF 下的struts-config.xml文件。如果需要Struts 的配置文件不在WEB-INF路徑下,或者改變了文件名,則應采用如下方式配置:
- < servlet > ??
- ???? < servlet-name > actionSevlet </ servlet-name > ??
- ???? < servlet-class > ??
- ????????org.apache.struts.action.ActionServlet ??
- ???? </ servlet-class > ??
- ???? < init-param > ??
- ???????? < param-name > config </ param-name > ??
- ???????? < param-value > /WEB-INF/struts-config-user.xml </ param-value > ??
- ???? </ init-param > ??
- ???? < load-on-startup > 2 </ load-on-startup > ??
- </ servlet > ??
在上面的配置中,指定了ActionServlet 的配置文件: struts-config-user.xml文件,該文件作為init-param參數載入,載入時候指定了參數名:config ,config 是Struts 固定的參數名, struts負責解析該參數,并加載該參數的指定的配置文件。Struts 支持使用多個配置文件,當有多個配置文件時,應將不同的配置文件配置成不同的模塊,并指定不同的URI。下面的片段配置了兩個配置文件:
- < 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-con工fgl.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 > ??
上面的配置片段中指定了兩個配置文件:struts-config l.xml 和struts-config2.xml 文件。這兩個配置文件分別被配置到config 和config/wawa 的路徑下。表明將struts-config 1.xml 中的Action 映射到應用的根路徑下,而struts-config2.xml 文件中的Action 則被映射到應用的wawa 子路徑下。也就是說wawa 將作為系統的一個模塊使用。
二、配置ActionForm
配置ActionForm ,必須包含ActionForm 類才行。Struts 要求ActionForm 必須繼承Struts 的基類: org.apache.struts.action.ActionForm,ActionForm 的實現非常簡單,該類只是一個普通的JavaBean,只要為每個屬性提供對應的setter 和getter 方法即可。根據前面的講解, ActionForm 用于封裝用戶的請求參數,而請求參數是通過JSP 頁面的表單域傳遞過來的。因此應保證ActionForm 的參數與表單域的名字相同。
注意: JavaB ean 的參數是根據getter 、setter 方法確定的。如果希望有一個A 的屬性,則應該提供getA 和setA 的方法。
(1)ActionForm的實現
ActionForm 的屬性必須與JSP 頁面的表單域相同。本示例的表單包含如下兩個表單域:
? usemame
? password
因此, ActionForm 必須繼承org.apache.struts.action.ActionForm,并為這兩個域提供對應的setter 和getter 方法,下面是ActionForm 的源代碼:
- import ?org.apache.struts.action.ActionForm; ??
- public ? class ?LoginForm? extends ?ActionForm?{ ??
- ???? private ?String?username; ??
- ???? private ?String?password; ??
- ??
- ???? //?表單域username對應的setter?方法 ??
- ???? /** ?
- ?????*?@return?the?username ?
- ?????*/ ??
- ???? public ?String?getUsername()?{ ??
- ???????? return ?username; ??
- ????} ??
- ??
- ???? /** ?
- ?????*?@param?username ?
- ?????*????????????the?username?to?set ?
- ?????*/ ??
- ???? public ? void ?setUsername(String?username)?{ ??
- ???????? this .username?=?username; ??
- ????} ??
- ??
- ???? /** ?
- ?????*?@return?the?password ?
- ?????*/ ??
- ???? public ?String?getPassword()?{ ??
- ???????? return ?password; ??
- ????} ??
- ??
- ???? /** ?
- ?????*?@param?password ?
- ?????*????????????the?password?to?set ?
- ?????*/ ??
- ???? public ? void ?setPassword(String?password)?{ ??
- ???????? this .password?=?password; ??
- ????} ??
- ??
- }??
另外,該ActionForm 的兩個屬性名可以不是usemame 和password。只要提供了usemame 和password 的setter 和getter 方法即可。
注意: FormBean 類應盡量聲明成public。
(2)ActionForm 的配置
所有的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 = "lee.LoginForm" ? /> ??
- </ form-beans > ??
配置ActionForm非常簡單,只需指定ActionForm 的name 屬性即可。該屬性定義了ActionForm的id. 用于標識該Form; 另外還需要一個type 屬性,該屬性定義了ActionForm的實現類。
下面將介紹Action 如何使用該ActionForm. 以及Action 如何與該ActionForm關聯。
三、配置Action
Action 的配置比ActionForm 相對復雜一點,因為Action 負責管理與之關聯的ActionForm. 它不僅需要配置實現類,還需要配置Action 的path 屬性,該屬性用于被用
戶請求。對于只需在本Action 內有效的Forward. 還應在Action 元素內配置局部Forward。
(1)Action 的實現
通過ActionForm. 可使Action 無須從HTTP 請求中解析參數。因為所有的參數都被封裝在ActionForm中,下面是Action 從AcitionForm 取得請求參數的源代碼:
- import ?javax.servlet.http.HttpServletRequest; ??
- import ?javax.servlet.http.HttpServletResponse; ??
- import ?org.apache.struts.action.Action; ??
- import ?org.apache.struts.action.ActionForm; ??
- import ?org.apache.struts.action.ActionForward; ??
- import ?org.apache.struts.action.ActionMapping; ??
- public ? class ?LoginAction? extends ?Action?{ ??
- ???? //?必須重寫該核心方法,該方法actionForm?將表單的請求參數封裝成值對象 ??
- ???? public ?ActionForward?execute(ActionMapping?mapping,?ActionForm?form, ??
- ????????????HttpServletRequest?request,?HttpServletResponse?response) ??
- ???????????? throws ?Exception?{ ??
- ???????? //將ActionForm強制類型轉換為LoginForm ??
- ????????LoginForm?loginForm?=?(LoginForm)?form; ??
- ???????? //?從ActionForm中解析出請求參數:?username ??
- ????????String?username?=?loginForm.getUsername(); ??
- ???????? //?從ActionForm中解析出請求參數:?password ??
- ????????String?pass?=?loginForm.getUsername(); ??
- ???????? //后面的處理與前一個示例的Action?相同。 ??
- ????????... ??
- ????} ??
- }??
該Action 從轉發過來的ActionForm 中解析請求參數,對應的ActionForm 則由ActionServlet 在接收到用戶請求時,負責實例化。
實際的過程是: 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。因此該name 屬性必須是前面存在的ActionForm 名。
? Action 的type: 該屬性用于指定Action 的實現類,也就是負責處理用戶請求的業
務控制器。
? 局部Forward: Action 的轉發并沒有轉發到實際的JSP 資源,而是轉發到邏輯名,即Forward 名。在Action 內配置的Forward 都是局部Forward (該Forward 只在該Action 內有效)。
下面是該Action 的配置代碼:
- <!--?該元素里配置所有的Action?--> ??
- < action-mappings > ??
- ???? <!--?配置Action.?指定了path?,?name?,?type?等屬性?--> ??
- ???? < action ? path = "/login" ? type = "lee.LoginAction" ? name = "loginForm" > ??
- ???????? <!--?配置局部Forward?--> ??
- ???????? < forward ? name = "welcome" ? path = "/WEB-INF/jsp/welcome.jsp" ? /> ??
- ???????? < forward ? name = "input" ? path = "/login.jsp" ? /> ??
- ???? </ action > ??
- </ action-mappings > ??
四、配置Forward
正如前面所講, Forward 分局部Forw缸d 和全局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。
下面提供了該應用的struts-config.xm1文件的全部源代碼:
- <? 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 > ??
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
