-
struts2的validate方法命名规范
2014-11-11 10:40:20我们知道,在学习Struts2时,如果验证方法为validat我们知道,在学习Struts2时,如果验证方法为validateXxx那么,他所对应的验证 action的名字应该是xxx(即将首字母小写),但是现在有这样种情况如下:
<action name="admin_*" class="com.yxq.action.AdminAction" method="{1}">
<result name="input">/pages/admin/view/AdminTemp.jsp</result>
<result name="checkSuccess" type="redirectAction">
<param name="actionName">admin_*</param>
<param name="method">ListShow</param>
</result>
<result name="deleteSuccess" type="redirectAction">
admin_ListShow.action
</result>
</action>程序代码中有public void validateListShow()方法
其中一个Action类有多个对应的方法,我们使用通配符来经行配置,而validateListShow()验证了Action类中的ListShow()方法,此时,是不需要将方法的首字母小写为listShow()的。
-
TField validate
2008-06-28 10:55:00同c#一样,delphi对事件的处理也使用相同的逻辑,举例而言,用validate方法来触发onvalidate(从命名上来看,正好相反,c#用onxxx触发xxx事件) 在C#(.net)中,onxxx方法必定是virtual 的,这样,用户可以覆盖缺省的...同c#一样,delphi对事件的处理也使用相同的逻辑,举例而言,用validate方法来触发onvalidate(从命名上来看,正好相反,c#用onxxx触发xxx事件)
在C#(.net)中,onxxx方法必定是virtual 的,这样,用户可以覆盖缺省的事件处理句柄。
在.net 中,事件是用delegate来处理的,delegate可以处理多个过程,用+=,-=来达成,在delphi中,过程指针可以指向一个事件,但同时只能有一个过程指针
我试图写一些TsbfXXXField来,来对从原数据获取的列定义做缺省的处理,像required,unique和一些其它通用的校验,理想的,应该是覆盖delphi的validate方法,但结果,居然发现它不是虚的。 我只有实现onvalidate时间,但是,这样,我的脚本处理程序无法再在外部定制它。这是个问题。
小地方,反映了delphi的设计,还是有些问题转载于:https://www.cnblogs.com/jjx/archive/2008/06/28/1231538.html
-
Struts2输入校验以及错误信息处理(1)——用Action中定义的validate()方法进行校验
2011-11-12 19:02:51Struts2的输入校验有两种方式:一种是用Action中定义的validate()方法进行校验,一种是用Struts2定义好的校验框架进行校验。前者里面的逻辑判断要自己写,而后者只需要传递相应的参数即可。 不管是哪种方式,程序...Struts2的输入校验有两种方式:一种是用Action中定义的validate()方法进行校验,一种是用Struts2定义好的校验框架进行校验。前者里面的逻辑判断要自己写,而后者只需要传递相应的参数即可。
不管是哪种方式,程序执行的流程都是一样的,执行流程如下:
1、对表单传递过来的数据,先进行类型转换
2、执行校验
3、若校验不合法,则跳转到以input命名的result页面,若合法,则跳转到指定的页面
下面举例来说明用Action中定义的validate()方法进行校验这种方式(第二种方式在下一篇博客中说明):
这种方法,是在Action中用其中的validate()方法进行校验,如下例:
其中的EMail是自定义的数据类型,要编写类型转换器,进行类型转换,详情看上一篇博客。这里为了更清晰的介绍执行流程,所以加上一个自定义的数据类型的属性。
package com.suo.actions; import java.util.Calendar; import java.util.Date; import com.opensymphony.xwork2.ActionSupport; import com.suo.beans.EMail; /** * 处理用户注册的Action,其中uername,password,birthday,Struts2都提供了内部的类型转换, * 但是对于自定义的EMail,就要自己编写类型转换的代码,以满足条件。 * @author hackerain */ public class RegisterAction extends ActionSupport { private String username; private String password; private String repassword; private Date birthday;//Struts2已提供了内部的类型转换器 private int age; private EMail email;//自定义数据类型,要编写类型转换器,以进行类型转换 public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getRepassword() { return repassword; } public void setRepassword(String repassword) { this.repassword = repassword; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public EMail getEmail() { return email; } public void setEmail(EMail email) { this.email = email; } /** * execute()覆盖父类中的方法,进行总的业务处理 */ public String execute() throws Exception { System.out.println(username); System.out.println(password); System.out.println(birthday); System.out.println("age"); System.out.println(email.getFormer()); System.out.println(email.getLatter()); return SUCCESS; } /** * 验证方法,覆盖父类中的validate(),对属性进行验证: * 用户名介于4——6个字符之间,且不能为空, * 密码介于4——6个字符之间,且不能为空, * 两次输入的密码要一致, * 生日要大于1900-01-01,小于当前日期, * 邮箱要为qq邮箱、163邮箱、yahoo邮箱三者中的一个。 * 若输入的信息不合法,则会默认跳转到以"input"为命名的<result>页面,进行重新输入。 */ public void validate() { if(username==null || username.length()<4 || username.length()>6) { this.addActionError("username error !"); } if(password==null || password.length()<4 || password.length()>6) { this.addActionError("password error !"); } else if(repassword==null || repassword.length()<4 || repassword.length()>6) { this.addActionError("repassword error !"); } else if(!password.equals(repassword)) { this.addActionError("passwords are different !"); } if(birthday==null) { this.addActionError("birthday is invalid !"); } else { Calendar birthCal=Calendar.getInstance(); birthCal.setTime(birthday); Date now=new Date(); Calendar upperCal=Calendar.getInstance(); upperCal.setTime(now); Calendar lowerCal=Calendar.getInstance(); lowerCal.set(1900, 1, 1); if(!(lowerCal.before(birthCal) && birthCal.before(upperCal))) { this.addActionError("birthday should be between 1900-01-01 to now !"); } } if(age<10 || age>50) { this.addActionError("age should be between 10 and 50"); } if(email==null) { this.addActionError("email is invalid !"); } else { if(!(email.getLatter().equals("qq.com") || email.getLatter().equals("163.com") || email.getLatter().equals("yahoo.com.cn"))) { this.addActionError("email should be among qq.com, 163.com and yahoo.com.cn !"); } } //this.clearErrors(); } }
关于错误信息的处理,有两种方式,一种是addActionError(),另一种是addFieldError(),关于两者的区别,如下:
在校验前,即执行validate()方法前,先要进行类型转换,若类型转换发生错误,则Struts会自动将错误信息放到相应的属性错误字段中,即调用addFieldError()方法,添加到其中的错误信息也是Struts2默认的;然后,调用set方法时,由于类型转换发生错误,所以会找不到对应属性的set方法,从而使得该属性值在Action中为默认值;
在校验时,即执行validate()方法时,若有不合法的属性,此时,若指定了添加错误信息的方式,addFieldError()或addActionError(),则只会相应的执行指定的方法,并且会累加,即写了几次该方法,就会添加几次错误信息,因为在底层添加的错误信息是存储在一个ArrayList<String>数组中的,不会覆盖原来的错误信息。
总得来说,在类型转换发生异常是,addFieldError()会由struts2自动调用,而addActionError()是在Action中显示调用的,但是addFieldError()也可以在Action中显示调用。在发生类型转换异常时,Struts2会自动调用addFieldError(),向ArrayList<String>数组中添加错误信息,但是添加的错误信息是Struts2默认的:Invalid field value for field "xxx",其实也可以自己定义字段级别的错误信息,方法如下:
1、在该Action所在的包中,添加一个以该Action的类名为文件名的properties文件。
2、在其中指定key和value
key有固定的格式:invalid.fieldvalue. + Action中要检验的属性名,如:invalid.fieldvalue.username;
value就是自己定义的错误信息了。
注意,若自定义的错误信息是中文的话,则应选择Properties模式,进行编辑,因为中文是以UNICODE进行表示的。
如本例中的自定义错误信息的properties文件名为:RegisterAction.properties,内容为:
age属性的错误信息是用英文写的,其他的属性是用中文写的,在源代码模式下,显示的就是中文的ascii编码invalid.fieldvalue.username=\u7528\u6237\u540D\u4E0D\u5408\u6CD5 invalid.fieldvalue.password=\u5BC6\u7801\u4E0D\u5408\u6CD5 invalid.fieldvalue.birthday=\u751F\u65E5\u4E0D\u5408\u6CD5 invalid.fieldvalue.age=age should be between 10 and 50 invalid.fieldvalue.email=\u90AE\u7BB1\u4E0D\u5408\u6CD5
-
django restfremwork serializer的validate机制
2019-05-23 17:04:02使用DRF去创建标准API的时候有一个日常操作就是serializer.is_valid(),用于检查序列...在自定义的serializer内自定义validate,方法名用validate和要做特殊检查的字段用下划线连起来命名就可以直接检查,比如要实现...使用DRF去创建标准API的时候有一个日常操作就是serializer.is_valid(),用于检查序列化对象serializer是否合规,这个方法有一个参数叫raise_exception(boolean值),用于控制是不是抛出错误啥的。在自定义的serializer内自定义validate,方法名用validate和要做特殊检查的字段用下划线连起来命名就可以直接检查,比如要实现一个需求,邻居都不能姓王,那么就需要在自己对应的serializer内新增一个叫做validata_name的方法,可以这样写
class NeighbourSerializer(serializers.Serializer): """ 邻居们的序列化 """ ...... ...... name = serializers.CharField(max_length=100, allow_null=False) def validate_name(self, value): if value.first_name == '王': raise serializers.ValidationError(u'隔壁怎么可以姓王?')
这个时候当代码运行起来会发现is_valid()时会自动进行检查,假如是我,我估计是拼接字符串,validate_当标志,后面拼上field名称当方法名然后调用。但是依然很好奇框架作者大神是如何实现的,所以看了看源码,整个调用流程是从is_valid()方法开始的,is_valid()内部会调用run_validation(data),然后run_validation()(注意,这个run_validation是Serializer类的,而不是Field的,rest_fremwork下自己封装的field也有一套名称一模一样的方法,跟踪的时候容易跟错),然后在run_validation内部会调用另外一个方法,叫做to_internal_value(data),这个方法是自定义validate的关键,源码如下:
def to_internal_value(self, data): """ Dict of native values <- Dict of primitive datatypes. 基本数据类型 -> 本地数据类型(我理解就是Serializer自己认的数据类型),顾注释思义!这玩意儿是用来使数据类型啥的变成合 乎自己逻辑的。 """ if not isinstance(data, Mapping): message = self.error_messages['invalid'].format( datatype=type(data).__name__ ) raise ValidationError({ api_settings.NON_FIELD_ERRORS_KEY: [message] }, code='invalid') ret = OrderedDict() errors = OrderedDict() fields = self._writable_fields for field in fields: # 这里的fields内容就是我们在自定义的Serializer子类内标明的字段 validate_method = getattr(self, 'validate_' + field.field_name, None) # 这一行果不其然用字符串拼接方法名的方式去获取对应的validate方法 primitive_value = field.get_value(data) try: validated_value = field.run_validation(primitive_value) # 这一行就是上面说道的field也有一套validate的方法用于校验字段 if validate_method is not None: validated_value = validate_method(validated_value) # 此处对自定义的validate方法进行了调用 except ValidationError as exc: errors[field.field_name] = exc.detail except DjangoValidationError as exc: errors[field.field_name] = get_error_detail(exc) except SkipField: pass else: set_value(ret, field.source_attrs, validated_value) if errors: raise ValidationError(errors) return ret
结论:
1.自定义validate底层就是使用的字符串拼接,所以在使用这个机制的时候尽量复制粘贴field的名称避免单词拼写问题。
2.方法内读取的fields是直接self内去获取的Serializer自身定义过的field而不是Model内的,所以要使用这一机制,务必在自己的Serializer内创建对应的field.
-
用Jquery.validate.js做数据校验
2014-11-26 10:23:561.引用jquery.js、jquery.validate.js、messages_cn.js(我这里应用的都是min的,就是精简的,没有空格什么的,...3在加载事件中调用validate方法 $(document).ready(function () { $('#form1').validate({ -
有关struts2的validate验证
2011-04-21 20:39:00一、基于配置文件的验证,这种验证只适合简单的格式验证不用于后台逻辑验证跟action位于同一个包下命名为xxaction-validation.xml 这是全局验证要是action里面有很多个方法对具体方法验证则xxaction-xx... -
TP5.1出现这样的错误Fatal error: Class 'app\common\validate\BaseValidate' not found
2020-02-15 15:00:23TP5.1出现这样的错误Fatal error: Class ‘app\common\validate\BaseValidate’ not found 错误截图 方法一 出现这样的错误,第一件事就是检查相应的路径下面是否有该文件 方法二 检查命名空间是否严格跟随路径保持... -
element-ui 发送请求前 校验全部表单,报警告: [Element Warn][Form]model is required for validate to ...
2020-07-14 20:01:45报这种错可能有以下两种情况 1.属性绑定错误,确保绑定的是 :model 而不是v-model !...validate 是element-ui 里面对整个表单进行校验的方法,参数为一个回调函数。该回调函数会在校验结束后被调... -
TP5商城开发-路由命名,参数校验
2019-11-18 18:14:33路由命名 Route::get(‘自定义名称/:参数名’,‘模块名/控制器名/方法名’)。。 并非是命名空间;如果控制器在某一文件下则为 ‘模块...validate两种用法: 独立验证 验证器 合理安排层级关系 一般设计模式为: 1.... -
struts2自定义方法的输入校验
2013-03-30 00:14:02struts提供可以让用户自定义的方法,而其中各个自定义方法对应的验证方法也是有所差异...2.当一个程序中存在自定义的输入校验validateMyExecute方法,又存在validate方法时候,是会优先执行validateMyExecute,然后再执 -
typeScripy-番外篇之命名空间和模块
2019-02-17 14:16:42可以看出当没有export的时候,checKData 是私有的无法被外部访问(我们会想到闭包,return一个方法出来调用内部方法),在ts中加入export 后StringValidate就会暴露给外部变量Model1,也是闭包。 使用方式很简单: ... -
thinkPHP5框架自定义验证器实现方法分析
2020-12-19 23:55:24代码如下:注意,我的模块名为api,所以命名空间如下 保护属性$rule为官方规定,不能改变,其实验证规则require都是封装好的函数名,所以我们也建立一个方法,方法名填写在验证规则后面即可 namespace app\api\... -
转:Struts 2 验证方法
2010-11-22 09:14:00Struts2输入校验Struts2提供了客户端校验与服务端校验。这里只是做个简易的总结。1.)服务端校验:当程序流程进入到Action类,并经历了struts2的类型转换阶段...1.1)编码校验:在Action类里重写父类的validate()方法即可。 -
jquery插件使用方法大全
2012-05-24 23:58:18这一版能够支持对效果的更灵活定制,而且借助新增的命名空间事件,也使插件开发变得更容易。 jQuery UI(2007年9月):这个新的插件套件是作为曾经流行但已过时的Interface插件的替代项目而发布的。jQuery UI中包含... -
VS2013 webservice new的时候异常:无法反射方法
2016-08-23 08:30:42SoapParameterStyle paramStyle, String elementName, String elementNamespace, Boolean nsIsDefault, XmlReflectionMember[] members, Boolean validate, Boolean openModel, String key, Boolean writeAccess) ... -
TinkPHP5自定义验证类
2020-09-07 11:36:07本文主要介绍thinkPHP5框架自定义验证器实现方法,结合实例形式分析了thinkPHP自定义验证器的具体定义与使用方法, 首先我们在要使用验证类的模块目录下建立validata文件夹,我这里在后台的admin模块下建立的,然后... -
struts2添加自己的校验器
2017-09-05 19:48:27命名规范为校验名+Validator,该类必须继承FieldValidatorSupport,覆盖validate方法package cn.jieou.struts.validate;import com.opensymphony.xwork2.validator.ValidationException; import ... -
bsa-winter-2021-dbgravy:DBGravy是创建用于管理数据库的交互式用户友好型应用程序的简便方法。在那里,您...
2021-03-18 22:39:49如果您使用其他IDE,请找到一种以类似方式进行设置的方法。 项目安装 后端 创建.env.example文件的副本,并将其命名为.env 。 如有必要,使用本地设置更新.env文件中的值。 打开pgAdmin页面,使用您的密码连接到该... -
struts2学习笔记3
2018-05-08 21:26:27验证Action的指定方法,只需将重写的validate方法名改为“validate+要验证的方法名”即可!注意方法名的首字母都得大写。基于配置文件的表单的验证,可以减少java代码的编写,如果要验证的Action是“LoginAction”,... -
Struts服务器验证
2013-12-16 21:45:312. 也可以不重写直接写方法 命名规则为 validate验证的方法名称也可以实现验证 3.保存错误信息 fielderror 在验证是自动显示错误信息,action1error ,actionmessage 不强制返回只是提示 4.可以implements ... -
S6.4_Struts2_Validation
2016-12-15 22:55:283. 在动作类里添加validateAdd()方法,只验证action中的add方法(注意validateAdd命名规则validate是固定不变的 首字母大写的Add对应添加方法add) -
九、数据验证机制
2011-05-18 16:23:00一、手动验证的实现 ActionSupport类对Validateable接口进行了实现,但对validate()方法空实现。 使用validate()方法可以用户请求的多个Action进行验证,但其验证的逻辑是相同。如果在一个Action类... -
验证器使用方式
2019-04-28 10:48:02创建一个validate目录下的class.php文件,命名为manager 在managerService类里使用命名空间 use app\admin\validate\Manager as ManagerValidate; 在某个方法里创建一个验证器对象 $validate=new ManagerValidate()... -
Struts2数据校验
2019-11-07 10:40:241.在指定action(必须继承ActionSupport)中添加验证方法,命名规则:validate+验证的方法名 2.在Struts.xml中的action中配置验证返回界面 3.前台jsp页面显示验证提示 方法二:配置文件验证 1.新建数据... -
验证框架
2011-03-22 21:21:41重写validate方法,页面中使用了ww:form标签,已经提供了输出校验错误和显示错误的能力了。 使用配置文件方式,命名方式ActionName-validation.xml其中actionname就是action的类字(注意是类名不是action名字)。和... -
struts2输入校验小结
2013-04-08 19:43:002、执行校验框架转换3、执行特定方法对应的validate验证(test,validateTest)4、执行validate()方法 如果以上所有过程出现了任何错误,都不会继续执行,页面将转向struts.xml中input这个result对应的页面。 ... -
Page.IsValid 属性
2008-04-11 02:06:00获取一个值,该值指示页验证是否成功。 命名空间:System.Web.UI程序集:System.Web(在 system.web.dll 中)属性值如果页验证成功,则为 true;...只有在已调用 Page.Validate 方法,或已在开始窗体处理的 ASP.NET -
struts2表单提交数据的验证
2018-04-17 20:15:46表单提交数据的验证 1.验证方式分为硬编码和软编码 ... 硬编码方式一: 重写ActionSupport类中的validate()方法 // 这种方式会拦截该Action类中的所有方法 可以使用注解跳过拦截 @Override publ... -
struts2输入校验
2011-05-30 22:51:002、执行校验框架转换 3、执行特定方法对应的validate验证(test,validateTest) 4、执行validate()方法 如果以上所有过程出现了任何错误,都不会继续执行,页面将转向struts.xml中input这个...