struts2校验框架客户端校验报错

最近写一个分类管理的页面时,把分类列表和添加分类的表单放置到一个页面上了,在同一个Action中设置list()和add()方法分别负责分类的罗列和添加,对添加分类的action设置了校验,action配置如下:
&package name="admin" extends="struts-default" namespace="/admin"&
&action name="cateList" class="cateAction" method="list"&
&result&/admin/cateList.jsp&/result&
&result name="input"&/admin/cateList.jsp&/result&
&action name="addCate" class="cateAction" method="add"&
&result type="redirectAction"&cateList&/result&
&result name="input" type="redirectAction"&cateList&/result&
&/package&
在添加分类操作时,如果分类名合格,则可以正常添加,一旦提交一个导致校验失败的分类名之后,会正确提示错误信息,但诡异的问题出来了,之后无论你提交什么数据,都只会显示最早出错的信息,而且根据debug来看,Action中的负责添加分类的add()方法根本就没有执行,即使你刷新页面也是如此,除非重新启动服务。
这个问题困扰了很久,后来看javaeye上某位的文章时,谈到在execute方法执行之前,会先执行validate方法,如果发现有errors,直接就中转到input了。看来问题就出在这里!
我为add方法添加了validateAdd()校验方法,在里面手动清除actionErrors信息,终于达到了预期的效果。
public void validateAdd() {
clearErrorsAndMessages();
虽然问题解决了 ,但仍不明就理,我使用的是redirect跳转,为什么信息没有清除,我试着把列表和添加的方法分写在两个Action里面,結果错误信息并没有带过去。这里面的工作机制是什么,烦请各位给小弟讲解下。
再就是,我解决这个问题的方法貌似不是很中规中矩,不知道大家遇到这种问题都是怎么处理了,我上csdn查了半天,反正是一个像样的答案都没有找到,都是些风马牛不相及的回答。在javaeye上虽然找到类似的问题,但是并没有深入得讲。
问题补充fbj203 写道你的action对象托管给spring了,spring默认又是单例的,所以每次都操作同一个对象。原来如此呀,那如果把scope改变为prototype或者request的话,如何在从一个action redirect到另一个action的时候把出错信息也带过去呢?
放request是四海一家的解决之道&&
可以在cateList action里面设置一个字段errorStr,保存错误消息,把出错信息作为参数redirect进去
你的action对象托管给spring了,spring默认又是单例的,所以每次都操作同一个对象。
已解决问题
未解决问题带你认识更牛的人下载即送20张免费照片冲印
扫码下载App
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
EmployeeAction-saveEmployee-validation.xml &field name="age"&
&field-validator type="int"&
&param name="min"&18&/param&
&param name="max"&100&/param&
&message&年龄必须为 ${min} 至 ${max} 之间的数字&/message&
&/field-validator& &/field&解决:可以在定义POJO类的时候,默认是SetAge(Integer age),再定义一个函数SetAge(String age),如果解析成数字的过程中出错,就让age=0,那么如果用户输入了字母之后,就变成了0,0不符合验证条件,系统就会提示指定的错误信息。Employee.java public void setAge(Integer age) {
this.age= } public void setAge(String age) {
this.age = Integer.parseInt(age);
} catch (NumberFormatException nfe) {
this.age= 0;
阅读(861)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_',
blogTitle:'Struts2中通过validation.xml验证数字,后台报错',
blogAbstract:'问题:在struts2中使用validation.xml配置文件验证数字,前台页面如果输入了非数字,那么系统会报错。EmployeeAction-saveEmployee-validation.xml',
blogTag:'struts2,验证,数字,integer,int',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:0,
publishTime:8,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'0',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}struts2实践- 结合jquery的纯客户端js表单校验 - myoldman - ITeye技术网站
博客分类:
折腾了几天struts2框架,发现其对校验的支持不是很好,主要体现在如下几点
1.灵活性差
只有theme为xhtml和css_xhtml的时才能够启用纯客户端的js验证.
一般用户对页面UI表示都有一定的要求,当theme为xhtml或css_xhtml的时候会导致页面的排版和用户的UI要求不一致,而且几乎无法解决该问题.并且struts2纯js客户端的错误信息是利用动态添加一个tr来显示的.这就导致如果我想把错误和表单显示在同一行,利用struts2的客户端验证就很难做到.
2.默认支持的校验类型比较少.
struts2默认只支持比较少的几种验证类型例如
* required validator
* requiredstring validator
* stringlength validator
* regex validator
* email validator
* url validator
* int validator
* double validator
date和表达式验证都不支持.这给使用造成了一定的麻烦.
3.不支持客户端定制的js验证.
针对如上几点郁闷的地方,我在网上寻找了很久终于发现了一个比较好js客户端验证的框架
jquery-validate
该验证框架基于jquery这个js框架,利用jquery特性实现客户端的js校验,主要特点如下
1.支持基于表单类似声明式的js验证详细例子如下
$("#signupForm").validate({
firstname: "required",
lastname: "required",
username: {
required: true,
minlength: 2
password: {
required: true,
minLength: 5
confirm_password: {
required: true,
minlength: 5,
equalTo: "#password"
required: true,
email: true
required: "#newsletter:checked",
minLength: 2
agree: "required"
messages: {
firstname: "Please enter your firstname",
lastname: "Please enter your lastname",
username: {
required: "Please enter a username",
minLength: "Your username must consist of at least 2 characters"
password: {
required: "Please provide a password",
minLength: "Your password must be at least 5 characters long"
confirm_password: {
required: "Please provide a password",
minLength: "Your password must be at least 5 characters long",
equalTo: "Please enter the same password as above"
email: "Please enter a valid email address",
agree: "Please accept our policy"
2.内置多种基本校验的类型(包括与ajax结合的服务器断校验)
required,remote(ajax服务器端校验器),minlength,maxlength,rangelength,min,
max,range,email,url,date,,dateISO,dateDE,number,numberDE,digits,creditcard
,accept,equalTo
3.支持自定义校验类型.
可以通过
$.validator.addMethod("phone", function(value) {
return validatePhone(value);
}, 'Please enter correct format for referee phone!');
添加自己的校验器
4.支持多种校验器的声明方式.
1).利用函数声明
请参考1点
2).结合控件属性声明
&input& type="radio" id="gender_male" value="m" name="gender" validate="required:true" /&
3).结合控件的class属性声明
&textarea id="ccomment" name="comment" class="required"&
这几种声明方式可以按照实际需要结合使用大大提高了灵活性.
附件是我利用struts2框架自己的form标签扩展的一个form标记的ftl模板,主要用于生成基于jquery的客户端校验标记,做的比较粗糙,重在抛砖引玉.
(274 Bytes)
下载次数: 1226
(765 Bytes)
下载次数: 1022
论坛回复 /
(19 / 13149)
不晓得有没有完整的代码,我现在弄的一头雾水的,不知道jquery的验证能不能与struts2标签结合。
跟标签有什么关系,标签在客户端生成的还不是HTMl!
浏览: 57755 次
来自: 福建福州
非常好的一篇文章,再能配上插图就更好了!
struts的校验确实是比较费劲,jquery很强但是也有一些 ...
commons-validator支持客户端、服务端双重验证, ...
按照楼主的配置,终于搞定。3q
不论如何,客户端的js校验,可以完全取代服务器端的数据检验吗? ...Struts2 验证框架不起作用的几种可能
Struts2 验证框架不起作用的几种可能
1. 命名是否符合约定:
-validation.xml
--validation.xml
2. validation.xml的标签是否正确,比如是否关闭所有标签,是否多一个关闭标签等。注意:这方面错误没有任何提示, 只是验证不起作用。
3. fieldName 命名是否和以及 action中的属性一致 如:
action中有userName 属性,
jsp 中有标签:
validation.xml中需有:...
上述的三个userName一定要一致。
4.检查是否在同一个field里面配置了重复的参数,重复的参数也可能会使你的信息显示不出来
5.要记得验证框架所产生的错误信息被是写入到了fielderror里面去了,所以在需要显示错误信息的页面要用
6.最主要的一个可能:如果你的Action类没有继承ActionSupport类,就不会进行页面流程的自动跳转。
除了上述的几个可能以外,还一个就是一定要把配置验证文件放到Action同一个目录下, 还一个是actionAlias的命名问题
一定要区分actionAlias和action方法名
name定义的是actionAlias
method定义的是action方法名
我把验证xml文件名字错用成了xxxAction-save-validation.xml,
死活不能验证
改用xxxAction-savexxx-validation.xml后,正常了
您对本文章有什么意见或着疑问吗?请到您的关注和建议是我们前行的参考和动力&&
您的浏览器不支持嵌入式框架,或者当前配置为不显示嵌入式框架。

我要回帖

更多关于 struts2校验器 的文章

 

随机推荐