【Jsp精品源码栏目提醒】:网学会员,鉴于大家对Jsp精品源码十分关注,论文会员在此为大家搜集整理了“【精品】struts1.x学习笔记 - 其它资料”一文,供大家参考学习!
Struts1.x 学习笔记 各种 action 的基本配置与使用lt--struts1.x的action配置都很简单,继承自Action的自定义Action配置如下,当要进生输入校验时必设置validate为trueinput 指定验证出错后要返回的页面 --gt ltaction pathquot/registerquot typequotcom.kettas.action.UserActionquot inputquot/register.jspquot validatequottruequot namequotuserFormquotgt ltforward namequotsuccessquot pathquot/result.jspquotgtlt/forwardgt lt/actiongtlt--继承自MappingDispatcherAction,多了一个parameter属性,此属性指定本此请求调用此action中的哪个方法。
--gt ltaction pathquot/updateorderquot typequotcom.kettas.action.OrderActionquot parameterquotupdateOrderquotgt ltforward namequotsuccessquot pathquot/result.jspquotgtlt/forwardgt lt/actiongtlt--继承自DispatcherAction跟继承自MappingDispatcherAction配置相同,不过parameter的含义不同,它后面指定的值要在请求此action的url后面加上,如一个删除订单的请求应该为http://localhost/shopcart/deleteorder.domethoddeleteOrder 其中method后面的值为要调用action的方法名。
--gt ltaction pathquot/deleteorderquot typequotcom.kettas.action.OrderActionquot parameterquotmethodquotgt ltforward namequotsuccessquot pathquot/result.jspquotgtlt/forwardgt lt/actiongt lt-- LookupDispatcherAction与DispatcherAction的配置相同,但是含义不同 它的parameter指的是页面按提交按钮的name值。
并且按键的value必须要有资源文件的支持,且在其action中 指定这个值与action内的方法的对应关系。
很麻烦,由此可见这个LookupDispatcherAction实在不常用! --gt ltaction pathquot/usermanagequot typequotcom.kettas.action.UserLookupActionquotparameterquotcallmethodquotgt ltforward namequotsuccessquot pathquot/ok.jspquotgtlt/forwardgt lt/actiongt 异常处理 Strut1.x 的异常处理蛮简单。
配置时分为全局,异常与局部异常。
对于一个 action 若发生异常则先查找本身 action 是否有相应异常的配置,若无则查找全局异常配置,还没有 则报错。
异常处理一定会用到资源文件 1. 局部配置如下 lt-- key指定信息在资源文件中的键值 type指发生的异常类型。
bundle使用哪个资源文件,不配置则使用默认的资源文件 --gt ltexception keyquotuser.registerquot typequotcom.kettas.exception.UserRegisterExceptionquot bundlequotexceptionquot pathquot/error.jspquot/gt 2. 全局配置如下,各属性与局部配置一样 ltglobal-exceptionsgt ltexception keyquotuser.registerquottypequotcom.kettas.exception.UserRegisterExceptionquot bundlequotexceptionquotpathquot/error.jspquot/gt lt/global-exceptionsgt 3.对于一个异常,通过会转入另外一个页面,提示错误,struts1.x 在此设计有些不合理,一旦转入异常提示页面时,即使这个页面设置了 isErrorPagequottruequot但是它的内置有 exception 对象依然为空,所以不能用 exception 得到异常中的信息,只能用lthtml:errors /gt来得到,一大失误哦,这也就是说 struts1.x的异常处理是离不开资源文件的,因为异常的信息只能放在资源文件中。
国际化 国际化要对就资源文件,这必须在 struts-config.xml 中指定,与 struts2 中则不需。
配置方法: ltmessage-resourcesparameterquotcom.kettas.resources.messagesquot gtlt/message-resourcesgt ltmessage-resources parameterquotcom.kettas.resources.informationquotkeyquotinformationquot gtlt/message-resourcesgt 其中第一种配置为默认配置,没有指定其key属性,则struts会自动将其key设为org.apache.struts.action.MESSAGE,
源码可查,且一旦要使用资源文件则一定要有一个不能有key属性,即一定要给org.apache.struts.action.MESSAGE指定一个资源文件,struts默认此资源文件为全局资源文件,即以后使用资源文件的地方若没有指定其使用哪个文件,则会从这个默认配置资源文件中找。
Struts会将资源文件打包MessageResourcesConfig以key值为键放在ServletContext的作用域中,在其它使用到资源文件的地方可以key值指定使用哪个资源文件中的键值对类型转换 1. struts的页面的国际化 使用ltbean:message bundlequotinformationquot keyquoterrors.validwhenquot arg0quotparam1quot arg1quotparam2quot/gt Bundle指定是使用哪个资源文件,即在资源文件配置时指定的key值。
Key为资源文件中的键值。
Arg0arg1指若资源文件中有占位符时用来替代的值。
2. struts的异常的国际化 lt-- key指定信息在资源文件中的键值 type指发生的异常类型。
bundle使用哪个资源文件,不配置则使用默认的资源文件 --gt ltexception keyquotuser.registerquottypequotcom.kettas.exception.UserRegisterExceptionquot bundlequotexceptionquotpathquot/error.jspquot/gt 3. struts的输入验证的国际化配置:ltfield propertyquotuserNamequot dependsquotrequiredquotgt lt-- msg的key值为资源文件中键值,name指定这个消息为哪个验证器指定, 因为一个field可以同时指定几个验证器。
bundle指定使用哪个资源文件,这个值在资源文件配置时被指定为key值。
arg用来代替信息中的点为符 --gt ltmsg keyquoterrors.requiredquot namequotrequiredquot bundlequotinformationquot/gt ltarg positionquot0quot keyquotuserNamequot resourcequotfalsequot /gtlt/fieldgt 输入验证 一.使用验证框架 (输入验证时需要用到如下两个 jar 包 commons-validator.jar 与 oro.jar.) 注意:要进行框架验证的 Form 必须继承自 ValidatorForm,ValidatorActionForm。
以及使用动态的 DynaValidatorForm 和 DynaValidatorActionForm。
其中 ValidatorForm 与 DynaValidatorForm 在验证文件的配置时相同,另外两个相同。
前两个匹配 action 配置中的 name,而后两个匹配的是 action 配置中的 path.由此可知两者在使用上的一些局限性。
1. 框架的基本配置 Struts 的验证框架默认是并不打开的,以插件的形式运行,在使用之前要进行插件注册,注册配置为 ltplug-in classNamequotorg.apache.struts.validator.ValidatorPlugInquotgt ltset-property propertyquotpathnamesquot valuequot/org/apache/struts/validator/validator-rules.xml /WEB-INF/validation.xmlquot /gt lt/plug-ingt 其 set-property 的 property 属性的值可以在
源码找到,这个配置可以到 struts 提供的示例程序中去拷。
对于不同版本的 struts1.x 它的 validator-rules.xml 放置的位置可能并不太一样,这点不能硬搞。
另外 validation.xml 为验证文件。
2. 验证文件基本配置:ltxml versionquot1.0quot encodingquotutf-8quot gtltDOCTYPE form-validation PUBLIC quot-//Apache Software Foundation//DTD Commons Validator Rules Configuration1.3.0//ENquot quothttp://jakarta.apache.org/commons/dtds/validator_1_3_0.dtdquotgtltform-validationgt ltformsetgt ltform namequotuserFormquotgt lt-- 验证文件的配置 --gt ltfield propertyquotuserNamequot dependsquotrequiredmaxlengthquotgt lt-- msg的key值为资源文件中键值,name指定这个消息为哪个验证器指定, 因为一个field可以同时指定几个验证器用逗号分开。
bundle指定使用哪个资源文件,这个值在资源文件配置时被指定为key值。
arg用来代替信息中的点为符,其position确定占位符的位置,key确定占位符的值,若 此值来自资源文件还要指定来自哪个资源文件,用bundle指定。
若不是则要显示指出 其resource为false此时它的key值会直接代替占位符.另外如下所示,它还可以引用定义的变量。
另外arg还有name属性指定它为哪个msg生成占位信息。
--gt ltmsg keyquoterrors.requiredquot namequotrequiredquot bundlequotinformationquot/gt ltmsg keyquoterrors.maxlengthquot namequotmaxlengthquot bundlequotinformationquot/gt ltarg positionquot0quot keyquotuserNamequot resourcequotfalsequot /gt ltarg positionquot1quot keyquotvar:maxlengthquot resourcequotfalsequot/gt ltvargt lt-- 为什么叫maxlength ,可以在这个验证器的实现类中找到 --gt ltvar-namegtmaxlengthlt/var-namegt ltvar-valuegt10lt/var-valuegt lt/vargt lt/fieldgt ltfield propertyquotuserPwdquot dependsquotrequiredquotgt ltmsg keyquoterrors.requiredquot namequotrequiredquot /gt ltarg positionquot0quot keyquotuserPwdquot resourcequotfalsequot /gt lt/fieldgt lt-- 下面的这个验证很有用,可以用来验证两个表单是否相等 它有个texst参数,只有这个值为真时才能通过验证。
其写法比较固定。
this指本字段,与别的字段比较则它其名字,实事上是form的属性 --gt ltfield propertyquotreUserPwdquot dependsquotvalidwhenquotgt ltarg positionquot0quot keyquotrepasswordquot resourcequotfalsequot/gt ltarg positionquot1quot keyquotpasswordquot resourcequotfalsequot/gt ltmsg namequotvalidwhenquot keyquoterrors.validwhenquot/gt ltvargt ltvar-namegttestlt/var-namegt ltvar-valuegtthisuserPwdlt/var-valuegt lt/vargt lt/fieldgt lt-- --gt ltfield propertyquotbirthdayquot dependsquotrequireddatequotgt ltmsg keyquoterrors.requiredquot namequotrequiredquot /gt ltmsg keyquoterrors.typeinvalidquot namequotdatequot /gt ltarg positionquot0quot keyquotbirthdayquot resourcequotfalsequot /gt ltvargt ltvar-namegtdatePatternlt/var-namegt ltvar-valuegtYYYY-MM-DDlt/var-valuegt lt/vargt lt/fieldgt lt/formgt lt/formsetgtlt/form-validationgt二,重载ActionForm的validate方法 1.这种方法很简单,有一点是往ActionErrors里面加入ActionMessage时ActionMessage的重载构造 方法可以确定传递进去的字符串是否来自资源文件以及在资源文件中的键值,若不是来自资源文件则此键值 将会被显示,它不能指定这个键值来自哪个资源文件,这要靠页面标签来确定,这种设计明显不些不合理但 也很无奈。
而ActionErrors的add方法指定这个信息的标识符,即页面上用struts的标签以此标识来显 示错误信息。
2.当Validate验证出错时会返回到action指定的input页面。
出错的标志为ActionErrors里面是否有 ActionMessage. 3.在页面上可以用struts标签得到错误信息。
lthtml:errors propertyquotusername.requiredquot bundlequotvalidateerrorsquot/gtProperty指定在ActionErrors的add方法指定的标识符,bundle指定ActionErrors添加的ActionMessage的键值来自哪个资源文件。
4.要注意框架验证与重载ActionForm的validate方法的验证不能同时使用,若同时存在则只执行validate验证。
动态表单的使用 1. 基本使用 基本配置lt-- 若要进行表单验证则要使用用DynaValidatorForm或者DynaValidatorActionFrom. 前者在Validation.xml中匹配的是action的name属性,即可以认为在validation.xml中 对此form进行验证,而后者匹配的是action的path属性。
即对action进行验证,由此可见两的适用范围。
若不必要进行验证,则只要使用最简单的DynaActionForm就可以了! --gt ltform-bean namequotproductFormquottypequotorg.apache.struts.validator.DynaValidatorFormquotgt ltform-property namequotproductNamequot typequotjava.lang.Stringquotgtlt/form-propertygt ltform-property namequotproductPricequot typequotjava.lang.Doublequotgtlt/form-propertygt ltform-property namequotproductDatequot typequotjava.util.Datequotgtlt/form-propertygt ltform-property namequotdiscriptionquot typequotjava.lang.Stringquotgtlt/form-propertygt lt/form-beangt lt-- - 在action中,要取出Dyna...FromKnow的值必须要用其get方法,值入参数值,实际上,Dyna...From里面就是将这 此值保存在一个Map中。
另外要注意的是,在页面取值是,继承自ActionForm的表单取值很简单,但是继承动态表单的则不同,它必须先得到Map,然后才能得到其值。
Eg:productForm.map.productName 由此也可知Map在页面用el表达示取值的方法。
--gt 2. 输入验证 基本配置 它的配置与普通表的ActionForm一样,没有任何区别。
这就不多说了! Struts1.x的上传与下载 1. 文件上传 lt-- form的配置,很简单,但是很必要,好像只能用动态表单。
另外不定数量的文件上传并不太好解 决 --gt ltform-bean namequotphotoFormquot typequotorg.apache.struts.validator.DynaValidatorFormquotgt ltform-property namequotphoto1quot typequotorg.apache.struts.upload.FormFilequotgt lt/form-propertygt ltform-property namequotphoto2quot typequotorg.apache.struts.upload.FormFilequotgt lt/form-propertygt ltform-property namequotphoto3quot typequotorg.apache.struts.upload.FormFilequotgt lt/form-propertygt lt/form-beangt ------------------------------------------------------------------ lt-- 跟普通的action的配置没有任何区别 --gt ltaction pathquot/uploadquot typequotcom.kettas.action.UploadActionquot namequotphotoFormquotgt ltforward namequotsuccessquot pathquot/ok.jspquotgtlt/forwardgt lt/actiongt ------------------------------------------------------------------------------ ltform actionquotltrequest.getContextPath gt/upload.doquot methodquotpostquot enctypequotmultipart/form-dataquotgt ltinput typequotfilequot namequotphoto1quotgt ltinput typequotfilequot namequotphoto2quotgt ltinput typequotfilequot namequotphoto3quotgt ltinput typequotsubmitquotgt lt/formgt ------------------------------------------------------------------package com.kettas.actionimport java.io.FileOutputStreamimport java.util.import javax.servlet.http.HttpServletRequestimport javax.servlet.http.HttpServletResponseimport org.apache.struts.action.import org.apache.struts.upload.FormFileimport org.apache.struts.upload.MultipartRequestHandlerpublic class UploadAction extends Action SuppressWarningsquotuncheckedquotOverridepublic ActionForward executeActionMapping mapping ActionForm form HttpServletRequest request HttpServletResponse response throws Exception DynaActionForm dafDynaActionFormform MultipartRequestHandler handlerdaf.getMultipartRequestHandler Hashtable photoshandler.getFileElements Set setphotos.keySet System.out.printlnset.size Iterator valuesset.iterator whilevalues.hasNext FormFile fileFormFile photos.getvalues.next System.out.printlnfile.getFileName FileOutputStream outnew FileOutputStreamquotc:quotfile.getFileName out.writefile.getFileData out.close return mapping.findForwardquotsuccessquot 2. 文件下载文件下载功能是通过DownloadAction实现的。
继承DownloadAction。
实现getStreamInfo方法,返回StreamInfo对象。
部分代码的实现:package com.kettas.actionimport java.io.Fileimport javax.servlet.http.import org.apache.struts.action.import org.apache.struts.actions.DownloadActionpublic class TestDownLoad extends DownloadAction Override / 这个类可以没有execute方法。
因为通过链接下载文件成功成没有必要跳转,当然也可以 做到这时文件下载将会被抑制,就没有下载的意义了。
它的配置与其它的action没有任何区别 / protected StreamInfo getStreamInfoActionMapping mapping ActionForm form HttpServletRequest request HttpServletResponse response throwsException String fileName quottest.txtquot response.setHeaderquotContent-dispositionquot quotattachment filenamequot fileName File file newFilethis.servlet.getServletContext.getRealPathquot/uploadquotquot//quotfileName return new FileStreamInfoquottext/htmlquot file Struts1.x的其它一些问题 1. 时间类型先set验证时出现问题查了很多资料,基本上没有好的解决办法,struts给的示例中用动态表单来接收数据,而接收时间的字段也是字符串类型,这样就避免了转换,并且可以进行格式验证。
当这个动态表单数据传入action时,按需要再将这个字符串转成时间类型。
由此也算是struts的ActionForm的一个硬伤。
对于没有时间类型的form表单用静态actionform可以,若有则最好用动态。
其实其本上所有的表单提交用动态都行。
推荐这么做 2. 一些有用的技巧。
对于form表达的提交按钮,如果这个按钮有name属性,则这个按钮的值也会被提交,若则不会,struts 的LookupDispatcherAction就是以此来实现的。
Struts内置了个小东西,若是一个submit的name值 org.apache.struts.action.CANCEL则在执行业务方法前调用Action的isCancelled方法可 以确定是否点了这个按钮以此来写此相应代码!当然这些实现很简单,自已也可以实现! Struts1.x的防止表单的重复提交 Struts的令牌机制 在转入提交表单的action中要调用saveToken方法,这样将会在session中放入令牌, 并将生成的令牌放入表单提交页面,一般放在一个隐藏域中,用el表达式给其符值,且隐藏域的名称为固定 的 org.apache.struts.action.TOKEN 这可以从Globals.class中找到。
在处理表单提交的action中要调用isTokenValid方法来判断是否是第一次提交。
把表单处理后调用resetTokenrequest将session中的令牌重置(其实这个重置似乎并没有太大意义)。
由上面的可知,可以自己来实现一个令牌使用 Struts的titles框架 1. 在页面直接使用titles标签 .