一口一口吃掉Struts的基本原理_第1頁
一口一口吃掉Struts的基本原理_第2頁
一口一口吃掉Struts的基本原理_第3頁
一口一口吃掉Struts的基本原理_第4頁
一口一口吃掉Struts的基本原理_第5頁
已閱讀5頁,還剩37頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、 HYPERLINK /shan9liang/article/details/8686333 一口一口吃掉Struts(一)用JSP+Servlet演示Struts的基本原理 struts是開源項目。它通過采用 Java Servlet/JSP 技術,實現(xiàn)了基于Java EE Web應用的MVC的應用框架。Struts繼承了MVC的各項特性,并根據(jù)J2EE的特點,做了相應的變化與擴展。MVC即Model-View-Controller的縮寫,是一種常用的設計模式(具體自己百度吧)我們用JSP+Servlet實現(xiàn)“一個應用的增改信息”,先來看一下,如果沒有Struts,我們一般都是怎么做的。廢話

2、少說,果斷上代碼V層用JSP實現(xiàn)html HYPERLINK /shan9liang/article/details/8686333 o view plain view plain HYPERLINK /shan9liang/article/details/8686333 o copy copy HYPERLINK /shan9liang/article/details/8686333 o print print HYPERLINK /shan9liang/article/details/8686333 o ? ?測試增加測試修改C層前端控制器Servletjava HYPERLINK /sh

3、an9liang/article/details/8686333 o view plain view plain HYPERLINK /shan9liang/article/details/8686333 o copy copy HYPERLINK /shan9liang/article/details/8686333 o print print HYPERLINK /shan9liang/article/details/8686333 o ? ?packageControl;importjava.io.IOException;importjavax.servlet.ServletExcept

4、ion;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;publicclassControllerextendsHttpServletprotectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException/截取字符串StringrequestURI=r

5、equest.getRequestURI();StringflagAction=requestURI.substring(requestURI.indexOf(/,1),requestURI.indexOf(.);IActionaction=null;/根據(jù)字符串轉(zhuǎn)發(fā)相應的Actionif(/Servlet/Add.equals(flagAction)/TODO采用讀取配置文件,反射,這里省略,就直接NEW了action=newAddAction();elseif(/Servlet/Modify.equals(flagAction)action=newModifyAction();/TODO獲

6、取表單信息/TODO將字符串轉(zhuǎn)換為我們需要的格式等等,向下傳遞/得到轉(zhuǎn)向信息StringforwordString=action.Excute();/轉(zhuǎn)發(fā)request.getRequestDispatcher(forwordString).forward(request,response);protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOExceptiondoGet(request,response);配置文件html HYPERLINK /s

7、han9liang/article/details/8686333 o view plain view plain HYPERLINK /shan9liang/article/details/8686333 o copy copy HYPERLINK /shan9liang/article/details/8686333 o print print HYPERLINK /shan9liang/article/details/8686333 o ? ?ControllerControl.ControllerController*.actionActoin接口和實現(xiàn)Action接口的增和改java

8、 HYPERLINK /shan9liang/article/details/8686333 o view plain view plain HYPERLINK /shan9liang/article/details/8686333 o copy copy HYPERLINK /shan9liang/article/details/8686333 o print print HYPERLINK /shan9liang/article/details/8686333 o ? ?packageControl;publicinterfaceIActionpublicStringExcute();ja

9、va HYPERLINK /shan9liang/article/details/8686333 o view plain view plain HYPERLINK /shan9liang/article/details/8686333 o copy copy HYPERLINK /shan9liang/article/details/8686333 o print print HYPERLINK /shan9liang/article/details/8686333 o ? ?packageControl;importModel.Manage;publicclassAddActionimpl

10、ementsIActionpublicStringExcute()/執(zhí)行MODEL層邏輯Managemanage=newManage();manage.Add();/返回轉(zhuǎn)向信息/TODO可以在配置文件中讀return/AddSuccess.jsp;java HYPERLINK /shan9liang/article/details/8686333 o view plain view plain HYPERLINK /shan9liang/article/details/8686333 o copy copy HYPERLINK /shan9liang/article/details/8686

11、333 o print print HYPERLINK /shan9liang/article/details/8686333 o ? ?packageControl;importModel.Manage;publicclassModifyActionimplementsIActionpublicStringExcute()/執(zhí)行MODEL層邏輯Managemanage=newManage();manage.Modify();/返回轉(zhuǎn)向信息/TODO可以在配置文件中讀return/ModifySuccess.jsp;M層實現(xiàn)業(yè)務邏輯java HYPERLINK /shan9liang/arti

12、cle/details/8686333 o view plain view plain HYPERLINK /shan9liang/article/details/8686333 o copy copy HYPERLINK /shan9liang/article/details/8686333 o print print HYPERLINK /shan9liang/article/details/8686333 o ? ?packageModel;publicclassManagepublicvoidAdd()System.out.println(添加);publicvoidModify()S

13、ystem.out.println(更改);我們這么實現(xiàn)會有哪些問題?1、實例化響應的Action,我們要么用if語句,手動創(chuàng)建,要么需要自己讀配置文件,獲取Action,反射實例化2、表單過來的所有數(shù)據(jù)都是字符串,我們需要手動轉(zhuǎn)成響應的格式3、轉(zhuǎn)向信息,我們可能會寫死,也可能手動去配置文件讀4、我們需要手動做很多事,而且很多重復勞動,還容易出錯。如果有個東西能為我代勞就簡單得多了,所以Struts應運而生,Struts把我們上面提到的那些都做了封裝,讓我們的開發(fā)更高效,更有靈活性。上面的代碼,用時序圖表示如下,我們完全可以看做是Struts實現(xiàn)地基本原理。這篇先說這么多,下篇繼續(xù) HYPER

14、LINK /shan9liang/article/details/8688568 一口一口吃掉Struts(二)STRUTS基本工作流程 上篇中,用jsp+servlet演示了一下Struts的基本原理,這一篇我們介紹一下Struts執(zhí)行的基本流程。假設現(xiàn)在有以下情景:用戶正在瀏覽一個用STRUTS的技術構建的網(wǎng)站主頁,主頁上有個登陸表單,用戶填好登陸名和密碼,單擊“登陸”按鈕,就激活了以下一系列過程:(1)用戶的請求以HTTP方式傳輸?shù)椒掌魃?,接受請求的是ActionServlet.(2)ActionServlet接收到請求后,會查找Struts-config.xml文件來確定服務器上是否

15、有用戶請求的操作,此處用戶請求操作應為登陸操作。如果沒有,則返回一個用戶請求無效的出錯信息。(3)當 ActionServlet請求找到用戶請求的Action后,首先將用戶輸入的表單參數(shù)打包成一個ActionFrom對象,這個ActionFrom 對象其實也就是一個JavaBean,里面包含兩個字段,分別是用戶名和密碼。接著ActionServlet再根據(jù)struts-config.xml 中的配置信息決定是否要執(zhí)行ActionFrom對象中的Validate方法。若Validate方法執(zhí)行有錯,則返回。否則,繼續(xù)下一步。(4)系統(tǒng)生成一個用戶所請求的Action的實例對象,將前面的Actio

16、nFrom對象傳遞給它,運行它的Execute()方法。這一步其實就是用戶登陸的控制器,在執(zhí)行exectue()方法時,可以調(diào)用后臺模型驗證登陸名和密碼是否正確等信息。(5)execute() 執(zhí)行結(jié)束前會生成一個ActionForward類型的對象并將之返回給ActionServlet,該對象的作用是告訴ActionFroward就代 表跳轉(zhuǎn)到一個登陸成功的頁面。ActionServlet將對之進行分析,其實就相當于接收到一個新的請求,重復(2)(5)的過程,直到將某個界面返 回給用戶為止!以上就是STRUTS的基本工作流程,解釋得比較粗,用活動圖描述如下:我們可以設置斷點,在myeclip

17、se等環(huán)境中跟一下執(zhí)行執(zhí)行流程,得到一個更細粒度地執(zhí)行流程,見時序圖: HYPERLINK /shan9liang/article/details/8690179 一口一口吃掉Struts(三)一個簡單Struts實例 了解了Struts的基本流程,那么我們利用Struts來實現(xiàn)一個簡單的登陸功能:先用時序圖來描述一下登錄功能的處理流程:核心操作:1、配置struts* 拷貝struts相關的jar到WEB-INF/lib下* 在web.xml文件中配置ActionServlet* 提供struts-config.xml文件,需要放到WEB-INF下2、實現(xiàn)*建立login.jsp/login

18、Success.jsp/loginFail.jsp*建立了LoginAction.java/userActionForm.java*將LoginAction/LoginActionForm/相關jsp配置到struts-config.xml文件中代碼:配置文件html HYPERLINK /shan9liang/article/details/8690179 o view plain view plain HYPERLINK /shan9liang/article/details/8690179 o copy copy HYPERLINK /shan9liang/article/details

19、/8690179 o print print HYPERLINK /shan9liang/article/details/8690179 o ? ?actionorg.apache.struts.action.ActionServletconfig/WEB-INF/struts-config.xmldebug2detail22action*.doJSP(View)html HYPERLINK /shan9liang/article/details/8690179 o view plain view plain HYPERLINK /shan9liang/article/details/8690

20、179 o copy copy HYPERLINK /shan9liang/article/details/8690179 o print print HYPERLINK /shan9liang/article/details/8690179 o ? ?LoginSuccess.jsphtml HYPERLINK /shan9liang/article/details/8690179 o view plain view plain HYPERLINK /shan9liang/article/details/8690179 o copy copy HYPERLINK /shan9liang/ar

21、ticle/details/8690179 o print print HYPERLINK /shan9liang/article/details/8690179 o ? ?登錄成功LoginFail.jsphtml HYPERLINK /shan9liang/article/details/8690179 o view plain view plain HYPERLINK /shan9liang/article/details/8690179 o copy copy HYPERLINK /shan9liang/article/details/8690179 o print print HYP

22、ERLINK /shan9liang/article/details/8690179 o ? ?登錄失敗LoginActionjava HYPERLINK /shan9liang/article/details/8690179 o view plain view plain HYPERLINK /shan9liang/article/details/8690179 o copy copy HYPERLINK /shan9liang/article/details/8690179 o print print HYPERLINK /shan9liang/article/details/869017

23、9 o ? ?packagecom.jialin;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;/*登錄action*autho

24、rjialin*作用:取得表單數(shù)據(jù),調(diào)用model層業(yè)務邏輯,返回轉(zhuǎn)向信息*/publicclassLoginActionextendsActionOverridepublicActionForwardexecute(ActionMappingmapping,ActionFormform,HttpServletRequestrequest,HttpServletResponseresponse)throwsExceptionUserActionFormuserForm=(UserActionForm)form;StringuserName=userForm.getName();intpassw

25、ord=userForm.getPassword();/這里不用我們手動強轉(zhuǎn)類型了。UserManageuserManage=newUserManage();/后面我們再改進Useruser=newUser();user.setName(userName);user.setPassword(password);tryuserManage.ValidateUser(user);returnmapping.findForward(success);catch(UserNotFoundExceptione)e.printStackTrace();request.setAttribute(messag

26、e,e.getMessage();catch(PasswordErrorExceptione)e.printStackTrace();request.setAttribute(message,e.getMessage();returnmapping.findForward(fail);struts-config.xmlhtml HYPERLINK /shan9liang/article/details/8690179 o view plain view plain HYPERLINK /shan9liang/article/details/8690179 o copy copy HYPERLI

27、NK /shan9liang/article/details/8690179 o print print HYPERLINK /shan9liang/article/details/8690179 o ? ?UserActionFormjava HYPERLINK /shan9liang/article/details/8690179 o view plain view plain HYPERLINK /shan9liang/article/details/8690179 o copy copy HYPERLINK /shan9liang/article/details/8690179 o p

28、rint print HYPERLINK /shan9liang/article/details/8690179 o ? ?packagecom.jialin;importorg.apache.struts.action.ActionForm;/*用戶ActionForm,負責收集表單數(shù)據(jù)*authorjialin*注:get和set后的字符串首字母變小寫后,必須和表單中屬性的名字一致*/publicclassUserActionFormextendsActionFormprivateStringname;privateintpassword;publicStringgetName()retu

29、rnname;publicvoidsetName(Stringname)=name;publicintgetPassword()returnpassword;publicvoidsetPassword(intpassword)this.password=password;UserManage(Model)java HYPERLINK /shan9liang/article/details/8690179 o view plain view plain HYPERLINK /shan9liang/article/details/8690179 o copy copy HYPERLINK /sha

30、n9liang/article/details/8690179 o print print HYPERLINK /shan9liang/article/details/8690179 o ? ?packagecom.jialin;/*MODEL層業(yè)務邏輯*authorjialin*判斷用戶是否合法*/publicclassUserManagepublicvoidValidateUser(Useruser)/判斷用戶名密碼是否正確if(!jialin.equals(user.getName()thrownewUserNotFoundException(用戶不存在!用戶名為:+user.getNa

31、me();elseif(user.getPassword()!=123456)thrownewPasswordErrorException(密碼錯誤);用戶實體和異常類省略。上述實現(xiàn)過程,其中ActionServlet的功能,被Struts封裝了,所以我們的代碼部分,并沒有涉及到ActionServlet的部分。分析代碼可知道,Action不再需要我們手動創(chuàng)建,讀取配置文件等基礎服務已被Struts封裝了,表單中數(shù)據(jù)類型也不需要我們手動轉(zhuǎn)換了,頁面轉(zhuǎn)向可以進行配置,也不需要我們手動去配置文件中取了??梢哉f,Struts把公共的服務為封裝好了,我們只需要做很少的事,就可以獲得很大的靈活性。 HY

32、PERLINK /shan9liang/article/details/8690319 一口一口吃掉Struts(四)幾個知道就可以的屬性 先看struts-config.xmlhtml HYPERLINK /shan9liang/article/details/8690319 o view plain view plain HYPERLINK /shan9liang/article/details/8690319 o copy copy HYPERLINK /shan9liang/article/details/8690319 o print print HYPERLINK /shan9li

33、ang/article/details/8690319 o ? ?其中 validate和attribut有什么用?validate,是否驗證表單數(shù)據(jù)。我們在ActionForm中,重寫父類的validate方法,當從表單收集完數(shù)據(jù)放到ActionForm后,如果配置文件中validate=true,將調(diào)用該方法,這里我們可以做一些數(shù)據(jù)驗證。java HYPERLINK /shan9liang/article/details/8690319 o view plain view plain HYPERLINK /shan9liang/article/details/8690319 o copy

34、copy HYPERLINK /shan9liang/article/details/8690319 o print print HYPERLINK /shan9liang/article/details/8690319 o ? ?OverridepublicActionErrorsvalidate(ActionMappingmapping,HttpServletRequestrequest)System.out.println(ActionForm.validate()從表單收集完數(shù)據(jù)放到ActionForm后做驗證);returnsuper.validate(mapping,request

35、);當然,如果系統(tǒng)安全性各方面要求不高,我們一般的驗證都是放在javascript里的。attribute如果我們配置了attribute屬性,我們在jsp中要獲取actionform中的值得時候,form名就變?yōu)閍ttribute設置的值。而不再是form-bean節(jié)點下 name屬性的值。例如html HYPERLINK /shan9liang/article/details/8690319 o view plain view plain HYPERLINK /shan9liang/article/details/8690319 o copy copy HYPERLINK /shan9li

36、ang/article/details/8690319 o print print HYPERLINK /shan9liang/article/details/8690319 o ? ?如果我們要用el表達式取表單的值,不能使用$userF,而是$ActionForm中還可以重寫父類的reset的方法,可以在把收集表單數(shù)據(jù)往ActionForm中放之前做一些處理java HYPERLINK /shan9liang/article/details/8690319 o view plain view plain HYPERLINK /shan9liang/article/details/86903

37、19 o copy copy HYPERLINK /shan9liang/article/details/8690319 o print print HYPERLINK /shan9liang/article/details/8690319 o ? ?Overridepublicvoidreset(ActionMappingmapping,HttpServletRequestrequest)System.out.println(ActionForm.reset()可以在把收集表單數(shù)據(jù)往ActionForm中放之前做一些處理); HYPERLINK /shan9liang/article/det

38、ails/8691897 一口一口吃掉Struts(五)測試Struts標簽庫 Struts標簽庫的使用和JSTL標簽庫使用方式類似。認識可以了,建議熟練掌握JSTL標簽庫。struts標簽庫基本認識就可以了。核心操作:配置:* 配置國際化支持,在struts-config.xml文件中加入如下配置:* 最好提供國際化資源文件(MessageRperties),將該文件放到src下使用:采用taglib引入 測試代碼:ACTIONjava HYPERLINK /shan9liang/article/details/8691897 o view plain view plain HYPERLIN

39、K /shan9liang/article/details/8691897 o copy copy HYPERLINK /shan9liang/article/details/8691897 o print print HYPERLINK /shan9liang/article/details/8691897 o ? ?packagecom.jialin;importjava.util.ArrayList;importjava.util.Date;importjava.util.List;importjavax.servlet.http.HttpServletRequest;importjav

40、ax.servlet.http.HttpServletResponse;importorg.apache.struts.action.Action;importorg.apache.struts.action.ActionForm;importorg.apache.struts.action.ActionForward;importorg.apache.struts.action.ActionMapping;publicclassTestActionextendsActionOverridepublicActionForwardexecute(ActionMappingmapping,Acti

41、onFormform,HttpServletRequestrequest,HttpServletResponseresponse)throwsException/普通字符串request.setAttribute(hello,helloworld);/html文本request.setAttribute(world,HelloWorld!);/日期request.setAttribute(today,newDate();/數(shù)字request.setAttribute(number,12345.1234);Groupgroup=newGroup();group.setName(師院);Useru

42、ser=newUser();user.setUsername(張三);user.setAge(18);user.setGroup(group);/結(jié)構數(shù)據(jù)request.setAttribute(user,user);/空request.setAttribute(attr1,null);request.setAttribute(attr2,);request.setAttribute(attr3,newArrayList();/ListListuserList=newArrayList();for(inti=0;i10;i+)Useruser1=newUser();user1.setUsern

43、ame(張三_+i);user1.setAge(18+i);user1.setGroup(group);userList.add(user1);request.setAttribute(userlist,userList);returnmapping.findForward(showresult);Userjava HYPERLINK /shan9liang/article/details/8691897 o view plain view plain HYPERLINK /shan9liang/article/details/8691897 o copy copy HYPERLINK /sh

44、an9liang/article/details/8691897 o print print HYPERLINK /shan9liang/article/details/8691897 o ? ?packagecom.jialin;publicclassUserprivateStringusername;privateintage;privateGroupgroup;publicStringgetUsername()returnusername;publicvoidsetUsername(Stringusername)this.username=username;publicintgetAge

45、()returnage;publicvoidsetAge(intage)this.age=age;publicGroupgetGroup()returngroup;publicvoidsetGroup(Groupgroup)this.group=group;Groupjava HYPERLINK /shan9liang/article/details/8691897 o view plain view plain HYPERLINK /shan9liang/article/details/8691897 o copy copy HYPERLINK /shan9liang/article/det

46、ails/8691897 o print print HYPERLINK /shan9liang/article/details/8691897 o ? ?packagecom.jialin;publicclassGroupprivateStringname;publicStringgetName()returnname;publicvoidsetName(Stringname)=name;JSPhtml HYPERLINK /shan9liang/article/details/8691897 o view plain view plain HYPERLINK /shan9liang/art

47、icle/details/8691897 o copy copy HYPERLINK /shan9liang/article/details/8691897 o print print HYPERLINK /shan9liang/article/details/8691897 o ? ?Inserttitlehere測試beanwrite標簽普通字符串hello(標簽):html文本world(default):world(filtertrue):world(filterfalse):格式化日期today(default):today(format=yyyy-MM-ddHH:mm:ss):格式

48、化數(shù)字n(default):n(format=#,#.#):n(format=#,#.00000):結(jié)構姓名:inputtype=textname=usernamevalue=年齡:inputtype=textname=useragevalue=所屬組:inputtype=textname=usergroupvalue=測試logic:empty,logic:notEmpty,logic:present,logic:notPresentatrr1為空atrr1不為空atrr1存在atrr1不存在atrr2為空atrr2不為空atrr2存在atrr2不存在atrr3為空atrr3不為空atrr3

49、存在atrr3不存在測試迭代標簽姓名年齡所屬組沒有符合條件的數(shù)據(jù)測試結(jié)果:下篇繼續(xù) HYPERLINK /shan9liang/article/details/8693187 一口一口吃掉Struts(六)動態(tài)ActionForm 使用ActionForm把表單數(shù)據(jù)單獨封裝起來,而且提供了自動的數(shù)據(jù)驗證,簡化了代碼的編寫,給我們帶來了極大的方便。但是,ActionForm也存在一些明顯的不足:1、如果ActionForm對應的HTML表單添加或刪除一些屬性,ActionForm類就可能需要修改并重新編譯;所以如果HTML表單是動態(tài)的,那么ActionForm就無能為力了;2、ActionFor

50、m增加了項目中類的數(shù)量!3、對于安全性要求不高的系統(tǒng),ActionForm的數(shù)據(jù)驗證并不常用,我們一般都在js中驗證了面對這些缺點,Struts引入了動態(tài)actionform概念,動態(tài)ActionForm使得用戶無須為應用程序的每一個HTML表單創(chuàng)建具體的ActionForm類。Struts框架包中的DyanActionForm類及其子類實現(xiàn)了動態(tài)ActionForm.還是邊看實例邊說吧!JSPhtml HYPERLINK /shan9liang/article/details/8693187 o view plain view plain HYPERLINK /shan9liang/arti

51、cle/details/8693187 o copy copy HYPERLINK /shan9liang/article/details/8693187 o print print HYPERLINK /shan9liang/article/details/8693187 o ? ?Inserttitlehere測試動態(tài)ActionFormusername:age:配置文件DyanActionForm類擴展了 ActionForm類。動態(tài)ActionForm支持在Struts配置文件中完成ActionForm的全部配置,無須編寫任何額外的JAVA代碼。 使用動態(tài) form, 沒有對應的類,所

52、以,如果需要擴展屬性,只需要再次配置文件中添加一個屬性就可以了html HYPERLINK /shan9liang/article/details/8693187 o view plain view plain HYPERLINK /shan9liang/article/details/8693187 o copy copy HYPERLINK /shan9liang/article/details/8693187 o print print HYPERLINK /shan9liang/article/details/8693187 o ? ?那么,在這個 action 里面,如何實現(xiàn)對動態(tài)

53、form 的調(diào)用 ? 同普通的ActionForm一樣,Action類和JSP都可以訪問動態(tài)ActionForm,而訪問方式也基本一致。訪問動態(tài)ActionForm與 訪問普通的ActionForm的最大區(qū)別在于對屬性的訪問方式不同。我們傳遞的是 DynaActionForm, 所以,在調(diào)用的時候,我們就要把 form 強制轉(zhuǎn)換成 DynaActionForm 對象。在標準的ActionForm中,針對每一個屬性都提供了getter和setter方法來讀取和設置屬性,而DynaActionForm把所有的屬性保存在一個Map 對象中,因此訪問DyanActionForm中的屬性與訪問Map對象

54、中的方法類似。Actionjava HYPERLINK /shan9liang/article/details/8693187 o view plain view plain HYPERLINK /shan9liang/article/details/8693187 o copy copy HYPERLINK /shan9liang/article/details/8693187 o print print HYPERLINK /shan9liang/article/details/8693187 o ? ?packagecom.jialin;importjavax.servlet.http.

55、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;importorg.apache.struts.action.DynaActionForm;publicclassTestActio

56、nextendsActionOverridepublicActionForwardexecute(ActionMappingmapping,ActionFormform,HttpServletRequestrequest,HttpServletResponseresponse)throwsExceptionDynaActionFormdaf=(DynaActionForm)form;Stringname=daf.getString(name);Integerage=(Integer)daf.get(age);System.out.println(name=+name);System.out.p

57、rintln(age=+age);returnmapping.findForward(showResult);動態(tài)ActionForm的表單驗證問題。DynaActionForm類的validate()方法沒有提供任何默認的驗證行為??梢酝ㄟ^定義擴 展DynaActionForm類的子類,然后覆蓋validate()方法,但是以編程方式來驗證動態(tài)ActionForm并不是一種理想的辦法。動態(tài) ActionForm的驗證應該使用Struts的Validator驗證插件。Validator插件允許采用特定的配置文件為動態(tài)的 ActionForm配置驗證規(guī)則,如檢查必須的輸入域,日期時間等。但這些驗

58、證我們一般都在客戶端js中完成。動態(tài)Action同樣有它的缺點:1、配置文件會增加,非常容易寫錯,而且錯誤不易發(fā)現(xiàn)。今天測試的時候,我就是把java.lang.String 寫成了java.long.String 在Action中拿到的form就是null,找了老半天才解決。所以采用動態(tài)action調(diào)試比較麻煩。2、靜態(tài)ActionForm能讓我們很清晰的了解表單數(shù)據(jù)信息,數(shù)據(jù)和對數(shù)據(jù)的操作是分離的,更容易讓人理解。呵呵,有利就有弊,平衡就好。 HYPERLINK /shan9liang/article/details/8694976 一口一口吃掉struts(七)ActionForward知

59、多少 通過前面幾篇的介紹,我們對ActionForward已經(jīng)不再陌生,這篇我們再進一步了解一下它。1、轉(zhuǎn)發(fā)or重定向ActionForward封裝轉(zhuǎn)向路徑,用來完成頁面的轉(zhuǎn)向。那它既然是轉(zhuǎn)向,到底是轉(zhuǎn)發(fā)還是重定向呢?可以通過配置文件來設置,加入redirect屬性,true重定向,false轉(zhuǎn)發(fā)。默認的情況下,actionForward采用的是轉(zhuǎn)發(fā)的方式進行頁面跳轉(zhuǎn)的。轉(zhuǎn)發(fā)和重定向的區(qū)別:轉(zhuǎn)發(fā)的時候,頁面的url地址不變,而重定向的時候頁面的url地址會發(fā)生變化。簡單說明一下原因,因為轉(zhuǎn)發(fā)的時候是采用的一 個request(請求),既然頁面跳轉(zhuǎn)前后是同一個request,頁面url當然不會變

60、了;而重定向采用的是2個request,頁面跳轉(zhuǎn)前后的 url當然會不同了。2、局部 or 全局先舉一個例子,在判斷是否已經(jīng)登錄的時候,登錄繼續(xù)訪問,沒有登錄跳轉(zhuǎn)到登錄界面,這個時候我們每個action都要配置,來struts接下來跳轉(zhuǎn)到哪里。如果有100個action,那豈不是這句話要寫100次。這里肯定要更簡潔的方式。我們在action標簽下配置的forward稱為局部forward,我們也可以配置全局forward 那么如果局部ActionForward和全局ActionForward同時出現(xiàn),到底是按照哪個配置進行頁面跳轉(zhuǎn)呢?采用的是就近原則,如果有局部ActionForward,就按

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論