




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
PAGE35客服管理系統(tǒng)開發(fā)教程本系統(tǒng)基于一公司客服管理系統(tǒng),適用于變頻器行業(yè)客服部使用。采納的技術(shù)為struts2hibernate3,開發(fā)環(huán)境為myeclipse10和mysql,本文檔僅為功能性說明,如需源碼及數(shù)據(jù)庫請(qǐng)聯(lián)系QQ1557281803網(wǎng)站效果演示1登陸2.更改密碼3。登陸后主頁面4。返修登記5。返修查詢6.?dāng)?shù)據(jù)分析7.辦事處頁面8.代理商頁面簡(jiǎn)略功能實(shí)現(xiàn)代碼經(jīng)典的MVC模式Struts1。x對(duì)MVC的實(shí)現(xiàn)Struts2(WebWork)的MVCStruts2的MVC架構(gòu)Struts2的主要組件組件作用FilterDispat(yī)cher起中央掌握器作用的過濾器Action處于Model層的Action,調(diào)用JavaBean實(shí)現(xiàn)業(yè)務(wù)規(guī)律struts.xml核心配置文件,配置有Action、Result等result和forward類似,轉(zhuǎn)發(fā)的目的地,支持多種視圖技術(shù)。Struts2的實(shí)例-登錄在MyEclipse環(huán)境中建立一個(gè)新的web工程,名稱“Struts2Login”,存放路徑“f:\Struts2Login”。在Struts2。0。11版本中找到war包struts2—blank—2.0.11。war,解開該war包,在WEB—INF/lib名目下復(fù)制出全部的jar包,這些jar包就是一個(gè)Struts2程序所需要的基礎(chǔ)jar包,把它們復(fù)制到新建的web工程的WEB—INF/lib名目中。在src名目下建立一個(gè)類,包名mypack,類名UserAction,其代碼如下:packagemypack;importcom。opensymphony.xwork2.ActionSupport;publicclassUserActionextendsActionSupport{?privateStringusername; privateStringuserpass;??publicStringgetUsername(){??returnusername; } publicvoidsetUsername(Stringusername){??this。username=username; }?publicStringgetUserpass(){? returnuserpass;?}?publicvoidsetUserpass(Stringuserpass){??this.userpass=userpass;?}?@Override?publicStringexecute()throwsException{ if("Mike".equals(username)&&”123".equals(userpass)? ??||"張三".equals(username)&&”abc".equals(userpass))???return”success";??else ? return”error";?}}?在src名目下建立Struts2的配置文件struts。xml,內(nèi)容如下:<?xmlversion="1.0"encoding="UTF-8"?〉<!DOCTYPEstrutsPUBLIC”—//ApacheSoftwareFoundation//DTDStrutsConfigurat(yī)ion2.0//EN””http://struts.apache。org/dtds/struts-2.0。dtd”〉<struts〉<!-—定義包管理配置的action繼承struts—default.xml中的配置——>?〈packagename="actions"extends="struts-default"><!—-定義Action(login。action)—-〉??<actionname=”login”class=”mypack.UserAction”>〈!——定義轉(zhuǎn)發(fā)路徑對(duì)應(yīng)的字符串名-—〉? ?〈resultname=”success">/Success.jsp</result> ??<resultname="error">/Error。jsp〈/result〉? </action〉?</package>〈/struts> 修改web.xml,在其中加入一個(gè)過濾器,過濾/*路徑.〈!—-過濾器類-—>〈filter〉<filter-name>struts2</filter-name><filter-class〉org.a(chǎn)pache。struts2.dispatcher。FilterDispat(yī)cher〈/filter-class〉</filter><!--過濾全部的url懇求—-><filter-mapping><filter-name>struts2</filter-name〉<url-pattern>/*</url-pattern〉〈/filter—mapping> 在webroot名目下編寫3個(gè)jsp頁面,index.jsp、Success.jsp和Error。jsp,注意這里把page指令中的pageEncoding設(shè)置為“utf—8”,就沒有中文問題了。index.jsp〈%@pagelanguage=”java”import="java.util.*”pageEncoding="utf-8"%〉<% Stringpath=request.getContextPath(); StringbasePath=request.getScheme()+"://" ??+request.getServerName()+":”+request.getServerPort() ??+path+”/";%><?。腛CTYPEHTMLPUBLIC"-//W3C//DTDHTML4。01Transitional//EN”><html〉?<head> <basehref=”<%=basePath%>”>??<title>MyJSP'index.jsp'startingpage〈/title〉?〈/head〉?〈body〉〈?。?提交到action—->? <formaction="login.a(chǎn)ction”method="post"> ??用戶名:〈!--參數(shù)名和action中的屬性名一樣--〉???〈inputtype=textname=username> ??<br〉 ?密&nbsp;&nbsp;碼: ? 〈inputtype=passwordname=userpass>???<br>???〈inputtype=submitname=submvalue="提交"〉???〈inputtype=resetname=resetvalue=”取消”〉??</form〉 </body></html>Success.jsp〈%@pagelanguage="java"import=”java。util。*"pageEncoding=”utf—8"%〉<%?Stringpath=request。getContextPath();?StringbasePat(yī)h=request.getScheme()+”://” ??+request.getServerName()+”:"+request。getServerPort()???+pat(yī)h+"/";%><?。模螩TYPEHTMLPUBLIC"—//W3C//DTDHTML4.01Transitional//EN”><html〉 <head>??〈basehref=”〈%=basePat(yī)h%>">??<title〉MyJSP’Success.jsp'startingpage</title>?</head>?<body>??<h1>? 歡迎???<%=request.getParameter("username")%>???,登錄??</h1>?</body></html>Error。jsp<%@pagelanguage="java"import=”java。util.*”pageEncoding=”utf—8”%〉<%?Stringpath=request。getContextPath();?StringbasePath=request.getScheme()+”://" ? +request。getServerName()+":"+request。getServerPort()? ?+path+”/";%><!DOCTYPEHTMLPUBLIC”-//W3C//DTDHTML4.01Transitional//EN”><html〉?<head>??<basehref="〈%=basePath%>"〉??<title>MyJSP'Error.jsp'startingpage〈/title〉?</head>?〈body>? 〈h1> ??用戶名或密碼錯(cuò)誤!??</h1〉?〈/body>〈/html>?把程序部署在myeclipse中運(yùn)行。圖1-2登陸頁面圖1-3更改密碼頁面Struts2的中文亂碼解決中文亂碼問題一般是指當(dāng)懇求參數(shù)有中文時(shí),無法在Action中得到正確的中文.Struts2中有2種方法可以解決這個(gè)問題:設(shè)置JSP頁面的pageEncoding="utf-8",就不會(huì)消滅中文亂碼;如果JSP頁面的pageEncoding="GBK”,那么需要修改struts。i18n。encoding=GBK,在struts。xml中加入如下語句進(jìn)行修改?!?xmlversion="1.0"encoding="UTF—8"?〉<!DOCTYPEstrutsPUBLIC”-//ApacheSoftwareFoundat(yī)ion//DTDStrutsConfigurat(yī)ion2.0//EN""http://struts.apache.org/dtds/struts-2.0。dtd”><struts〉〈constantname="struts。i18n。encoding”value=”GBK"/>?……〈/struts>?上面2種方法可以解決POST懇求中的中文參數(shù),但是GET懇求中的中文參數(shù)不能解決,GET懇求中的中文參數(shù)的亂碼需要通過修改Tomcat的server.xml文件來解決,修改如下內(nèi)容,加入URIEncoding=”GBK”:<Connectorport=”8080"……URIEncoding="GBK”/>Struts2的Action中訪問web對(duì)象Struts2的Action就是一個(gè)一般的POJO對(duì)象,它和Web對(duì)象request、response、session和applicat(yī)ion沒有耦合在一起,這樣便于單獨(dú)測(cè)試Action,那么我們?cè)贏ction中如何訪問這些web對(duì)象呢?訪問這些web內(nèi)部對(duì)象有2種方式:直接訪問Web對(duì)象Struts2框架供應(yīng)org.a(chǎn)pache.struts2。ServletActionContext幫助類來獲得web對(duì)象。HttpServletRequestrequest=ServletActionContext.getRequest();HttpServletResponseresponse=ServletActionContext.getResponse();HttpSessionsession=request.getSession();ServletContextapplication=ServletActionContext.getServletContext();Action訪問ActionContextcom。opensymphony。xwork2.ActionContext是一個(gè)Action執(zhí)行的上下文,Action執(zhí)行期間所用到的對(duì)象都保存在ActionContext中,例如session、參數(shù)等,并且ActionContext是一個(gè)局部線程變量,不用關(guān)注Action的線程平安。ActionContextcontext=ActionContext.getContext();該類的常用方法見表1-3所示:表1-3ActionContext中的常用方法Objectget(Objectkey)使用key來查找當(dāng)前ActionContext中的值MapgetApplicat(yī)ion()返回一個(gè)Application范圍的MapstaticActionContextgetContext()獲得當(dāng)前線程的ActionContext實(shí)例MapgetParameters()Map類型的全部HttpServletRequest的參數(shù)MapgetSession()Map類型的HttpSession值ValueStackgetValueStack()返回一個(gè)ValueStack類型OGNL值棧voidput(Objectkey,Objectvalue)向當(dāng)前ActionContext存入值,等于在HttpServletRequest中加入值voidsetApplication(Mapapplication)設(shè)置application上下文voidsetSession(Mapsession)設(shè)置session值,參數(shù)為Map實(shí)例?這種方法使用的全部對(duì)象和Web對(duì)象沒有直接聯(lián)系,所以在測(cè)試的時(shí)候也是很便利的,我們推舉在程序中使用此方法來訪問web對(duì)象。Action的分類繼承ActionSupport實(shí)現(xiàn)Action通過繼承ActionSupport來實(shí)現(xiàn)Action是我們的推舉做法,由于ActionSupport中供應(yīng)了輸入驗(yàn)證、國(guó)際化、execute等常用方法,使得編寫Action時(shí)代碼很簡(jiǎn)潔。packagemypack;importcom.opensymphony。xwork2.ActionSupport;publicclassHelloWo(hù)rldextendsActionSupport{?privateStringmessage;?publicStringgetMessage(){??returnmessage; }?publicvoidsetMessage(Stringmessage){??this。message=message;?}?@Override?publicStringexecute()throwsException{? //TODOAuto—generatedmethodstub ?message="大家好!”;? returnSUCCESS;?}} ActionSupport實(shí)現(xiàn)了Action接口,這個(gè)接口中定義了一些常量和execute方法。publicabstractinterfacecom.opensymphony。xwork2.Action{?//定義常量?publicstaticfinaljava。lang.StringSUCCESS="success”;?publicstaticfinaljava。lang.StringNONE=”none";?publicstaticfinaljava.lang.StringERROR="error";?publicstaticfinaljava.lang。StringINPUT="input"; publicstaticfinaljava.lang。StringLOGIN=”login";?//定義抽象方法?publicabstractjava.lang.Stringexecute()throwsException;} ActionSupport類的代碼部分內(nèi)容如下:publicclasscom。opensymphony.xwork2.ActionSupportimplementscom。opensymphony。xwork2.Action,com.opensymphony。xwork2。Validateable,com。opensymphony.xwork2.ValidationAware,com。opensymphony.xwork2.TextProvider,com.opensymphony.xwork2。LocaleProvider,java.io.Serializable{ 。。..。.?//添加字段特別?publicvoidaddFieldError(java.lang.StringfieldName,java.lang.StringerrorMessage){} //execute?publicStringexecute()throwsException{}//輸入驗(yàn)證?publicvoidvalidate(){}?......}?struts。xml的配置如下:〈?xmlversion="1.0”encoding="UTF-8"?><?。模螩TYPEstrutsPUBLIC”-//ApacheSoftwareFoundation//DTDStrutsConfiguration2。0//EN""http://struts.apache.org/dtds/struts-2.0.dtd"><struts〉?<packagename="actions”extends=”struts-default”> ?<actionname="hello”class="mypack.HelloWorld"〉 ??<result>/Success。jsp</result>??〈/action> </package〉</struts>模型驅(qū)動(dòng)(ModelDriven)的ActionStruts2的Action屬于MVC模型層,Action中的方法代表業(yè)務(wù)規(guī)律,Action中的屬性代表懇求中的參數(shù),當(dāng)頁面懇求參數(shù)較多的時(shí)候,把過多的參數(shù)對(duì)象的屬性定義在Action中不太符合Struts所提倡的松耦合原則,所以我們推舉單獨(dú)用JavaBean來封裝參數(shù),在Action中為JavaBean賦值,這就是ModelDriven的Action。模型驅(qū)動(dòng)的Action要求Action實(shí)現(xiàn)ModelDriven接口,假如登錄頁面需要傳輸參數(shù)username和userpass,我們把這2個(gè)參數(shù)封裝在一個(gè)數(shù)據(jù)的JavaBean中,然后在Action中定義該JavaBean為Model即可,代碼如下:Userinfo.javapackagepo;//用戶名和密碼的封裝對(duì)象publicclassUserinfo{?privateStringusername;?privateStringuserpass;?publicStringgetUsername(){??returnusername;?}?publicvoidsetUsername(Stringusername){??this.username=username;?}?publicStringgetUserpass(){ ?returnuserpass;?}?publicvoidsetUserpass(Stringuserpass){ ?this.userpass=userpass; }?}UserAction。javapackageaction;importpo。Userinfo;importcom.opensymphony.xwork2.ActionSupport;importcom。opensymphony.xwork2。ModelDriven;publicclassUserActionextendsActionSupportimplementsModelDriven<Userinfo>{privateUserinfomodel=newUserinfo();?@Override publicStringexecute()throwsException{??//TODOAuto-generatedmethodstub??returnSUCCESS; }//返回模型對(duì)象的實(shí)例?publicUserinfogetModel(){??//TODOAuto—generatedmethodstub ?returnmodel;?}}?當(dāng)懇求該Action的時(shí)候,懇求中的參數(shù)會(huì)自動(dòng)填充到模型Userinfo的屬性中,當(dāng)然需要參數(shù)名和屬性名一樣,到跳轉(zhuǎn)的頁面上利用Struts2標(biāo)簽〈s:propertyvalue=”username"/〉可以取出模型Userinfo中的屬性u(píng)sername。在ModelDriven接口中的方法getModel()必須實(shí)現(xiàn),通過它告知系統(tǒng)模型的簡(jiǎn)略對(duì)象是什么。struts.xml<?xmlversion="1.0"encoding=”UTF-8"?〉<!DOCTYPEstrutsPUBLIC"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN""http://struts.apache.org/dtds/struts-2.0.dtd"><struts〉?<packagename="actions"extends="struts—default”>??<actionname=”user"class="action。UserAction"> ??<result>/new。jsp〈/result>? </action>?</package〉</struts〉new。jsp〈%@pagelanguage="java"import=”java.util。*”pageEncoding="utf-8"%〉<%@tagliburi="/struts—tags"prefix=”s"%><%?Stringpath=request.getContextPat(yī)h();?StringbasePat(yī)h=request。getScheme()+”://" ? +request.getServerName()+":"+request。getServerPort()???+pat(yī)h+"/";%><!DOCTYPEHTMLPUBLIC”—//W3C//DTDHTML4。01Transitional//EN"><html〉 <head〉 ?<basehref="<%=basePath%>”〉 ?〈title>MyJSP'new.jsp'startingpage</title>?</head>?<body〉??username:〈s:propertyvalue="username”/>?</body〉</html>多方法的ActionA(yù)ction中的方法代表業(yè)務(wù)規(guī)律,那么一個(gè)模塊中的多個(gè)業(yè)務(wù)規(guī)律如何用Action來處理呢?我們有2種方法來處理這個(gè)問題:一個(gè)Action對(duì)應(yīng)一個(gè)業(yè)務(wù)規(guī)律,實(shí)現(xiàn)便利,但是Action數(shù)量多,struts.xml中需要配置的內(nèi)容也多,這種方法不推舉;一個(gè)Action對(duì)應(yīng)多個(gè)業(yè)務(wù)規(guī)律,例如表的CRUD操作,含有多個(gè)業(yè)務(wù)規(guī)律,我們只寫一個(gè)Action來實(shí)現(xiàn),Action的數(shù)量沒有增加,struts。xml的配置也簡(jiǎn)潔,所以這種方法是我們推舉的做法。Action中自定義方法的聲明和execute方法一樣,方法的調(diào)用路徑為“Action名稱!方法名稱。action”.publicString方法名()throwsException{} 以用戶表Userinfo的CRUD操作為例,看一下多方法Action的代碼:packageaction;importpo.Userinfo;importservice.UserService;importcom.opensymphony.xwork2。ActionContext;importcom。opensymphony.xwork2.ActionSupport;importcom.opensymphony。xwork2.ModelDriven;publicclassCrudUserActionextendsActionSupportimplementsModelDriven<Userinfo〉{?//crud業(yè)務(wù)方法 privateUserServiceuserservice=newUserService();privateUserinfouserinfo=newUserinfo();?//模型對(duì)象userinfo?publicUserinfogetModel(){??//TODOAuto-generat(yī)edmethodstub??returnuserinfo; }?//增加?publicStringcreate()throwsException{??userservice.createUser(userinfo); ?returnSUCCESS;?}?//查詢?publicStringretrive()throwsException{??//查詢結(jié)果放在request中 ActionContext.getContext().put("userlist”,userservice.selectUsers());?return"list";?}?//修改?publicStringupdate()throwsException{? userservice.updat(yī)eUser(userinfo); ?returnSUCCESS;?} //刪除?publicStringdelete()throwsException{??userservice。deleteUser(userinfo.getUsername()); ?returnSUCCESS;?} //默認(rèn)的execute?publicStringexecute()throwsException{ ?returnSUCCESS;?}}?在struts。xml中配置如下:<?xmlversion="1.0”encoding=”UTF—8"?><!DOCTYPEstrutsPUBLIC"-//ApacheSoftwareFoundat(yī)ion//DTDStrutsConfigurat(yī)ion2.0//EN""http://struts.a(chǎn)pache。org/dtds/struts-2。0.dtd”〉<struts〉?<pac="actions"extends="struts-default”>??〈actio="CrudUser”class="action.CrudUserAction">???<result〉/Success.jsp</result><resultname="list"〉/UserList.jsp</result〉??</action>?〈/package〉〈/struts>?調(diào)用CRUD業(yè)務(wù)規(guī)律的懇求路徑見表2—1。表2-1多方法Action中每個(gè)方法的懇求路徑業(yè)務(wù)規(guī)律方法懇求路徑creat(yī)e()CrudUser!create.actionretrive()CrudUser!retrive。actionupdate()CrudUser?。鮬date。actiondelete()CrudUser!delete.actionexecute()CrudUser。actionResult類型Action中表示跳轉(zhuǎn)的目的地使用了在struts.xml配置的字符串,格式為:<resul="”type=””></result〉,type可以有多種選擇,Struts2支持各種視圖技術(shù),例如JSP、JSF、XML等,默認(rèn)的是JSP。常見的type類型配置如下:dispatcher轉(zhuǎn)發(fā)到JSP頁面,和〈jsp:forwardpage="”/>的效果一樣,是默認(rèn)類型?!磖esult>/Success.jsp</result><resultname=”a”>/Success.jsp〈/result><resultname=”b”type=”dispat(yī)cher">/Success.jsp</result>redirect重定向到JSP頁面,和response.sendRedirect(“”)的效果一樣.<resultname=”a”type=”redirect”〉/Success.jsp</result>redirect-action重定向到action,目的地為Action,配置時(shí)可以指定如下兩個(gè)參數(shù):actionName—重定向的Action名;namespace-重定向的Action所在的命名空間。<resultname=”a”type="redirect—action”><paramname=”actionName">myaction</param〉<par="namespace”〉/test</param〉</result>chain轉(zhuǎn)發(fā)到action,形成action—chain,可以指定兩個(gè)參數(shù):actionName-重定向的Action名;namespace—重定向的Action所在的命名空間?!磖esulttype=”chain"><paramname=”actionName”>myaction</param><paramname=”namespace”>/test</param〉</result>stream用于向頁面返回一個(gè)InputStream,原始數(shù)據(jù)直接傳遞給HttpServletResponse,這種結(jié)果類型在用戶下載文件(例如PDF文件等)等情況下格外有意義。<resultname=”success"type="stream">〈paramname=”contentType”〉image/jpg</param〉〈paramname=”inputName”>imageStream〈/param〉<paramname=”contentDisposition">filename=”document。pdf"</param〉<paramname="buffersize”>1024</param>〈/result>plaintext用于輸出目的地JSP/HTML的源代碼內(nèi)容,可以指定兩個(gè)參數(shù):location-目的地JSP/HTML,charSet—輸出內(nèi)容時(shí)使用的字符集。<resultname=”success”type=”plaintext"〉〈paramname="locat(yī)ion"〉/Success.jsp</param><paramname=”charset”>utf-8</param></result>?除了上述類型以外,還支持如下的類型:chart:用于整合JFreeChart的result類型;freemarker:用于整合FreeMarker的result類型;httpheader:用于處理特殊http行為的result類型;jasper:用于整合JasperReport的result類型;jsf:用于整合JSF的result類型;titles:用于整合Titles的result類型;velocity:用于整合Velocity的result類型;xslt:用于整合XML/XSLT的result類型。這些視圖技術(shù)的支持,有些還需要導(dǎo)入相應(yīng)的插件包,即Struts2供應(yīng)的含有plugin字樣的jar包.輸入驗(yàn)證javaScript客戶端驗(yàn)證validate方法驗(yàn)證在Action中加入validate驗(yàn)證方法,把添加和修改時(shí)驗(yàn)證分開,添加用戶時(shí)驗(yàn)證方法為validateCreate(),修改用戶時(shí)的驗(yàn)證方法為validat(yī)eUpdate()。packageaction;importjavax.servlet.http。HttpServletRequest;importorg.a(chǎn)pache。struts2.ServletActionContext;importoper.UserOper;importpo。Userinfo;importcom。opensymphony.xwork2.ActionContext;importcom。opensymphony.xwork2。ActionSupport;importcom。opensymphony.xwork2.ModelDriven;publicclassUserActionextendsActionSupportimplementsModelDriven<Userinfo〉{?//數(shù)據(jù)模型?privateUserinfouser=newUserinfo();?//業(yè)務(wù)類 privateUserOperuo=newUserOper();?publicUserinfogetModel(){??//TODOAuto-generatedmethodstub ?returnuser;?}?//增加前?publicStringprecreate()throwsException{? return"addupdate”;?}?//增加?publicStringcreate()throwsException{??uo.create(user);? returnselect();?} //刪除 publicStringdelete()throwsException{??uo.delete(user.getUserid());??returnselect();?} //修改 publicStringupdate()throwsException{??uo.update(user);??returnselect();?}?//查詢?publicStringselect()throwsException{ ?ActionContext.getContext().put("userlist",uo。retriveAll());? returnSUCCESS;?} //查詢單個(gè)?publicStringretrive()throwsException{??Userinfomyuser=uo.retriveOne(user.getUserid());? user.setUsername(myuser.getUsername()); ?user.setUserpass(myuser。getUserpass()); ?user.setSex(myuser.getSex()); user.setSfz(myuser.getSfz());? user。setBirthday(myuser.getBirthday());??user.setWorktime(myuser.getWo(hù)rktime());??user.setEmail(myuser。getEmail());??user。setInterest(myuser。getInterest());??user.setIntro(myuser.getIntro());??user。setXl(myuser.getXl());? return"addupdat(yī)e”;?}?//驗(yàn)證方法?//增加時(shí)驗(yàn)證?publicvoidvalidateCreate(){? checkForm(); //用戶名是否存在 if(uo.checkU(xiǎn)serName(user.getUsername()))???this.addFieldError("username","用戶名已經(jīng)被占用");?} //修改時(shí)驗(yàn)證?publicvoidvalidat(yī)eUpdate(){??checkForm();??if(uo。checkU(xiǎn)serName(user。getUsername(),user.getUserid()))? ?this.a(chǎn)ddFieldError("username",”用戶名已經(jīng)被占用");?} //驗(yàn)證要求?publicvoidcheckForm(){??HttpServletRequestrequest=ServletActionContext。getRequest();? //用戶名不能為空 ?if(user.getUsername()==null||user。getUsername().equals(””))???this。addFieldError(”username”,”用戶名不能為空");??//密碼不能為空 ?if(user。getUserpass()==null||user.getUsername().equals(”"))???this。addFieldError("userpass”,"密碼不能為空"); ?//2次密碼相同? elseif(!user.getUserpass()。equals(request.getParameter(”userpass1")))?? this.addFieldError("userpass","2次密碼不一樣");??//身份證不能為空??if(user.getSfz()==null||user.getSfz()。equals(""))???this.addFieldError("sfz”,"身份證不能為空");??//身份證必須是15或18位??elseif(!user.getSfz().matches("^\\d{17}[\\d|X]|\\d{15}$”))???this.a(chǎn)ddFieldError("sfz","身份證必須是15位或18位");??//email不能為空 ?if(user.getEmail()==null||user.getEmail().equals(”"))???this。addFieldError(”email",”Email不能為空"); ?elseif(!user.getEmail()。matches(”^\\w+@\\w+(\\.\\w+)+$"))???this.a(chǎn)ddFieldError(”email”,"Email格式錯(cuò)誤”); ?//生日不能為空 ?if(user。getBirthday()==null)???this。addFieldError("birthday”,"生日不能為空");??//愛好至少選一項(xiàng)??if(user.getInterest()==null)???this。addFieldError(”interest”,"愛好至少選一項(xiàng)");? //工作年限1—100之間??if(user.getWorktime()〈1||user.getWorktime()>100)? this.addFieldError("worktime",”工作年限必須在1-100之間");??//簡(jiǎn)介不能為空??if(user.getIntro()==null||user。getIntro()。equals("”))???this。addFieldError(”intro”,"簡(jiǎn)介不能為空");?}}Struts.xml中增加了驗(yàn)證出錯(cuò)時(shí)跳轉(zhuǎn)到的頁面〈resultname=”input”>〈/result〉.〈?xmlversion="1。0"encoding="UTF-8"?〉<!DOCTYPEstrutsPUBLIC"—//ApacheSoftwareFoundat(yī)ion//DTDStrutsConfigurat(yī)ion2。0//EN""http://struts.apach/dtds/struts-2.0.dtd"〉〈struts>〈!—-懇求參數(shù)的中文處理-—>〈constantname=”struts.i18n。encoding”value="GBK"/><!--修改后的xml自動(dòng)加載--〉〈constantname="struts。configuration.xml。reload”value="true"/>?〈packagename="actions”extends="struts—default">? 〈actionname="user"class="action。UserAction”〉??<result>/UserList.jsp</result>??<resultname="addupdate">/AddUpdat(yī)e。jsp</result〉 ?<resultname=”input”>/AddUpdate.jsp</result〉??</action> 〈/package〉〈/struts>validate框架(xml)驗(yàn)證為了使用Struts2的框架驗(yàn)證文件進(jìn)行輸入驗(yàn)證,需要建立一個(gè)特定的驗(yàn)證規(guī)章文件,該文件是一個(gè)XML格式配置文件,文件命名規(guī)章為<Action類名-validation.xml>,保存在Action實(shí)現(xiàn)類相同的名目下,如果是多方法Action,需要使用Action的別名配置(每個(gè)方法映射為不同的Action別名,可以使用通配符),每個(gè)方法的驗(yàn)證文件名為〈Action類名—?jiǎng)e名—validation.xml>。這個(gè)例子中的驗(yàn)證文件的名字為:StuAction—validation.xml?!?xmlversion=”1.0”encoding=”UTF-8”?>〈!DOCTYPEvalidatorsPUBLIC”-//OpenSymphonyGroup//XWorkValidator1。0.2//EN""http://www.opensymphony。com/xwork/xwork—validator—1.0。2。dtd”>〈!——驗(yàn)證規(guī)章定義根元素-—><validators>?〈!--第一個(gè)驗(yàn)證字段:姓名name--〉 〈fieldname="name"〉??<!—-驗(yàn)證規(guī)章:非空(系統(tǒng)預(yù)先定義好的規(guī)章)—->??〈field-validatortype="requiredstring"〉???〈!--錯(cuò)誤提示—->???<message>姓名不能為空</message>??</field—validator>??〈!--驗(yàn)證規(guī)章:長(zhǎng)度在5—10之間(系統(tǒng)預(yù)先定義好的規(guī)章)--〉 <field—validat(yī)ortype=”stringlength">? 〈="minLength">5</param〉 ? 〈paramname="maxLength">10</param〉???<!--錯(cuò)誤提示—-〉???〈message〉姓名長(zhǎng)度必須在${minLength}-${maxLength}個(gè)字符之間</message>??〈/field—validator〉?</field>?<!--其次個(gè)驗(yàn)證字段:年齡age-->?<fieldname=”age">??〈field—validatortype="conversion"short-circuit="true”>?? 〈!—-錯(cuò)誤提示-—>???<message〉必須輸入整數(shù)〈/message>?</field-validator> ?<field-validatortype="int"> ?<paramname="min">20</param> ? 〈paramname="max”>35</param>? ?〈!-—錯(cuò)誤提示—-> ??<message>年齡必須在${min}-${max}之間</message>??</field-validator>?</field>?<!—-第三個(gè)驗(yàn)證字段:分?jǐn)?shù)mark-—〉?<fiel="mark">?〈field-validatortype="conversion"short-circuit=”true"〉???<!-—錯(cuò)誤提示--〉???〈message>必須輸入數(shù)字</message>??</field-validator> ?〈field-validat(yī)ortype="double"〉 ??<paramname="minInclusive">50〈/param>???〈paramname=”maxInclusive”〉100</param>? ?<!——錯(cuò)誤提示-->???<message>分?jǐn)?shù)必須在${minInclusive}-${maxInclusive}之間〈/message>? </field-validator> </field>?<!——第三個(gè)驗(yàn)證字段:入學(xué)時(shí)間enrolltime--〉?<fieldname=”enrolltime">?<field-validatortype=”conversion”short-circuit="true">? ?〈!——錯(cuò)誤提示—->? ?<message>必須是日期格式</message>??</field-validator>?〈field-validatortype="required">???<!-—錯(cuò)誤提示-—>???〈message>入學(xué)時(shí)間不能為空〈/message〉??</field—validator>??<field—validat(yī)ortype="dat(yī)e”>?? <paramname="min”>1990-01-01</param〉? ?<paramname="max”>2008-10-09</param〉???〈!--錯(cuò)誤提示-->?? <message>入學(xué)時(shí)間必須在${min}到${max}之間</message>??</field-validator> </field></validators>?上述驗(yàn)證文件中,short-circuit屬性為true表示發(fā)生驗(yàn)證錯(cuò)誤的時(shí)候,后續(xù)驗(yàn)證不再執(zhí)行,即“短路”.Action的局部資源文件StuAction.properties做如下修改,這樣當(dāng)數(shù)據(jù)類型轉(zhuǎn)換特別的時(shí)候由驗(yàn)證框架文件來給出錯(cuò)誤提示,而基本標(biāo)簽的提示指定為空,不然會(huì)消滅重復(fù)提示:invalid.fieldvalue。age=invalid.fieldvalue。mark=invalid。fieldvalue.enrolltime=Strut2的國(guó)際化在struts.xml中配置struts。custom。i18n。resources常量〈constantname=”struts.custom.i18n。resources”value="globalMessages"/〉在src名目下建立中文和英文的資源文件,中文資源文件globalMessages_zh_CN.properties的內(nèi)容如下:username=用戶名userpass=密碼success=登錄成功error=登錄失?。欤飃in=登錄?使用native2ascii工具把該文件轉(zhuǎn)換為unicode編碼。英文資源文件globalMessages_en.properties的內(nèi)容如下:username=UserNameuserpass=Passwordsuccess=Welcomee(cuò)rror=Sorry!Youcannotloginlogin=Login編寫登錄頁面Login。jsp,其內(nèi)容如下:〈%@pagelanguage=”java"import="java。util.*"pageEncoding=”utf—8"%>〈%@tagliburi=”/struts-tags"prefix=”s"%><%?Stringpath=request.getContextPath();?StringbasePath=request.getScheme()+"://"?? +request.getServerName()+":"+request.getServerPort()???+path+"/";%〉〈!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4。01Transitional//EN"><html>?〈head>??<basehref=”<%=basePath%〉">??<title>MyJSP’Login.jsp'startingpage〈/title>?</head>?<body〉?〈s:formaction="dologin”>?<s:textfieldname=”username”key="username"/>?〈s:passwordname="userpass"key="userpass"/〉?<s:submitkey=”login"/>?</s:form〉 〈/body>〈/html>?登錄成功頁面Success。jsp內(nèi)容如下:<%@pagelanguage="java”import="java.util.*"pageEncoding="utf-8"%>〈%@tagliburi="/struts—tags”prefix="s"%〉<%?Stringpath=request.getContextPat(yī)h();?StringbasePath=request.getScheme()+"://" ?+request.getServerName()+":"+request.getServerPort()???+path+”/";%>〈!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN"〉〈html>?<head> ?<basehref="<%=basePath%〉">? <title〉MyJSP’Success。jsp’startingpage〈/title>?〈/head〉?<body>?<s:propertyvalue="username"/〉?〈s:textname="success"/>?</body〉</html>?登錄失敗頁面Error.jsp內(nèi)容如下:〈%@pagelanguage="java”import=”java。util.*"pageEncoding="utf—8”%〉<%@tagliburi=”/struts-tags"prefix="s"%><% Stringpath=request。getContextPath();?StringbasePath=request.getScheme()+”://"???+request。getServerName()+":"+request。getServerPort()???+path+"/”;%〉〈!DOCTYPEHTMLPUBLIC”-//W3C//DTDHTML4.01Transitional//EN"〉<html> <head〉? <basehref=”<%=basePath%〉”>??〈title>MyJSP'Error.jsp’startingpage〈/title〉?</head>?<body〉 <s:textname="error”></s:text〉 〈/body〉〈/html>?上述頁面中的Struts2標(biāo)簽都可以訪問資源文件,表單標(biāo)簽〈s:textfieldname=””key=””/〉中的屬性key用于訪問資源文件,<s:textname=””/>標(biāo)簽中的name屬性用于訪問資源文件。標(biāo)簽庫和OGNL在jsp頁面中使用標(biāo)簽庫指令引入后<%tagliburi="/struts—tags”prefix=”s”%〉,就可以使用全部的Struts2標(biāo)簽了。Struts2攔截器 攔截器(interceptor)是Struts2框架核心組成部分。很多功能都是構(gòu)建在攔截器基礎(chǔ)之上的,例如文件的上傳和下載、國(guó)際化、數(shù)據(jù)類型轉(zhuǎn)換和數(shù)據(jù)有效性驗(yàn)證等,Struts2利用內(nèi)建的攔截器,完成了框架內(nèi)的大部分操作。攔截器就是動(dòng)態(tài)攔截Action調(diào)用的對(duì)象。它供應(yīng)了一種機(jī)制,使開發(fā)者可以定義一個(gè)特定的功能模塊,這個(gè)模塊可以在Action執(zhí)行之前或之后運(yùn)行,也可以在一個(gè)Action執(zhí)行之前阻止Action執(zhí)行。同時(shí)也供應(yīng)了一種可以提取Action中可重用部分的方式。Struts2框架的Action被一個(gè)或者多個(gè)攔截器(攔截器棧)所包圍,全部的用戶懇求都會(huì)被攔截器所攔截,然后交給Action處理,處理結(jié)果以規(guī)律視圖的方式返回給用戶。而這個(gè)調(diào)用的執(zhí)行流程,是由Strut2的配置文件(struts.xml)來實(shí)現(xiàn)的。在前面幾章中,沒有明確說明攔截器,為什么可以直接調(diào)用Action呢?那是由于在Struts2框架中如果沒有顯式的攔截器配置,則系統(tǒng)會(huì)調(diào)用默認(rèn)的攔截器來調(diào)用Action,在用戶看來,似乎沒有配置攔截器一樣.演示一個(gè)簡(jiǎn)潔攔截器的開發(fā):HelloWorld攔截器。假設(shè)我們需要實(shí)現(xiàn)這么一個(gè)功能,在調(diào)用每個(gè)Action之前都能在掌握臺(tái)打印出“HelloWorld".這樣的一個(gè)功能使用Struts2攔截器來實(shí)現(xiàn)最簡(jiǎn)潔。下面介紹一個(gè)簡(jiǎn)略的實(shí)現(xiàn)步驟。建立一個(gè)Action類MyAction。java和配置文件Struts。xml;MyAction。javapackageaction;importcom.opensymphony。xwork2.ActionSupport;publicclassMyActionextendsActionSupport{?page;//年齡?publicintgetAge(){??returnage;?}?publicvoidsetAge(intage){??this.age=age;?}?@Override publicStringexecute()throwsException{??//TODOAuto—generatedmethodstub? System。out。println("Actionexecute.。。。.。");? returnSUCCESS;?}}struts.xml<?xmlversion="1.0”encoding="UTF-8”?><!DOCTYPEstrutsPUBLIC”—//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN”"http://struts.apache。org/dtds/struts-2.0.dtd"〉〈struts〉〈packagename="action”extends="struts-default"〉<actionname=”test”class="action.MyAction”〉<result〉Success.jsp</result>〈/action〉〈/package〉〈/struts>建立一個(gè)攔截器類HelloWorldInterceptor.java,其代碼如下;packageinterceptor;importaction.MyAction;importcom.opensymphony.xwork2.ActionInvocation;importcom。opensymphony.xwork2。interceptor。AbstractInterceptor;publicclassHelloWorldInterceptorextendsAbstractInterceptor{//攔截方法?@Override publicStringintercept(ActionInvocationarg0)throwsException{? //獲得被調(diào)用的Action類? Objectaction=arg0。getAction();??//打?。萫lloWo(hù)rld??System.out.println("攔截器信息:HelloWorld!");??//執(zhí)行Action或調(diào)用下一個(gè)攔截器 ?Stringresult=arg0.invoke();??//執(zhí)行完action后提示??System。out.println(”Action執(zhí)行完畢!”);??returnresult;?}}在struts.xml中加入攔截器的配置,見struts.xml內(nèi)容;<?xmlversion="1.0"encoding="UTF-8”?>〈!DOCTYPEstrutsPUBLIC"-//ApacheSoftwareFoundat(yī)ion//DTDStrutsConfigurat(yī)ion2。0//EN""http://struts。apach/dtds/struts—2.0.dtd”〉<struts><packag="action”extends="struts—default"〉〈!--定義攔截器-—>?〈interceptors〉?〈interceptorname="helloworld"class="interceptor.HelloWorldInterceptor"/>?</interceptors><actionname="test”class=”action.MyAction”〉<result>Success。jsp</result〉<!——action中引用攔截器——><interceptor-refname="helloworld”/>〈/action>〈/package〉〈/struts>編寫JSP頁面Success.jsp.<%@pagelanguage="java"import="java.util.*"pageEncoding="utf-8”%〉<%@tagliburi=”/struts-tags"prefix="s"%〉<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN”〉<html〉<head><title〉MyJSP'Success。jsp’startingpage〈/title>〈/head>〈body><h1〉調(diào)用成功〈/h1><s:propertyvalue="age”/></body></html〉運(yùn)行該web程序,在地址欄輸入HYPERLINK”http://localhost:8080/hw/test.a(chǎn)ction?age=35"http://localhost:8080/hw/test。action?age=35從圖4—1我們可以看到,程序的運(yùn)行有錯(cuò)誤,就是參數(shù)age的值沒有填充到Action的屬性age中,所以頁面上顯示age就是0,那么這是為什么呢?是由于參數(shù)的值填充到名稱相同的屬性中這個(gè)過程也是依靠攔截器實(shí)現(xiàn)的,但是我們一旦在action中引用了自己定義的攔截器,那么系統(tǒng)默認(rèn)的攔截器就沒有了,所以我們只要在struts.xml的配置中讓Action引用默認(rèn)攔截器就正確了,默認(rèn)攔截器是通過<package…extends="struts-default”></package〉中的extends引入的,修改后的struts.xml如下?!矗縳mlversion=”1.0”encoding="UTF—8”?><!DOCTYPEstrutsPUBLIC"—//ApacheSoftwareFoundat(yī)ion//DTDStrutsConfigurat(yī)ion2。0//EN""http://struts.apache。org/dtds/struts-2.0。dtd"><struts>?〈packagename="action"extends=”struts—default"〉 ?〈!-—定義攔截器——> ?〈interceptors>?? <interceptorname="helloworld"????class=”interceptor。HelloWorldInterceptor"/>??〈/interceptors>??<actionname="test"class="action。MyAction”>???<result>Success.jsp</result〉?? 〈!—-action中引用默認(rèn)攔截器—->???<interceptor-refname="defaultStack"/〉? <!-—action中引用攔截器—->???<interceptor-refname="helloworld"/> 〈/action>?</package></struts>攔截器應(yīng)用實(shí)例—文件上傳和下載Struts2框架默認(rèn)使用Common—fileUpload組件實(shí)現(xiàn)文件上傳,該組件將解析出HttpServletRequest懇求中的文件域信息,并使用IO流方式,將文件保存在服務(wù)器的指定位置。Struts2框架中本身不帶有Common-fileUpload組件的jar包,需要自己下載后放在web程序的WEB-INF/lib名目中,需要2個(gè)jar包,一個(gè)是commons-fileupload—1.2.1。jar,可從網(wǎng)址http://jakarta.apache.org/commons/fileupload下載,另一個(gè)是commons—io-1.4.jar,可從網(wǎng)址http://jakarta.apache。org/commons/io/。文件上傳上傳單個(gè)文件的JSP頁面代碼如下:<%@pagelanguage="java”import="java。util.*"pageEncoding="utf-8"%〉〈%@tagliburi="/struts-tags"prefix="s"%><!DOCTYPEHTMLPUBLIC”-//W3C//DTDHTML4.01Transitional//EN"〉〈html><head〉<title〉MyJSP’index。jsp'startingpage</title></head><body><s:formaction=”fileupload”method="post"enctype=”multipart/form-dat(yī)a”〉上傳文件:<s:filename="doc"/><br><s:submitvalue="上傳”/>〈/s:form></body></html>form表單的enctype屬性設(shè)置為multipart/form—data。enctype用來指定表單數(shù)據(jù)的編碼方式,有如下3個(gè)值。application/x-www-form-
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年歷史化學(xué)中考真題及答案
- 濰坊化工模擬面試題目及答案
- 2025保險(xiǎn)學(xué)考試真題及答案
- 基礎(chǔ)醫(yī)學(xué)考試試題及答案
- 2025白酒品酒師考試真題及答案
- 2025八下政治考試真題及答案
- 醫(yī)學(xué)考研真題分類及答案
- 創(chuàng)新糞污處理模式的策略及實(shí)施路徑
- ESP功能數(shù)字人系統(tǒng)在生理學(xué)教學(xué)中的應(yīng)用
- 2024年石首市檢察系統(tǒng)考試真題
- 法國(guó)文學(xué)課件
- 2025年學(xué)歷提升-成人高考-專升本-成人高考專升本(法學(xué)類)歷年參考題庫含答案解析(5套)
- 2025年止血技術(shù)理論知識(shí)考試試題及答案
- ECMO護(hù)理進(jìn)修匯報(bào)
- 2025年(完整版)(高級(jí))政工師理論考試題庫與答案
- 首鋼職務(wù)職級(jí)管理辦法
- 建筑施工職業(yè)健康與安全防護(hù)指南
- 2025國(guó)家保安員資格考試題庫及答案
- 2025年黑龍江省齊齊哈爾市中考英語試卷
- 跨境電商股權(quán)分配協(xié)議范文
- 2025年深圳中考化學(xué)試卷真題(含答案)
評(píng)論
0/150
提交評(píng)論