Action, ActionForm, ActionForward ,這三個(gè)對(duì)象構(gòu)成了Struts 的核心。
Struts 最核心的控制器是ActionServlet ,該Servlet 攔截用戶請(qǐng)求,井將用戶請(qǐng)求轉(zhuǎn)入到Struts 體系內(nèi)。
一、配置ActionServlet
ActionServlet 是一個(gè)標(biāo)準(zhǔn)的Servlet ,在web.xml 文件中配置,該Servlet 用于攔所有的HTTP 請(qǐng)求。因此,應(yīng)將該Servlet 配置成自啟動(dòng)Servlet ,即為該Servlet 配置load-on-startup 屬性。
注意:在應(yīng)用Struts 的很多場(chǎng)景下,為Servlet 配直load-on-startup 屬性都是必需的。因此,筆者建議應(yīng)為ServletAction 配直load-an-startup 屬性。
在web.xml 文件中配置ActionServlet 應(yīng)增加如下片段:
- <!--?將ActionServlet配置成自啟動(dòng)的Servlet?--> ??
- < servlet > ??
- ???? <!--?指定Servlet?的名字?--> ??
- ???? < servlet-name > actionSevlet </ servlet-name > ??
- ???? <!--?指定該Servlet?的實(shí)現(xiàn)類?--> ??
- ???? < servlet-class > ??
- ????????org.apache.struts.action.ActionServlet ??
- ???? </ servlet-class > ??
- ???? <!--?配置自啟動(dòng)的級(jí)別?--> ??
- ???? < load-on-startup > 2 </ load-on-startup > ??
- </ servlet > ??
- < servlet-mapping > ??
- ???? <!--?配置ActionServlet的URL?映射?--> ??
- ???? < servlet-name > actionSevlet </ servlet-name > ??
- ???? <!--?所有以.do?結(jié)尾的請(qǐng)求由ActionServlet攔截?--> ??
- ???? < url-pattern > *.do </ url-pattern > ??
- </ servlet-mapping > ??
該ActionServlet作為一個(gè)標(biāo)準(zhǔn)Servlet,配置在Web 應(yīng)用中,負(fù)責(zé)攔截用戶請(qǐng)求。該Servlet 還有加載Struts 配置文件的責(zé)任。但這里并未告訴它如何加載Struts 的配置文
件,以及Struts 的配置文件放在哪里及文件名是什么。ActionServlet默認(rèn)加載WEB-INF 下的struts-config.xml文件。如果需要Struts 的配置文件不在WEB-INF路徑下,或者改變了文件名,則應(yīng)采用如下方式配置:
- < 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參數(shù)載入,載入時(shí)候指定了參數(shù)名:config ,config 是Struts 固定的參數(shù)名, struts負(fù)責(zé)解析該參數(shù),并加載該參數(shù)的指定的配置文件。Struts 支持使用多個(gè)配置文件,當(dāng)有多個(gè)配置文件時(shí),應(yīng)將不同的配置文件配置成不同的模塊,并指定不同的URI。下面的片段配置了兩個(gè)配置文件:
- < servlet > ??
- ???? <!--?ActionServlet?的名?--> ??
- ???? < servlet-name > actionSevlet </ servlet-name > ??
- ???? <!--?配置Servlet?的實(shí)現(xiàn)類?--> ??
- ???? < servlet-class > ??
- ????????org.apache.struts.action.ActionServlet ??
- ???? </ servlet-class > ??
- ???? <!--?指定Struts?的第一個(gè)配置文件?--> ??
- ???? < init-param > ??
- ???????? <!--?指定配置文件的映射?--> ??
- ???????? < param-name > config </ param-name > ??
- ???????? < param-value > /WEB-INF/struts-con工fgl.xml </ param-value > ??
- ???? </ init-param > ??
- ???? <!--?指定Struts?的第二個(gè)配置文件?--> ??
- ???? < init-param > ??
- ???????? <!--?指定配置文件的映射?--> ??
- ???????? < param-name > config/wawa </ param-name > ??
- ???????? < param-value > /WEB-INF/struts-config2.xml </ param-value > ??
- ???? </ init-param > ??
- ???? <!--?將ActionServlet配置成自啟動(dòng)Servlet?--> ??
- ???? < load-on-startup > 2 </ load-on-startup > ??
- </ servlet > ??
上面的配置片段中指定了兩個(gè)配置文件:struts-config l.xml 和struts-config2.xml 文件。這兩個(gè)配置文件分別被配置到config 和config/wawa 的路徑下。表明將struts-config 1.xml 中的Action 映射到應(yīng)用的根路徑下,而struts-config2.xml 文件中的Action 則被映射到應(yīng)用的wawa 子路徑下。也就是說(shuō)wawa 將作為系統(tǒng)的一個(gè)模塊使用。
二、配置ActionForm
配置ActionForm ,必須包含ActionForm 類才行。Struts 要求ActionForm 必須繼承Struts 的基類: org.apache.struts.action.ActionForm,ActionForm 的實(shí)現(xiàn)非常簡(jiǎn)單,該類只是一個(gè)普通的JavaBean,只要為每個(gè)屬性提供對(duì)應(yīng)的setter 和getter 方法即可。根據(jù)前面的講解, ActionForm 用于封裝用戶的請(qǐng)求參數(shù),而請(qǐng)求參數(shù)是通過(guò)JSP 頁(yè)面的表單域傳遞過(guò)來(lái)的。因此應(yīng)保證ActionForm 的參數(shù)與表單域的名字相同。
注意: JavaB ean 的參數(shù)是根據(jù)getter 、setter 方法確定的。如果希望有一個(gè)A 的屬性,則應(yīng)該提供getA 和setA 的方法。
(1)ActionForm的實(shí)現(xiàn)
ActionForm 的屬性必須與JSP 頁(yè)面的表單域相同。本示例的表單包含如下兩個(gè)表單域:
? usemame
? password
因此, ActionForm 必須繼承org.apache.struts.action.ActionForm,并為這兩個(gè)域提供對(duì)應(yīng)的setter 和getter 方法,下面是ActionForm 的源代碼:
- import ?org.apache.struts.action.ActionForm; ??
- public ? class ?LoginForm? extends ?ActionForm?{ ??
- ???? private ?String?username; ??
- ???? private ?String?password; ??
- ??
- ???? //?表單域username對(duì)應(yīng)的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 的兩個(gè)屬性名可以不是usemame 和password。只要提供了usemame 和password 的setter 和getter 方法即可。
注意: FormBean 類應(yīng)盡量聲明成public。
(2)ActionForm 的配置
所有的ActionForm 都被配置在struts-config.xml 文件中,該文件包括了一個(gè)form-beans 的元素,該元素內(nèi)定義了所有的ActionForm,每個(gè)ActionForm 對(duì)應(yīng)一個(gè)form-bean 元素。
為了定義LoginForm. 必須在struts-config.xml文件中增加如下代碼:
- <!--?用于定義所有的ActionForm?--> ??
- < form-beans > ??
- ???? <!--?定義ActionForm,至少指定兩個(gè)屬性:?name?,?type--> ??
- ???? < form-bean ? name = "loginForm" ? type = "lee.LoginForm" ? /> ??
- </ form-beans > ??
配置ActionForm非常簡(jiǎn)單,只需指定ActionForm 的name 屬性即可。該屬性定義了ActionForm的id. 用于標(biāo)識(shí)該Form; 另外還需要一個(gè)type 屬性,該屬性定義了ActionForm的實(shí)現(xiàn)類。
下面將介紹Action 如何使用該ActionForm. 以及Action 如何與該ActionForm關(guān)聯(lián)。
三、配置Action
Action 的配置比ActionForm 相對(duì)復(fù)雜一點(diǎn),因?yàn)锳ction 負(fù)責(zé)管理與之關(guān)聯(lián)的ActionForm. 它不僅需要配置實(shí)現(xiàn)類,還需要配置Action 的path 屬性,該屬性用于被用
戶請(qǐng)求。對(duì)于只需在本Action 內(nèi)有效的Forward. 還應(yīng)在Action 元素內(nèi)配置局部Forward。
(1)Action 的實(shí)現(xiàn)
通過(guò)ActionForm. 可使Action 無(wú)須從HTTP 請(qǐng)求中解析參數(shù)。因?yàn)樗械膮?shù)都被封裝在ActionForm中,下面是Action 從AcitionForm 取得請(qǐng)求參數(shù)的源代碼:
- 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?將表單的請(qǐng)求參數(shù)封裝成值對(duì)象 ??
- ???? public ?ActionForward?execute(ActionMapping?mapping,?ActionForm?form, ??
- ????????????HttpServletRequest?request,?HttpServletResponse?response) ??
- ???????????? throws ?Exception?{ ??
- ???????? //將ActionForm強(qiáng)制類型轉(zhuǎn)換為L(zhǎng)oginForm ??
- ????????LoginForm?loginForm?=?(LoginForm)?form; ??
- ???????? //?從ActionForm中解析出請(qǐng)求參數(shù):?username ??
- ????????String?username?=?loginForm.getUsername(); ??
- ???????? //?從ActionForm中解析出請(qǐng)求參數(shù):?password ??
- ????????String?pass?=?loginForm.getUsername(); ??
- ???????? //后面的處理與前一個(gè)示例的Action?相同。 ??
- ????????... ??
- ????} ??
- }??
該Action 從轉(zhuǎn)發(fā)過(guò)來(lái)的ActionForm 中解析請(qǐng)求參數(shù),對(duì)應(yīng)的ActionForm 則由ActionServlet 在接收到用戶請(qǐng)求時(shí),負(fù)責(zé)實(shí)例化。
實(shí)際的過(guò)程是: ActionServlet 攔截到用戶請(qǐng)求后,根據(jù)用戶的請(qǐng)求,在配置文件中查找對(duì)應(yīng)的Action , Action 的name 屬性指定了用于封裝請(qǐng)求參數(shù)的ActionForm; 然后ActionServlet 將創(chuàng)建默認(rèn)的ActionForm 實(shí)例,并調(diào)用對(duì)應(yīng)的setter 方法完成ActionForm的初始化。
ActionServlet 在分發(fā)用戶請(qǐng)求時(shí),也將對(duì)應(yīng)ActionForm 的實(shí)例一同分發(fā)過(guò)來(lái)。
(2)Action 的配置
Action 需要配置如下幾個(gè)方面。
? Action 的path: ActionServlet 根據(jù)該屬性來(lái)轉(zhuǎn)發(fā)用戶的請(qǐng)求,即將用戶請(qǐng)求轉(zhuǎn)發(fā)與之同名的Action 。同名的意思是:將請(qǐng)求的.do 后綴去掉,匹配Action 的path屬性值。
? Action 的name: 此處的name 屬性并不是Action 本身的名字,而是與Action 關(guān)聯(lián)的ActionForm。因此該name 屬性必須是前面存在的ActionForm 名。
? Action 的type: 該屬性用于指定Action 的實(shí)現(xiàn)類,也就是負(fù)責(zé)處理用戶請(qǐng)求的業(yè)
務(wù)控制器。
? 局部Forward: Action 的轉(zhuǎn)發(fā)并沒(méi)有轉(zhuǎn)發(fā)到實(shí)際的JSP 資源,而是轉(zhuǎn)發(fā)到邏輯名,即Forward 名。在Action 內(nèi)配置的Forward 都是局部Forward (該Forward 只在該Action 內(nèi)有效)。
下面是該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 里配置,僅對(duì)該Action 有效:后者單獨(dú)配置,對(duì)所有的Action 都有效。
配置Forward 非常簡(jiǎn)單,主要需要指定以下三個(gè)屬性。
? name: 該Forward 的邏輯名。
? path: 該Forward 映射到的JSP 資源。
? redirect: 是否使用重定向。
局部Forward 作為Action 的子元素配置;全局Forward 配置在global-forwards 元素里。
下面是配置全局Forward 的代碼:
- <!--?配置全局Forward?--> ??
- < global-forwards > ??
- ???? <!--?配置Forward對(duì)象的name?和path?屬性?--> ??
- ???? < forward ? name = "error" ? path = "/WEB-INF/jsp/error.jsp" ? /> ??
- </ global-forwards > ??
上面的配置代碼中,配置了一個(gè)全局Forward,該Forward 可以被所有的Action 訪問(wèn)。通常,只將全局資源配置成全局Forward。當(dāng)每個(gè)Action 在轉(zhuǎn)發(fā)時(shí),首先在局部Forward 中查找與之對(duì)應(yīng)的Forward,如果在局部Forward 中找不到對(duì)應(yīng)的Forward 對(duì)象,才會(huì)到全局Forward 中查找。因此,局部Forward 可以覆蓋全局Forward。
下面提供了該應(yīng)用的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 > ??
- ???????? <!--配置第一個(gè)ActionForm,指定ActionForm的name?和type?屬性?--> ??
- ???????? < form-bean ? name = "loginForm" ? type = "lee.LoginForm" ? /> ??
- ???? </ form-beans > ??
- ???? <!--配置全局Forward對(duì)象?--> ??
- ???? < global-forwards > ??
- ???????? <!--該Forward對(duì)象的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?對(duì)應(yīng)的ActionForm--> ??
- ???????? < action ? path = "/login" ? type = "lee.LoginAction" ? name = "loginForm" > ??
- ???????????? <!--還配置了兩個(gè)局部Forward.?這兩個(gè)局部Forward僅對(duì)該Action有效--> ??
- ???????????? < forward ? name = "welcome" ? path = "/WEB-INF/jsp/welcome.jsp" ? /> ??
- ???????????? < forward ? name = "input" ? path = "/login.jsp" ? /> ??
- ???????? </ action > ??
- ???? </ action-mappings > ??
- </ struts-config > ??
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

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