struts2传智播客黎活明课件

上传人:xx****x 文档编号:243114860 上传时间:2024-09-16 格式:PPT 页数:80 大小:241KB
返回 下载 相关 举报
struts2传智播客黎活明课件_第1页
第1页 / 共80页
struts2传智播客黎活明课件_第2页
第2页 / 共80页
struts2传智播客黎活明课件_第3页
第3页 / 共80页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,高级软件人才实作培训专家,!,高级软件人才实作培训专家,!,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,Struts2,讲师:,1,Struts2,Struts2,是在,WebWork2,基础发展而来的。和,struts1,一样,,Struts2,也属于,MVC,框架。不过有一点大家需要注意的是:尽管,Struts2,和,struts1,在名字上的差别不是很大,但,Struts2,和,struts1,在代码编写风格上几乎是不一样的。那么既然有了,struts1,,为何还要推出,struts2,。主要是因为,struts2,有以下优点:,1 ,在软件设计上,Struts2,没有像,struts1,那样跟,Servlet API,和,struts API,有着紧密的耦合,,Struts2,的应用可以不依赖于,Servlet API,和,struts API,。,Struts2,的这种设计属于无侵入式设计,而,Struts1,却属于侵入式设计。,public class OrderListAction extends,Action,public ActionForward execute(,ActionMapping,mapping,ActionForm,form,HttpServletRequest,request,HttpServletResponse,response),throws Exception ,2 Struts2,提供了拦截器,利用拦截器可以进行,AOP,编程,实现如权限拦截等功能。,3 Strut2,提供了类型转换器,我们可以把特殊的请求参数转换成需要的类型。在,Struts1,中,如果我们要实现同样的功能,就必须向,Struts1,的底层实现,BeanUtil,注册类型转换器才行。,4 Struts2,提供支持多种表现层技术,如:,JSP,、,freeMarker,、,Velocity,等,5,Struts2,的输入校验可以对指定方法进行校验,解决了,Struts1,长久之痛。,6,提供了全局范围、包范围和,Action,范围的国际化资源文件管理实现,2,搭建,Struts2,开发环境,搭建,Struts2,环境时,我们一般需要做以下几个步骤的工作:,1,找到开发,Struts2,应用需要使用到的,jar,文件,.,2,编写,Struts2,的配置文件,3,在,web.xml,中加入,Struts2 MVC,框架启动配置,3,搭建,Struts2,开发环境,-,开发,Struts2,应用依赖的,jar,文件,我们可以到下载,struts-2.x.x-all.zip,,目前最新版为,2.1.8,。下载完后解压文件,开发,struts2,应用需要依赖的,jar,文件在解压目录的,lib,文件夹下。不同的应用需要的,JAR,包是不同的。下面给出了开发,Struts 2,程序最少需要的,JAR,。,struts2-core-2.x.x.jar :,Struts 2,框架的核心类库,xwork-core-2.x.x.jar :,XWork,类库,,Struts 2,在其上构建,ognl-2.6.x.jar :,对象图导航语言(,Object Graph Navigation Language,),,struts2,框架通过其读写对象的属性,freemarker-2.3.x.jar :,Struts 2,的,UI,标签的模板使用,FreeMarker,编写,commons-logging-1.x.x.jar :,ASF,出品的日志包,,Struts 2,框架使用这个日志包来支持,Log4J,和,JDK 1.4+,的日志记录。,commons-,文件上传组件,,2.1.6,版本后必须加入此文件,4,搭建,Struts2,开发环境,- Struts2,应用的配置文件,Struts2,默认的配置文件为,struts.xml,,该文件需要存放在,WEB-INF/classes,下,该文件的配置模版如下:,注意:此文件在开发的时候是放到,src,目录下,程序编译后会自动拷贝到,WEB-INF/classes,目录下。此文件我们可以不用自己手写直接到Struts框架的例子程序中拷贝过来稍稍修改一下即可,5,搭建,Struts2,开发环境,-Struts2,在,web,中的启动配置,在,struts1.x,中,,struts,框架是通过,Servlet,启动的。在,struts2,中,,,struts,框架是通过,Filter,启动的。他在,web.xml,中的配置如下:,struts2,org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter,struts2,/*,在,StrutsPrepareAndExecuteFilter,的,init(),方法中将会读取类路径下默认的配置文件,struts.xml,完成初始化操作。,注意,:,struts2,读取到,struts.xml,的内容后,以,javabean,形式存放在内存中,以后,struts2,对用户的每次请求处理将使用内存中的数据,而不是每次都读取,struts.xml,文件,6,第一个,Struts2,应用,-HelloWorld,在默认的配置文件,struts.xml,中加入如下配置:,/WEB-INF/page/hello.jsp,7,Struts.xml,配置中的包介绍,/WEB-INF/page/hello.jsp,在,struts2,框架中使用包来管理,Action,,,包的作用和,java,中的类包是非常类似的,它主要用于管理一组业务功能相关的,action,。在实际应用中,我们应该把一组业务功能相关的,Action,放在同一个包下。,配置包时必须指定,name,属性,该,name,属性值可以任意取名,但必须唯一,他不对应,java,的类包,如果其他包要继承该包,必须通过该属性进行引用。包的,namespace,属性用于定义该包的命名空间,命名空间作为访问该包下,Action,的路径的一部分,如访问上面例子的,Action,,访问路径为:,/test,/,helloworld,.action,。,namespace,属性可以不配置,对本例而言,如果不指定该属性,默认的命名空间为,“”(,空字符串,),。,通常每个包都应该继承,struts-default,包,,因为,Struts2,很多核心的功能都是拦截器来实现。如:从请求中把请求参数封装到,action,、文件上传和数据验证等等都是通过拦截器实现的。,struts-default,定义了这些拦截器和,Result,类型,。可以这么说:当包继承了,struts-default,才能使用,struts2,提供的核心功能。,struts-default,包是在,struts2-core-2.x.x.jar,文件中的,struts-default.xml,中定义。,struts-default.xml,也是,Struts2,默认配置文件。,Struts2,每次都会自动加载,struts-default.xml,文件。,包还可以通过,abstract=“true”,定义为抽象包,抽象包中不能包含,action,。,8,第一个,Struts2,应用,-HellWorld,例子中使用到的,cn.itcast.action.HelloWorldAction,类如下:,package cn.itcast.action;,public class HelloWorldAction,private String message;,public String getMessage() ,return message;,public void setMessage(String message) ,this.message = message;,public String execute() ,this.message = ,我的第一个,struts2,应用,;,return success;,9,第一个,Struts2,应用,-HelloWorld,例子中使用到的,/WEB-INF/page/hello.jsp,如下:,第一个,struts2,应用,$message ,可以使用,EL,表达式访问,Action,中的属性。,10,访问,HelloWorld,应用,在,struts1,中,通过,节点的,path,属性指定访问该,action,的,URL,路径。在,struts2,中,情况就不是这样了,访问,struts2,中,action,的,URL,路径由两部份组成:包的命名空间,+action,的名称,例如访问本例子,HelloWorldAction,的,URL,路径为:,/test/helloworld,(,注意:完整路径为:,:,端口,/,内容路径,/test/helloworld,),。另外我们也可以加上,.action,后缀访问此,Action,。,/WEB-INF/page/hello.jsp,11,Action,名称的搜索顺序,1,获得请求路径的,URI,,例如,url,是:,path1,/,path2,/,path3,/test.action,2,首先寻找,namespace,为,/path1/path2/path3,的,package,,如果不存在这个,package,则执行步骤,3,;如果存在这个,package,,则在这个,package,中寻找名字为,test,的,action,,,当在该,package,下寻找不到,action,时就会直接跑到默认,namaspace,的,package,里面去寻找,action,(,默认的命名空间为空字符串,“” ),,如果在默认,namaspace,的,package,里面还寻找不到该,action,,,页面提示找不到,action,3,寻找,namespace,为,/path1/path2,的,package,,如果不存在这个,package,,则转至步骤,4,;如果存在这个,package,,则在这个,package,中寻找名字为,test,的,action,,当在该,package,中寻找不到,action,时就会直接跑到默认,namaspace,的,package,里面去找名字为,test,的,action,,在默认,namaspace,的,package,里面还寻找不到该,action,,,页面提示找不到,action,4,寻找,namespace,为,/path1,的,package,,如果不存在这个,package,则执行步骤,5,;如果存在这个,package,,则在这个,package,中寻找名字为,test,的,action,,当在该,package,中寻找不到,action,时就会直接跑到默认,namaspace,的,package,里面去找名字为,test,的,action,,在默认,namaspace,的,package,里面还寻找不到该,action,,,页面提示找不到,action,5,寻找,namespace,为,/,的,package,,如果存在这个,package,,则在这个,package,中寻找名字为,test,的,action,,当在,package,中寻找不到,action,或者不存在这个,package,时,都会去默认,namaspace,的,package,里面寻找,action,,如果还是找不到,页面提示找不到,action,。,12,Action,配置中的各项默认值,/WEB-INF/page/hello.jsp,1,如果没有为,action,指定,class,,默认是,ActionSupport,。,2,如果没有为,action,指定,method,,默认执行,action,中的,execute(),方法。,3,如果没有指定,result,的,name,属性,默认值为,success,。,13,Action,中,result,的各种转发类型,/WEB-INF/page/hello.jsp,result,配置类似于,struts1,中的,forward,,,但,struts2,中提供了多种结果类型,,常用的类型有:,dispatcher(,默认值,),、,redirect,、,redirectAction,、,plainText,。,在,result,中还可以使用,$,属性名,表达式访问,action,中的属性,表达式里的属性名对应,action,中的属性,。如下:,/view.jsp?id=,$id,下面是,redirectAction,结果类型的例子,如果重定向的,action,中同一个包下:,helloworld,如果重定向的,action,在别的命名空间下:,helloworld,/test,plaintext:,显示原始文件内容,例如:当我们需要原样显示,jsp,文件源代码 的时候,我们可以使用此类型。,/xxx.jsp,UTF-8,14,多个,Action,共享一个视图,-,全局,result,配置,当多个,action,中都使用到了相同视图,这时我们应该把,result,定义为全局视图。,struts1,中提供了全局,forward,,,struts2,中也提供了相似功能:,/message.jsp,15,为,Action,的属性注入值,Struts2,为,Action,中的属性提供了依赖注入功能,在,struts2,的配置文件中,我们可以很方便地为,Action,中的属性注入值。注意:属性必须提供,setter,方法。,public class HelloWorldAction,private String savePath;,public String getSavePath() ,return savePath;,public void setSavePath(String savePath) ,this.savePath = savePath;,.,/images,/WEB-INF/page/hello.jsp,上面通过,节点为,action,的,savePath,属性注入,“,/images”,16,指定需要,Struts 2,处理的请求后缀,前面我们都是默认使用,.action,后缀访问,Action,。其实默认后缀是可以通过常量,”,struts.action.extension,“,进行修改的,例如:我们可以配置,Struts 2,只处理以,.do,为后缀的请求路径:,如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开。如:,17,细说常量,定义,常量可以在,struts.xml,或,struts.properties,中配置,建议在,struts.xml,中配置,两种配置方式如下:,在,struts.xml,文件中配置常量,在,struts.properties,中配置常量,struts.action.extension=do,因为常量可以在下面多个配置文件中进行定义,所以我们需要了解,struts2,加载常量的搜索顺序,:,struts-default.xml,struts-plugin.xml,struts.xml,struts.properties,web.xml,如果在多个文件中配置了同一个常量,,,则后一个文件中配置的常量值会覆盖前面文件中配置的常量值,.,18,常用的常量介绍,19,Struts2,的处理流程,StrutsPrepareAndExecuteFilter,Interceptor,Action,Result,Jsp/html,用户请求,Struts2,内置的一些拦截器或用户自定义拦截器,用户编写的,action,类,类似,struts1,中的,Action,类似,struts1,中的,forward,响应,StrutsPrepareAndExecuteFilter,是,Struts 2,框架的核心控制器,它负责拦截由,/*,指定的所有用户请求,当用户请求到达时,该,Filter,会过滤用户的请求。默认情况下,如果用户请求的路径不带后缀或者后缀以,.action,结尾,这时请求将被转入,Struts 2,框架处理,否则,Struts 2,框架将略过该请求的处理。当请求转入,Struts 2,框架处理时会先经过一系列的拦截器,然后再到,Action,。,与,Struts1,不同,,Struts2,对用户的每一次请求都会创建一个,Action,,所以,Struts2,中的,Action,是线程安全的。,20,为应用指定多个,struts,配置文件,在大部分应用里,随着应用规模的增加,系统中,Action,的数量也会大量增加,导致,struts.xml,配置文件变得非常臃肿。为了避免,struts.xml,文件过于庞大、臃肿,提高,struts.xml,文件的可读性,我们可以将一个,struts.xml,配置文件分解成多个配置文件,然后在,struts.xml,文件中包含其他配置文件。下面的,struts.xml,通过,元素指定多个配置文件:,通过这种方式,我们就可以将,Struts 2,的,Action,按模块添加在多个配置文件中。,21,动态方法调用,如果,Action,中存在多个方法时,我们可以使用,!+,方法名,调用指定方法。如下:,public class HelloWorldAction,private String message;,.,public String,execute,() throws Exception,this.message = ,我的第一个,struts2,应用,;,return success;,public String,other,() throws Exception,this.message = ,第二个方法,;,return success;,假设访问上面,action,的,URL,路径为:,/struts/test/helloworld.action,要访问,action,的,other,(),方法,我们可以这样调用:,/struts/test/helloworld,!other,.action,如果不想使用动态方法调用,我们可以通过常量,struts.enable.DynamicMethodInvocation,关闭动态方法调用。,22,使用通配符定义,action,/WEB-INF/page/hello.jsp,public class HelloWorldAction,private String message;,.,public String,execute,() throws Exception,this.message = ,我的第一个,struts2,应用,;,return success;,public String,other,() throws Exception,this.message = ,第二个方法,;,return success;,要访问,other(),方法,可以通过这样的,URL,访问:,/test/helloworld_other.action,23,接收请求参数,采用基本类型接收请求参数,(get/post),在,Action,类中定义与请求参数同名的属性,,struts2,便能自动接收请求参数并赋予给同名属性。,请求路径:,public class ProductAction ,private Integer id;,public void,setId,(Integer id) /struts2,通过反射技术调用与请求参数同名的属性的,setter,方法来获取请求参数值,this.id = id;,public Integer getId() return id;,采用复合类型接收请求参数,请求路径:,public class ProductAction ,private Product product;,public void setProduct(Product product) this.product = product; ,public Product getProduct() return product;,Struts2,首先通过反射技术调用,Product,的默认构造器创建,product,对象,然后再通过反射技术调用,product,中与请求参数同名的属性的,setter,方法来获取请求参数值。,24,关于,struts2.1.6,接收中文请求参数乱码问题,struts2.1.6,版本中存在一个,Bug,,即接收到的中文请求参数为乱码,(,以,post,方式提交,),,原因是,struts2.1.6,在获取并使用了请求参数后才调用,HttpServletRequest,的,setCharacterEncoding(),方法进行编码设置 ,导致应用使用的就是乱码请求参数。这个,bug,在,struts2.1.8,中已经被解决,如果你使用的是,struts2.1.6,,要解决这个问题,你可以这样做:新建一个,Filter,,把这个,Filter,放置在,Struts2,的,Filter,之前,然后在,doFilter(),方法里添加以下代码,public void doFilter(.),HttpServletRequest req = (HttpServletRequest) request;,req.setCharacterEncoding(UTF-8);/,应根据你使用的编码替换,UTF-8,filterchain.doFilter(request, response);,25,自定义类型转换器,java.util.Date,类型的属性可以接收格式为,2009-07-20,的请求参数值。但如果我们需要接收格式为的请求参数,我们必须定义类型转换器,否则,struts2,无法自动完成类型转换。,import java.util.Date;,public class HelloWorldAction ,private Date createtime;,public Date getCreatetime() ,return createtime;,public void setCreatetime(Date createtime) ,this.createtime = createtime;,26,自定义类型转换器,public class DateConverter extends,DefaultTypeConverter,Override public Object convertValue(Map context, Object value, Class toType) ,SimpleDateFormat dateFormat = new SimpleDateFormat(yyyyMMdd);,try ,if(toType = Date.class)/,当字符串向,Date,类型转换时,String params = (String) value;,/ Request.getParameterValues(),return dateFormat.parse(params0);,else if(toType = String.class)/,当,Date,转换成字符串时,Date date = (Date) value;,return dateFormat.format(date);, catch (ParseException e) ,return null;,将上面的类型转换器注册为,局部类型转换器,:,在,Action,类所在的包下放置,ActionClassName-conversion.properties,文件,,ActionClassName,是,Action,的类名,后面的,-conversion.properties,是固定写法,对于本例而言,文件的名称应为,HelloWorldAction-conversion.properties,。在,properties,文件中的内容为:,属性名称,=,类型转换器的全类名,对于本例而言,,HelloWorldAction-conversion.properties,文件中的内容为:,createtime= cn.itcast.conversion.DateConverter,27,自定义全局类型转换器,将上面的类型转换器注册为全局类型转换器:,在,WEB-INF/classes,下放置,xwork-conversion.properties,文件,。在,properties,文件中的内容为:,待转换的类型,=,类型转换器的全类名,对于本例而言,,xwork-conversion.properties,文件中的内容为:,java.util.Date,= cn.itcast.conversion.DateConverter,28,访问或添加,request/session/application,属性,public String scope() throws Exception,ActionContext ctx = ActionContext.getContext();,ctx.getApplication().put(app, ,应用范围,);,/,往,ServletContext,里放入,app,ctx.getSession().put(ses, session,范围,);,/,往,session,里放入,ses,ctx.put(req, request,范围,);,/,往,request,里放入,req,return scope;,JSP:,$applicationScope.app ,$sessionScope.ses,$requestScope.req,29,获取,HttpServletRequest / HttpSession / ServletContext / HttpServletResponse,对象,方法一,通过,ServletActionContext.,类直接获取:,public String rsa() throws Exception,HttpServletRequest request =,ServletActionContext,.getRequest();,ServletContext servletContext = ServletActionContext.getServletContext();,request.getSession(),HttpServletResponse response = ServletActionContext.getResponse();,return scope;,方法二,实现指定接口,由,struts,框架运行时注入:,public class HelloWorldAction implements ServletRequestAware, ServletResponseAware, ServletContextAware,private HttpServletRequest request;,private ServletContext servletContext;,private HttpServletResponse response;,public void setServletRequest(HttpServletRequest req) ,this.request=req;,public void setServletResponse(HttpServletResponse res) ,this.response=res;,public void setServletContext(ServletContext ser) ,this.servletContext=ser;,30,文件上传,第一步:在,WEB-INF/lib,下加入,commons-,、,commons-io-1.3.2.jar,。这两个文件可以从下载。,第二步:把,form,表的,enctype,设置为:,“,multipart/form-data“,,,如下:,第三步:在,Action,类中添加以下属性,,属性红色部分对应于表单中文件字段的名称,:,public class HelloWorldAction,private File,uploadImage,;/,得到上传的文件,private String,uploadImage,ContentType;/,得到文件的类型,private String,uploadImage,得到文件的名称,/,这里略省了属性的,getter/setter,方法,public String upload() throws Exception,String realpath = ServletActionContext.getServletContext().getRealPath(/images);,= new );,if(!() ();,(uploadImage, new , uploadImage);,return success;,31,多文件上传,第一步:在,WEB-INF/lib,下加入,commons-,、,commons-io-1.3.2.jar,。这两个文件可以从下载。,第二步:把,form,表的,enctype,设置为:,“,multipart/form-data“,,,如下:,第三步:在,Action,类中添加以下属性,,属性红色部分对应于表单中文件字段的名称,:,public class HelloWorldAction,private File,uploadImages,;/,得到上传的文件,private String,uploadImages,ContentType;/,得到文件的类型,private String,uploadImages,得到文件的名称,/,这里略省了属性的,getter/setter,方法,public String upload() throws Exception,String realpath = ServletActionContext.getServletContext().getRealPath(/images);,= new );,if(!() ();,for(int i=0 ;iuploadImages.length; i+) = uploadImagesi;,(uploadImage, new , uploadImagesi);,return success;,32,自定义拦截器,要自定义拦截器需要实现,com.opensymphony.xwork2.interceptor.Interceptor,接口:,public class PermissionInterceptor implements Interceptor ,private static final long serialVersionUID = -51783102L;,public void destroy() ,public void init() ,public String,intercept,(ActionInvocation invocation) throws Exception ,System.out.println(,进入拦截器,);,if(session,里存在用户,),String result,= invocation.invoke();,else,return “logon”;,/System.out.println(,返回值,:+ result);,/return result;,33,自定义拦截器,/WEB-INF/page/hello.jsp,因为,struts2,中如文件上传,数据验证,封装请求参数到,action,等功能都是由系统默认的,defaultStack,中的拦截器实现的,所以我们定义的拦截器需要引用系统默认的,defaultStack,,这样应用才可以使用,struts2,框架提供的众多功能。,如果希望包下的所有,action,都使用自定义的拦截器,可以通过,把拦截器定义为默认拦截器。注意:每个包只能指定一个默认拦截器。另外,一旦我们为该包中的某个,action,显式指定了某个拦截器,则默认拦截器不会起作用。,34,输入校验,在,struts2,中,,,我们可以实现对,action,的,所有方法,进行校验或者对,action,的,指定方法,进行校验。,对于输入校验,struts2,提供了两种实现方法,:,1.,采用手工编写代码实现。,2.,基于,XML,配置方式实现。,35,手工编写代码实现对,action,中所有方法输入校验,通过重写,validate(),方法实现,,validate(),方法会校验,action,中所有与,execute,方法签名相同的方法。当某个数据校验失败时,我们应该调用,addFieldError(),方法往系统的,fieldErrors,添加校验失败信息(为了使用,addFieldError(),方法,,action,可以继承,ActionSupport,),如果系统的,fieldErrors,包含失败信息,,struts2,会将请求转发到名为,input,的,result,。在,input,视图中可以通过,显示失败信息。,validate(),使用例子:,public void,validate,() ,if(this.mobile=null | .equals(this.mobile.trim() this.addFieldError(username, ,手机号不能为空,);,else if(!Ppile(1358d9).matcher(this.mobile.trim().matches(),this.addFieldError(“mobile, ,手机号的格式不正确,); ,验证失败后,请求转发至,input,视图:,/WEB-INF/page/addUser.jsp,在,addUser.jsp,页面中使用,显示失败信息。,36,手工编写代码实现对,action,指定方法输入校验,通过,validateXxx(),方法实现,,validateXxx(),只会校验,action,中方法名为,Xxx,的方法。其中,Xxx,的第一个字母要大写。当某个数据校验失败时,我们应该调用,addFieldError(),方法往系统的,fieldErrors,添加校验失败信息(为了使用,addFieldError(),方法,,action,可以继承,ActionSupport,),如果系统的,fieldErrors,包含失败信息,,struts2,会将请求转发到名为,input,的,result,。在,input,视图中可以通过,显示失败信息。,validateXxx(),方法使用例子:,public String,add,() throws Exception return success;,public void,validateAdd,(),if(username=null & .equals(username.trim(),this.addFieldError(username, ,用户名不能为空,);,验证失败后,请求转发至,input,视图:,/WEB-INF/page/addUser.jsp,在,addUser.jsp,页面中使用,显示失败信息。,37,输入校验的流程,1,。,类型转换器对请求参数执行类型转换,并把转换后的值赋给,action,中的属性。,2,。,如果在执行类型转换的过程中出现异常,系统会将异常信息保存到,ActionContext,,,conversionError,拦截器将异常信息添加到,fieldErrors,里。不管类型转换是否出现异常,都会进入第,3,步。,3,。系统通过反射技术先调用,action,中的,validateXxx(),方法,,Xxx,为方法名。,4,。再调用,action,中的,validate(),方法。,5,。,经过上面,4,步,如果系统中的,fieldErrors,存在错误信息(即存放错误信息的集合的,size,大于,0),,系统自动将请求转发至名称为,input,的视图。如果系统中的,fieldErrors,没有任何错误信息,系统将执行,action,中的处理方法。,38,基于,XML,配置方式实现对,action,的所有方法进行输入校验,使用基于,XML,配置方式实现输入校验时,,Action,也需要继承,ActionSupport,,,并且提供校验文件,校验文件和,action,类放在同一个包下,文件的取名格式为:,ActionClassName-validation.xml,,其中,ActionClassName,为,action,的简单类名,,-validation,为固定写法。如果,Action,类为,cn.itcast.UserAction,,那么该文件的取名应为:,UserAction-validation.xml,。,下面是校验文件的模版:,true,用户名不能为空,!,指定,action,中要校验的属性,,,指定校验器,上面指定的校验器,requiredstring,是由系统提供的,系统提供了能满足大部分验证需求的校验器,这些校验器的定义可以在,xwork-2.x.jar,中的,com.opensymphony.xwork2.validator.validators,下的,default.xml,中找到。,为校验失败后的提示信息,如果需要国际化,可以为,message,指定,key,属性,,,key,的值为资源文件中的,key,。,在这个校验文件中,对,action,中字符串类型的,username,属性进行验证,首先要求调用,trim(),方法去掉空格,然后判断用户名是否为空。,39,编写校验文件时,不能出现帮助信息,在编写,ActionClassName-validation.xml,校验文件时,如果出现不了帮助信息,可以按下面方式解决:,windwos-preferences-myeclipse-files and editors-xml-xmlcatalog,点,“,add”,在出现的窗口中的,location,中选,“,”,然后在,xwork-2.1.2,解压目录的,srcjava,目录中选择,xwork-validator-1.0.3.dtd,回到设置窗口的时候不要急着关闭窗口,应把窗口中的,Key Type,改为,URI,。,Key,改为,40,struts2,提供的校验器列表,系统提供的校验器如下:,required,(,必填校验器,要求,field,的值不能为,null),requiredstring,(,必填字符串校验器,要求,field,的值不能为,null,并
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 大学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!