struts2x学习笔记.docx
- 文档编号:19082854
- 上传时间:2023-04-24
- 格式:DOCX
- 页数:36
- 大小:32.14KB
struts2x学习笔记.docx
《struts2x学习笔记.docx》由会员分享,可在线阅读,更多相关《struts2x学习笔记.docx(36页珍藏版)》请在冰豆网上搜索。
struts2x学习笔记
Struts2的基本配置
1.在Tomcatwebapps以外的路径部署WEB程序要在Tomcatserver.xml加入以下标签:
\Projects\Struts2\WebRoot"reloadable="true"/> 其中path指定应用程序名,docBase指定应用程序所在路径,reloadable指定自动加载! 2.加载JAR包,只要将必要的包加入就可以了 ●commons-logging-1.0.4.jar ●freemarker-2.3.8.jar ●ognl-2.6.11.jar ●struts2-core-2.0.14.jar ●xwork-2.0.7.jar当然版本可能有点变化,我用的是struts-2.0.14 3.配置过滤器,相对于struts1中的ActionServlet 方法: 在web.xml中加入如下标签 4.建立struts的配置文件,struts.xml位于classes根目录下。 可以从struts提供的例子程序中拷贝。 主体如下: xmlversion="1.0"encoding="UTF-8"? > DOCTYPEstrutsPUBLIC "-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN" "http: //struts.apache.org/dtds/struts-2.0.dtd"> 5.struts2中的用户action不必要再继承任何struts2提供的任何类型。 其用户action可以提供一些实例变量并且为每个实例变量提供gettersetter方法。 既,其用户action代替了struts1中的ActionForm。 但是自定义的action中必须有一个publicStringexecute()方法,其返回值将匹配struts.xml相应action标签中的result标签中的name属性。 事实上事际开发时一般继承ActionSupport 6.form表单中的表单控件的name属性可于自定义的action中的实例变量的属性名相同 7.配置自定义的action 在struts.xml中的struts标签下加入如下标签: --action中的name对应提交表单中的actionclass对应用户自定义的action类 result的name属性可以不写,不写的话默认的为success --> Struts2的类型转换 1.当用户自定义Action继承ActionSupport时,可以使用ActionSupport很多功能 比如validate()若在validate函数中调用addFieldError(StringfieldName,StringerrorMessage)方法的话,既表示表单验证出错,会转向相应action中的resultname=”input”所指定的页面,一般我们会指表单的提交页面,因为此方法会对相应表单控件指定错误信息,由方法名可知! fieldName对应提交数据的表单控件的name 2.类型转换 自己的转换类要继承StrutsTypeConverter实现里面的两个抽象方法convertFromString(Mapcontext,String[]values,ClasstoClass)和converToString(Mapcontext,Objecto)方法第一个方法中的String[]values是指form表单中的name属性相同的控件提交的字符串数组,如果对应name只有一个,则只取第一个元素.对于局部的类型转换则转换的配置文件放在与自定义的Action的类字节码文件放在一个包下面,并且名子为自定义的Action类名加上-conversion.properties如: SelfAction-conversion.properties并且在配置文件中写上要转换属性的相应的转换类! 而全局的类型转换文件则为: xwork-conversion.properties配置文件中写要转换的全局类及其转换类如下: packagecom.kettas.entity; publicclassPoint{ privatedoublex; privatedoubley; publicdoublegetX(){ returnx; } publicvoidsetX(doublex){ this.x=x; } publicdoublegetY(){ returny; } publicvoidsetY(doubley){ this.y=y; } } packagecom.kettas.action; importcom.opensymphony.xwork2.ActionSupport; publicclassTestConversionAcionextendsActionSupport{ privatePointpone; privatePointptwo; publicPointgetPone(){ returnpone; } publicvoidsetPone(Pointpone){ this.pone=pone; } publicPointgetPtwo(){ returnptwo; } publicvoidsetPtwo(Pointptwo){ this.ptwo=ptwo; } @Override publicStringexecute()throwsException{ returnthis.SUCCESS; } @Override publicvoidvalidate(){ super.validate(); } } 如果要将自定义的Action中的两个属性pone和ptwo转换过来则需要写如下转换类: packagecom.kettas.action; importjava.util.Map; importorg.apache.struts2.util.StrutsTypeConverter; importcom.kettas.entity.Point; publicclassPointConvertextendsStrutsTypeConverter{ @Override publicObjectconvertFromString(Mapmap,String[]values,ClasstoClass){ String[]xy=values[0].split(","); doublex=Double.parseDouble(xy[0]); doubley=Double.parseDouble(xy[1]); Pointp=newPoint(); p.setX(x); p.setY(y); returnp; } @Override publicStringconvertToString(Mapmap,Objecto){ Pointp=(Point)o; return"["+p.getX()+","+p.getY()+"]"; } } 局部类转文件名为: TestConversionAction-conversion.properties 内容为: pone=com.kettas.action.PointConvert ptwo=com.kettas.action.PointConvert 全局为: xwork-conversion.properties 内容为: com.kettas.entity.Point=com.kettas.action.PointConvert 对于一些简单的类型则struts2会自动进行类型转换。 如intdoublefloatDate等常用类型 对于int转换不成功则会自动赋值为0,这显然有时并不太合理(但也很无奈)。 Date则为null,比较合理 Struts2的输入验证 ●当类型转换成功以后,struts2将进行输入验证 若要进行输入验证则你的action必须继承ActionSupport类,实现其validate方法 在方法中调用addFiledError方法为验证失败的字段加上错误信息 注意若是一旦有验证失败的信息,struts会自动转入配置文件input中,若没有则出错! 若类型转换时就出错,也会转回input指定的页面并产生一条信息也加入到FiledError中, 在input指定页面中可以用struts标签 fielderror> fielderror>读出所有转换失败的信息与验证失败的信息 fielderror> param>field1 param>指定显示field1字段的信息 fielderror> ●类型转换失败后struts2会自动产生转换失败的信息,一般这种信息并不是想看到得,可以通过配置及及资源文件来替换掉其内置信息 方法: 在struts.xml中加入以下语句: 其中name不能变(可以在struts的jar包里面的default.properties找到),表示国际化资源文件的前缀名如中文资源文件为: message_zh.properties 英文为: message_en.properties若为默认的则为: message.properties其中资源文件要放在classes文件下面,如在message.properties下面加上一句: xwork.default.invalid.fieldvalue={0}error 若中{0}为占位符,在发生转换错误时struts2会自动将此占位符替换成发生错误的字段名,这句话的key不能变(可以从xwork-message.properties中找到,注意每个单词都是小写),value可以自定义,这样的配置为全局配置,即所有的发生转换错误都会调用此默认的格式,一般很少这么使用,因为控制并不精确 局部转换错误替换信息的配置: 在要转换的action的同一包下: 名字为: actionName.properties即名称与action名称相同。 里面的内容为 invalid.fieldvalue.attributeName=xxxxxmessage 其中invalild.fieldvalue不能变,struts2会以此来判断是不是用来类型转换时的替换信息 attributeName为action中的属性名称 基中int类型转换时会有些问题,若abc转换为int转换会失败,即产生转换失败信息,但是struts2会自动将此字段赋值为0,这些要注意 ●一个action里封装多个业务处理方法,即相当于struts1.x中的DispatcherAction与MappingDispatcherAction一样,不过这个action依然只继承ActionSupport. 在自定义且继承ActionSupport的Action中加入业务处理方法,在struts.xml中的相应配置中加入 -- 使用struts2的action很简单,也只继承一个ActionSupport就可以了,完全可以实现struts1.x中的 Action,MappingDispatcherAction,DispatcherAction要实现的功能。 添加一个method属性则请求此action时会调用对应名称的业务处理方法。 若不加,则有两种情况 1.执行默认的execute方法。 (此时请求的的path为register.action) 2.执行指定的方法,这个指定要在请求时指定.(此时请求的path为register.action! callMethodName.action) 比较奇怪,不过好用。 --> --result的name属性可以不写,不写的话表示为success--> -- 为这个action指定拦截器,若不指定则会使用此包的默认拦截器 若指定一个拦截器,则此包的默认拦截器则不会被用于拦截此action 所以若还要使用默认拦截器时必须显示指出,如下: --> 这里要注意对于同一个自定义的action中所有的业务处理方法在执行前一定会执行validate方法,这显然有时并不合理。 Struts2对于不同的业务处理方法的验证采用默认规则,即validate+业务处理方法名.如register()的验证方法为validateRegister().但是依然会执行validate()方法。 解决方法有两个。 1.不重写validate方法2.将validate方法名改为validateExecute().因为execute()方法为action的默认方法,即struts.xml文件中没有配置method属性时会自动调用此方法。 将validate改为validateExecute()后则此验证方法只验证execute() Struts2的校验框架 ●Struts2的校验框架是针对一个action进行的(即一个action类一个校验文件,文件名也有一点的规则: actionName-validation.xml),用xml文件进行配置,这点有些类似于struts1.x Xml文件的结构为 它的服务器端校验分为两种方式,一种是基于字段的,一种是基于验证器的,事实上两种方法是一回事,只是看问题的方面不同而已 xmlversion="1.0"encoding="UTF-8"? > DOCTYPEvalidatorsSYSTEM"> --基于字段的方式 filed的name属性为要验证action的属性 field-validator的type属性为用哪种校验器来校验,这个值可以从 com.opensymphony.xwork2.validator.validators包下面的default.xml中找到 short-circuit是指定当本验证器验证失败后后面的验证器是否还继续验证。 蛮有用 其中param的name属性为对应校验器的java类的属性 message为校验失败后添加到fielderror中的信息。 --> -- 基于校验器的方式 其中每个校验器的最一个param的name的值都为fieldName固定不变, 表示校验action中的哪个属性 以后的param的name与基于字段的校验的含义一样 可以看出基于校验器的验证并不如基于字段的验证看来直接(两者可以混合使用) --> 要注意的是同样一个自定义的action中有几个业务处理方法时也可以对每个业务处理方法进行校验。 校验文件与此action放在同一个包下,并且名字为: actionName-methodName-validation.xml 需要注意的是如果也为此action也配置了actionName-validation.xml文件,则此文件也会被使用于校验,应该尽量避免这种情况: 方法与上面上同,将actionName-validation.xml改为actionName-execute-validation.xml使此文件专用于默认的execute业务方法的校验。 (事实上这种情况似乎遇到的并不多) Struts2提供的客户端校验最好不要使用,有很大缺陷! Struts2的拦截器 ●自定义的拦截器的方法有三种: 1.实现Interceptor接口(实现intercept) 注意: intercept的参数ActionInvocation必须调用invoke方法后才后继续执行下面的拦截器,直到所有的拦截器都执行完后再执行所拦截action的业务方法,最后执行下面的程序,类似一个栈,所以有拦截栈的说法。 其返回的字符串即为action类的业务方法返回的值 packagecom.kettas.interceptor; importcom.opensymphony.xwork2.ActionInvocation; importcom.opensymphony.xwork2.interceptor.Interceptor; @SuppressWarnings("serial") publicclassFirstInterceptorimplementsInterceptor{ privateStringparamOne; privateStringparamTwo; publicStringgetParamOne(){ returnparamOne; } publicvoidsetParamOne(StringparamOne){ this.paramOne=paramOne; } publicStringgetParamTwo(){ returnparamTwo; } publicvoidsetParamTwo(StringparamTwo){ this.paramTwo=paramTwo; } publicvoiddestroy(){ } publicvoidinit(){ } publicStringintercept(ActionInvocationactionInvocation)throwsException{ System.out.println(paramOne+"dobeforeinFirstInterceptor! "); Stringresult=actionInvocation.invoke();//调用下一级拦截器 System.out.println(paramTwo+"doafterinFirstInterceptor! "); returnresult; } } 2.继承AbstractInterceptor抽象类(一般会这么用) packagecom.kettas.interceptor; importcom.opensymphony.xwork2.ActionInvocation; importcom.opensymphony.xwork2.interceptor.AbstractInterceptor; @SuppressWarnings("serial") publicclassSecondInterceptorextendsAbstractInterceptor{ @Override publicStringi
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- struts2x 学习 笔记