版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
PAGE35客服管理系统开发教程本系统基于一公司客服管理系统,适用于变频器行业客服部使用。采纳的技术为struts2hibernate3,开发环境为myeclipse10和mysql,本文档仅为功能性说明,如需源码及数据库请联系QQ1557281803网站效果演示1登陆2.更改密码3。登陆后主页面4。返修登记5。返修查询6.数据分析7.办事处页面8.代理商页面简略功能实现代码经典的MVC模式Struts1。x对MVC的实现Struts2(WebWork)的MVCStruts2的MVC架构Struts2的主要组件组件作用FilterDispatcher起中央掌握器作用的过滤器Action处于Model层的Action,调用JavaBean实现业务规律struts.xml核心配置文件,配置有Action、Result等result和forward类似,转发的目的地,支持多种视图技术。Struts2的实例-登录在MyEclipse环境中建立一个新的web工程,名称“Struts2Login”,存放路径“f:\Struts2Login”。在Struts2。0。11版本中找到war包struts2—blank—2.0.11。war,解开该war包,在WEB—INF/lib名目下复制出全部的jar包,这些jar包就是一个Struts2程序所需要的基础jar包,把它们复制到新建的web工程的WEB—INF/lib名目中。在src名目下建立一个类,包名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,内容如下:<?xmlversion="1.0"encoding="UTF-8"?〉<!DOCTYPEstrutsPUBLIC”—//ApacheSoftwareFoundation//DTDStrutsConfiguration2.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”>〈!——定义转发路径对应的字符串名-—〉ﻩ ﻩ〈resultname=”success">/Success.jsp</result> ﻩﻩ<resultname="error">/Error。jsp〈/result〉ﻩ </action〉ﻩ</package>〈/struts> 修改web.xml,在其中加入一个过滤器,过滤/*路径.〈!—-过滤器类-—>〈filter〉<filter-name>struts2</filter-name><filter-class〉org.apache。struts2.dispatcher。FilterDispatcher〈/filter-class〉</filter><!--过滤全部的url恳求—-><filter-mapping><filter-name>struts2</filter-name〉<url-pattern>/*</url-pattern〉〈/filter—mapping> 在webroot名目下编写3个jsp页面,index.jsp、Success.jsp和Error。jsp,注意这里把page指令中的pageEncoding设置为“utf—8”,就没有中文问题了。index.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'index.jsp'startingpage〈/title〉ﻩ〈/head〉ﻩ〈body〉〈!--提交到action—->ﻩ <formaction="login.action”method="post"> ﻩﻩ用户名:〈!--参数名和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();ﻩ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>ﻩﻩ<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> ﻩﻩ用户名或密码错误!ﻩﻩ</h1〉ﻩ〈/body>〈/html>ﻩ把程序部署在myeclipse中运行。图1-2登陆页面图1-3更改密码页面Struts2的中文乱码解决中文乱码问题一般是指当恳求参数有中文时,无法在Action中得到正确的中文.Struts2中有2种方法可以解决这个问题:设置JSP页面的pageEncoding="utf-8",就不会消灭中文乱码;如果JSP页面的pageEncoding="GBK”,那么需要修改struts。i18n。encoding=GBK,在struts。xml中加入如下语句进行修改。〈?xmlversion="1.0"encoding="UTF—8"?〉<!DOCTYPEstrutsPUBLIC”-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN""http://struts.apache.org/dtds/struts-2.0。dtd”><struts〉〈constantname="struts。i18n。encoding”value=”GBK"/>ﻩ……〈/struts>ﻩ上面2种方法可以解决POST恳求中的中文参数,但是GET恳求中的中文参数不能解决,GET恳求中的中文参数的乱码需要通过修改Tomcat的server.xml文件来解决,修改如下内容,加入URIEncoding=”GBK”:<Connectorport=”8080"……URIEncoding="GBK”/>Struts2的Action中访问web对象Struts2的Action就是一个一般的POJO对象,它和Web对象request、response、session和application没有耦合在一起,这样便于单独测试Action,那么我们在Action中如何访问这些web对象呢?访问这些web内部对象有2种方式:直接访问Web对象Struts2框架供应org.apache.struts2。ServletActionContext帮助类来获得web对象。HttpServletRequestrequest=ServletActionContext.getRequest();HttpServletResponseresponse=ServletActionContext.getResponse();HttpSessionsession=request.getSession();ServletContextapplication=ServletActionContext.getServletContext();Action访问ActionContextcom。opensymphony。xwork2.ActionContext是一个Action执行的上下文,Action执行期间所用到的对象都保存在ActionContext中,例如session、参数等,并且ActionContext是一个局部线程变量,不用关注Action的线程平安。ActionContextcontext=ActionContext.getContext();该类的常用方法见表1-3所示:表1-3ActionContext中的常用方法Objectget(Objectkey)使用key来查找当前ActionContext中的值MapgetApplication()返回一个Application范围的MapstaticActionContextgetContext()获得当前线程的ActionContext实例MapgetParameters()Map类型的全部HttpServletRequest的参数MapgetSession()Map类型的HttpSession值ValueStackgetValueStack()返回一个ValueStack类型OGNL值栈voidput(Objectkey,Objectvalue)向当前ActionContext存入值,等于在HttpServletRequest中加入值voidsetApplication(Mapapplication)设置application上下文voidsetSession(Mapsession)设置session值,参数为Map实例ﻩ这种方法使用的全部对象和Web对象没有直接联系,所以在测试的时候也是很便利的,我们推举在程序中使用此方法来访问web对象。Action的分类继承ActionSupport实现Action通过继承ActionSupport来实现Action是我们的推举做法,由于ActionSupport中供应了输入验证、国际化、execute等常用方法,使得编写Action时代码很简洁。packagemypack;importcom.opensymphony。xwork2.ActionSupport;publicclassHelloWorldextendsActionSupport{ﻩprivateStringmessage;ﻩpublicStringgetMessage(){ﻩﻩreturnmessage; }ﻩpublicvoidsetMessage(Stringmessage){ﻩﻩthis。message=message;ﻩ}ﻩ@OverrideﻩpublicStringexecute()throwsException{ﻩ //TODOAuto—generatedmethodstub ﻩmessage="大家好!”;ﻩ returnSUCCESS;ﻩ}} ActionSupport实现了Action接口,这个接口中定义了一些常量和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类的代码部分内容如下: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{}//输入验证ﻩpublicvoidvalidate(){}ﻩ......}ﻩ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="hello”class="mypack.HelloWorld"〉 ﻩﻩ<result>/Success。jsp</result>ﻩﻩ〈/action> </package〉</struts>模型驱动(ModelDriven)的ActionStruts2的Action属于MVC模型层,Action中的方法代表业务规律,Action中的属性代表恳求中的参数,当页面恳求参数较多的时候,把过多的参数对象的属性定义在Action中不太符合Struts所提倡的松耦合原则,所以我们推举单独用JavaBean来封装参数,在Action中为JavaBean赋值,这就是ModelDriven的Action。模型驱动的Action要求Action实现ModelDriven接口,假如登录页面需要传输参数username和userpass,我们把这2个参数封装在一个数据的JavaBean中,然后在Action中定义该JavaBean为Model即可,代码如下:Userinfo.javapackagepo;//用户名和密码的封装对象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; }//返回模型对象的实例ﻩpublicUserinfogetModel(){ﻩﻩ//TODOAuto—generatedmethodstub ﻩreturnmodel;ﻩ}}ﻩ当恳求该Action的时候,恳求中的参数会自动填充到模型Userinfo的属性中,当然需要参数名和属性名一样,到跳转的页面上利用Struts2标签〈s:propertyvalue=”username"/〉可以取出模型Userinfo中的属性username。在ModelDriven接口中的方法getModel()必须实现,通过它告知系统模型的简略对象是什么。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.getContextPath();ﻩStringbasePath=request。getScheme()+”://" ﻩ +request.getServerName()+":"+request。getServerPort()ﻩﻩﻩ+path+"/";%><!DOCTYPEHTMLPUBLIC”—//W3C//DTDHTML4。01Transitional//EN"><html〉 <head〉 ﻩ<basehref="<%=basePath%>”〉 ﻩ〈title>MyJSP'new.jsp'startingpage</title>ﻩ</head>ﻩ<body〉ﻩﻩusername:〈s:propertyvalue="username”/>ﻩ</body〉</html>多方法的ActionAction中的方法代表业务规律,那么一个模块中的多个业务规律如何用Action来处理呢?我们有2种方法来处理这个问题:一个Action对应一个业务规律,实现便利,但是Action数量多,struts.xml中需要配置的内容也多,这种方法不推举;一个Action对应多个业务规律,例如表的CRUD操作,含有多个业务规律,我们只写一个Action来实现,Action的数量没有增加,struts。xml的配置也简洁,所以这种方法是我们推举的做法。Action中自定义方法的声明和execute方法一样,方法的调用路径为“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业务方法 privateUserServiceuserservice=newUserService();privateUserinfouserinfo=newUserinfo();ﻩ//模型对象userinfoﻩpublicUserinfogetModel(){ﻩﻩ//TODOAuto-generatedmethodstubﻩﻩreturnuserinfo; }ﻩ//增加ﻩpublicStringcreate()throwsException{ﻩﻩuserservice.createUser(userinfo); ﻩreturnSUCCESS;ﻩ}ﻩ//查询ﻩpublicStringretrive()throwsException{ﻩﻩ//查询结果放在request中 ActionContext.getContext().put("userlist”,userservice.selectUsers());ﻩreturn"list";ﻩ}ﻩ//修改ﻩpublicStringupdate()throwsException{ﻩ userservice.updateUser(userinfo); ﻩreturnSUCCESS;ﻩ} //删除ﻩpublicStringdelete()throwsException{ﻩﻩuserservice。deleteUser(userinfo.getUsername()); ﻩreturnSUCCESS;ﻩ} //默认的executeﻩpublicStringexecute()throwsException{ ﻩreturnSUCCESS;ﻩ}}ﻩ在struts。xml中配置如下:<?xmlversion="1.0”encoding=”UTF—8"?><!DOCTYPEstrutsPUBLIC"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN""http://struts.apache。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>ﻩ调用CRUD业务规律的恳求路径见表2—1。表2-1多方法Action中每个方法的恳求路径业务规律方法恳求路径create()CrudUser!create.actionretrive()CrudUser!retrive。actionupdate()CrudUser!update。actiondelete()CrudUser!delete.actionexecute()CrudUser。actionResult类型Action中表示跳转的目的地使用了在struts.xml配置的字符串,格式为:<resul="”type=””></result〉,type可以有多种选择,Struts2支持各种视图技术,例如JSP、JSF、XML等,默认的是JSP。常见的type类型配置如下:dispatcher转发到JSP页面,和〈jsp:forwardpage="”/>的效果一样,是默认类型。〈result>/Success.jsp</result><resultname=”a”>/Success.jsp〈/result><resultname=”b”type=”dispatcher">/Success.jsp</result>redirect重定向到JSP页面,和response.sendRedirect(“”)的效果一样.<resultname=”a”type=”redirect”〉/Success.jsp</result>redirect-action重定向到action,目的地为Action,配置时可以指定如下两个参数:actionName—重定向的Action名;namespace-重定向的Action所在的命名空间。<resultname=”a”type="redirect—action”><paramname=”actionName">myaction</param〉<par="namespace”〉/test</param〉</result>chain转发到action,形成action—chain,可以指定两个参数:actionName-重定向的Action名;namespace—重定向的Action所在的命名空间。〈resulttype=”chain"><paramname=”actionName”>myaction</param><paramname=”namespace”>/test</param〉</result>stream用于向页面返回一个InputStream,原始数据直接传递给HttpServletResponse,这种结果类型在用户下载文件(例如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的源代码内容,可以指定两个参数:location-目的地JSP/HTML,charSet—输出内容时使用的字符集。<resultname=”success”type=”plaintext"〉〈paramname="location"〉/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类型。这些视图技术的支持,有些还需要导入相应的插件包,即Struts2供应的含有plugin字样的jar包.输入验证javaScript客户端验证validate方法验证在Action中加入validate验证方法,把添加和修改时验证分开,添加用户时验证方法为validateCreate(),修改用户时的验证方法为validateUpdate()。packageaction;importjavax.servlet.http。HttpServletRequest;importorg.apache。struts2.ServletActionContext;importoper.UserOper;importpo。Userinfo;importcom。opensymphony.xwork2.ActionContext;importcom。opensymphony.xwork2。ActionSupport;importcom。opensymphony.xwork2.ModelDriven;publicclassUserActionextendsActionSupportimplementsModelDriven<Userinfo〉{ﻩ//数据模型ﻩprivateUserinfouser=newUserinfo();ﻩ//业务类 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;ﻩ} //查询单个ﻩ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.getWorktime());ﻩﻩuser.setEmail(myuser。getEmail());ﻩﻩuser。setInterest(myuser。getInterest());ﻩﻩuser.setIntro(myuser.getIntro());ﻩﻩuser。setXl(myuser.getXl());ﻩ return"addupdate”;ﻩ}ﻩ//验证方法ﻩ//增加时验证ﻩpublicvoidvalidateCreate(){ﻩ checkForm(); //用户名是否存在 if(uo.checkUserName(user.getUsername()))ﻩﻩﻩthis.addFieldError("username","用户名已经被占用");ﻩ} //修改时验证ﻩpublicvoidvalidateUpdate(){ﻩﻩcheckForm();ﻩﻩif(uo。checkUserName(user。getUsername(),user.getUserid()))ﻩ ﻩthis.addFieldError("username",”用户名已经被占用");ﻩ} //验证要求ﻩ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.addFieldError("sfz","身份证必须是15位或18位");ﻩﻩ//email不能为空 ﻩif(user.getEmail()==null||user.getEmail().equals(”"))ﻩﻩﻩthis。addFieldError(”email",”Email不能为空"); ﻩelseif(!user.getEmail()。matches(”^\\w+@\\w+(\\.\\w+)+$"))ﻩﻩﻩthis.addFieldError(”email”,"Email格式错误”); ﻩ//生日不能为空 ﻩif(user。getBirthday()==null)ﻩﻩﻩthis。addFieldError("birthday”,"生日不能为空");ﻩﻩ//爱好至少选一项ﻩﻩif(user.getInterest()==null)ﻩﻩﻩthis。addFieldError(”interest”,"爱好至少选一项");ﻩ //工作年限1—100之间ﻩﻩif(user.getWorktime()〈1||user.getWorktime()>100)ﻩ this.addFieldError("worktime",”工作年限必须在1-100之间");ﻩﻩ//简介不能为空ﻩﻩif(user.getIntro()==null||user。getIntro()。equals("”))ﻩﻩﻩthis。addFieldError(”intro”,"简介不能为空");ﻩ}}Struts.xml中增加了验证出错时跳转到的页面〈resultname=”input”>〈/result〉.〈?xmlversion="1。0"encoding="UTF-8"?〉<!DOCTYPEstrutsPUBLIC"—//ApacheSoftwareFoundation//DTDStrutsConfiguration2。0//EN""http://struts.apach/dtds/struts-2.0.dtd"〉〈struts>〈!—-恳求参数的中文处理-—>〈constantname=”struts.i18n。encoding”value="GBK"/><!--修改后的xml自动加载--〉〈constantname="struts。configuration.xml。reload”value="true"/>ﻩ〈packagename="actions”extends="struts—default">ﻩ 〈actionname="user"class="action。UserAction”〉ﻩﻩ<result>/UserList.jsp</result>ﻩﻩ<resultname="addupdate">/AddUpdate。jsp</result〉 ﻩ<resultname=”input”>/AddUpdate.jsp</result〉ﻩﻩ</action> 〈/package〉〈/struts>validate框架(xml)验证为了使用Struts2的框架验证文件进行输入验证,需要建立一个特定的验证规章文件,该文件是一个XML格式配置文件,文件命名规章为<Action类名-validation.xml>,保存在Action实现类相同的名目下,如果是多方法Action,需要使用Action的别名配置(每个方法映射为不同的Action别名,可以使用通配符),每个方法的验证文件名为〈Action类名—别名—validation.xml>。这个例子中的验证文件的名字为: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”>〈!——验证规章定义根元素-—><validators>ﻩ〈!--第一个验证字段:姓名name--〉 〈fieldname="name"〉ﻩﻩ<!—-验证规章:非空(系统预先定义好的规章)—->ﻩﻩ〈field-validatortype="requiredstring"〉ﻩﻩﻩ〈!--错误提示—->ﻩﻩﻩ<message>姓名不能为空</message>ﻩﻩ</field—validator>ﻩﻩ〈!--验证规章:长度在5—10之间(系统预先定义好的规章)--〉 <field—validatortype=”stringlength">ﻩ 〈="minLength">5</param〉 ﻩ 〈paramname="maxLength">10</param〉ﻩﻩﻩ<!--错误提示—-〉ﻩﻩﻩ〈message〉姓名长度必须在${minLength}-${maxLength}个字符之间</message>ﻩﻩ〈/field—validator〉ﻩ</field>ﻩ<!--其次个验证字段:年龄age-->ﻩ<fieldname=”age">ﻩﻩ〈field—validatortype="conversion"short-circuit="true”>ﻩﻩ 〈!—-错误提示-—>ﻩﻩﻩ<message〉必须输入整数〈/message>ﻩ</field-validator> ﻩ<field-validatortype="int"> ﻩ<paramname="min">20</param> ﻩ 〈paramname="max”>35</param>ﻩ ﻩ〈!-—错误提示—-> ﻩﻩ<message>年龄必须在${min}-${max}之间</message>ﻩﻩ</field-validator>ﻩ</field>ﻩ<!—-第三个验证字段:分数mark-—〉ﻩ<fiel="mark">ﻩ〈field-validatortype="conversion"short-circuit=”true"〉ﻩﻩﻩ<!-—错误提示--〉ﻩﻩﻩ〈message>必须输入数字</message>ﻩﻩ</field-validator> ﻩ〈field-validatortype="double"〉 ﻩﻩ<paramname="minInclusive">50〈/param>ﻩﻩﻩ〈paramname=”maxInclusive”〉100</param>ﻩ ﻩ<!——错误提示-->ﻩﻩﻩ<message>分数必须在${minInclusive}-${maxInclusive}之间〈/message>ﻩ </field-validator> </field>ﻩ<!——第三个验证字段:入学时间enrolltime--〉ﻩ<fieldname=”enrolltime">ﻩ<field-validatortype=”conversion”short-circuit="true">ﻩ ﻩ〈!——错误提示—->ﻩ ﻩ<message>必须是日期格式</message>ﻩﻩ</field-validator>ﻩ〈field-validatortype="required">ﻩﻩﻩ<!-—错误提示-—>ﻩﻩﻩ〈message>入学时间不能为空〈/message〉ﻩﻩ</field—validator>ﻩﻩ<field—validatortype="date”>ﻩﻩ <paramname="min”>1990-01-01</param〉ﻩ ﻩ<paramname="max”>2008-10-09</param〉ﻩﻩﻩ〈!--错误提示-->ﻩﻩ <message>入学时间必须在${min}到${max}之间</message>ﻩﻩ</field-validator> </field></validators>ﻩ上述验证文件中,short-circuit属性为true表示发生验证错误的时候,后续验证不再执行,即“短路”.Action的局部资源文件StuAction.properties做如下修改,这样当数据类型转换特别的时候由验证框架文件来给出错误提示,而基本标签的提示指定为空,不然会消灭重复提示:invalid.fieldvalue。age=invalid.fieldvalue。mark=invalid。fieldvalue.enrolltime=Strut2的国际化在struts.xml中配置struts。custom。i18n。resources常量〈constantname=”struts.custom.i18n。resources”value="globalMessages"/〉在src名目下建立中文和英文的资源文件,中文资源文件globalMessages_zh_CN.properties的内容如下:username=用户名userpass=密码success=登录成功error=登录失败login=登录ﻩ使用native2ascii工具把该文件转换为unicode编码。英文资源文件globalMessages_en.properties的内容如下:username=UserNameuserpass=Passwordsuccess=Welcomeerror=Sorry!Youcannotloginlogin=Login编写登录页面Login。jsp,其内容如下:〈%@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内容如下:<%@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’Success。jsp’startingpage〈/title>ﻩ〈/head〉ﻩ<body>ﻩ<s:propertyvalue="username"/〉ﻩ〈s:textname="success"/>ﻩ</body〉</html>ﻩ登录失败页面Error.jsp内容如下:〈%@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标签都可以访问资源文件,表单标签〈s:textfieldname=””key=””/〉中的属性key用于访问资源文件,<s:textname=””/>标签中的name属性用于访问资源文件。标签库和OGNL在jsp页面中使用标签库指令引入后<%tagliburi="/struts—tags”prefix=”s”%〉,就可以使用全部的Struts2标签了。Struts2拦截器 拦截器(interceptor)是Struts2框架核心组成部分。很多功能都是构建在拦截器基础之上的,例如文件的上传和下载、国际化、数据类型转换和数据有效性验证等,Struts2利用内建的拦截器,完成了框架内的大部分操作。拦截器就是动态拦截Action调用的对象。它供应了一种机制,使开发者可以定义一个特定的功能模块,这个模块可以在Action执行之前或之后运行,也可以在一个Action执行之前阻止Action执行。同时也供应了一种可以提取Action中可重用部分的方式。Struts2框架的Action被一个或者多个拦截器(拦截器栈)所包围,全部的用户恳求都会被拦截器所拦截,然后交给Action处理,处理结果以规律视图的方式返回给用户。而这个调用的执行流程,是由Strut2的配置文件(struts.xml)来实现的。在前面几章中,没有明确说明拦截器,为什么可以直接调用Action呢?那是由于在Struts2框架中如果没有显式的拦截器配置,则系统会调用默认的拦截器来调用Action,在用户看来,似乎没有配置拦截器一样.演示一个简洁拦截器的开发:HelloWorld拦截器。假设我们需要实现这么一个功能,在调用每个Action之前都能在掌握台打印出“HelloWorld".这样的一个功能使用Struts2拦截器来实现最简洁。下面介绍一个简略的实现步骤。建立一个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>建立一个拦截器类HelloWorldInterceptor.java,其代码如下;packageinterceptor;importaction.MyAction;importcom.opensymphony.xwork2.ActionInvocation;importcom。opensymphony.xwork2。interceptor。AbstractInterceptor;publicclassHelloWorldInterceptorextendsAbstractInterceptor{//拦截方法ﻩ@Override publicStringintercept(ActionInvocationarg0)throwsException{ﻩ //获得被调用的Action类ﻩ Objectaction=arg0。getAction();ﻩﻩ//打印HelloWorldﻩﻩSystem.out.println("拦截器信息:HelloWorld!");ﻩﻩ//执行Action或调用下一个拦截器 ﻩStringresult=arg0.invoke();ﻩﻩ//执行完action后提示ﻩﻩSystem。out.println(”Action执行完毕!”);ﻩﻩreturnresult;ﻩ}}在struts.xml中加入拦截器的配置,见struts.xml内容;<?xmlversion="1.0"encoding="UTF-8”?>〈!DOCTYPEstrutsPUBLIC"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2。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〉调用成功〈/h1><s:propertyvalue="age”/></body></html〉运行该web程序,在地址栏输入HYPERLINK”http://localhost:8080/hw/test.action?age=35"http://localhost:8080/hw/test。action?age=35从图4—1我们可以看到,程序的运行有错误,就是参数age的值没有填充到Action的属性age中,所以页面上显示age就是0,那么这是为什么呢?是由于参数的值填充到名称相同的属性中这个过程也是依靠拦截器实现的,但是我们一旦在action中引用了自己定义的拦截器,那么系统默认的拦截器就没有了,所以我们只要在struts.xml的配置中让Action引用默认拦截器就正确了,默认拦截器是通过<package…extends="struts-default”></package〉中的extends引入的,修改后的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"〉 ﻩ〈!-—定义拦截器——> ﻩ〈interceptors>ﻩﻩ <interceptorname="helloworld"ﻩﻩﻩﻩclass=”interceptor。HelloWorldInterceptor"/>ﻩﻩ〈/interceptors>ﻩﻩ<actionname="test"class="action。MyAction”>ﻩﻩﻩ<result>Success.jsp</result〉ﻩﻩ 〈!—-action中引用默认拦截器—->ﻩﻩﻩ<interceptor-refname="defaultStack"/〉ﻩ <!-—action中引用拦截器—->ﻩﻩﻩ<interceptor-refname="helloworld"/> 〈/action>ﻩ</package></struts>拦截器应用实例—文件上传和下载Struts2框架默认使用Common—fileUpload组件实现文件上传,该组件将解析出HttpServletRequest恳求中的文件域信息,并使用IO流方式,将文件保存在服务器的指定位置。Struts2框架中本身不带有Common-fileUpload组件的jar包,需要自己下载后放在web程序的WEB-INF/lib名目中,需要2个jar包,一个是commons-fileupload—1.2.1。jar,可从网址http://jakarta.apache.org/commons/fileupload下载,另一个是commons—io-1.4.jar,可从网址http://jakarta.apache。org/commons/io/。文件上传上传单个文件的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-data”〉上传文件:<s:filename="doc"/><br><s:submitvalue="上传”/>〈/s:form></body></html>form表单的enctype属性设置为multipart/form—data。enctype用来指定表单数据的编码方式,有如下3个值。application/x-www-form-
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024中国电信湖北荆州分公司校园招聘17人易考易错模拟试题(共500题)试卷后附参考答案
- 2024中国电信吉林辽源分公司校园招聘易考易错模拟试题(共500题)试卷后附参考答案
- 2024中国建筑股份限公司岗位招聘2人(投资部)易考易错模拟试题(共500题)试卷后附参考答案
- 2024中国交建轨道交通事业部招聘14人易考易错模拟试题(共500题)试卷后附参考答案
- 2024“才聚齐鲁成就未来”山东省金融资产管理股份限公司社会招聘7人易考易错模拟试题(共500题)试卷后附参考答案
- 2024年度大数据中心建设及运营合同2篇
- 2024年度智能家居系统云平台建设合同
- 2024年度离婚后公司股份转让合同
- 威灵电机常州基地项目车间二安全专项组织施工方案1
- FAB销售法则课件
- 2022年6月大学英语四级真题及答案(第一套)
- 车辆拍卖方案
- 读后续写-My+New+Brother 高三英语作文复习专题+
- 预康复的护理
- 学术规范与学术诚信
- 参考文献的正确标注课件
- 2024年内蒙古交通集团有限公司招聘笔试参考题库附带答案详解
- 地方立法技术与规范
- 医疗器械经营的风险防范与风险控制
- 创伤性硬膜下出血查房
- 医院感染科护士的消毒与无菌技术培训
评论
0/150
提交评论