validator
Validator怎么用
你看看这个例子吧:
 表单验证类 Validator v1.01
 
 body,td{font:normal 12px Verdana;color:#333333}
 input,textarea,select,td{font:normal 12px Verdana;color:#333333;border:1px solid #999999;background:#ffffff}
 table{border-collapse:collapse;}
 td{padding:3px}
 input{height:20;}
 textarea{width:80%;height:50px;overfmin:auto;}
 form{display:inline}
 
 
  
    
   真实姓名:
  
  
   英文名:
  
    
   主页:
  
  
   密码:
  
  
   重复:
  
  
   信箱:
  
    
   信箱:
  
  
   QQ:
  
    
   身份证:
  
  
   年龄:
  
   
   年龄1:
  
   
   电话:
  
   
   手机:
  
     
   生日:
  
   
   邮政编码:
  
  
   邮政编码:
  
  
   操作系统:选择您所用的操作系统Win98Win2kWinXP
  
  
   所在省份:广东陕西浙江江西
  
  
   爱好:运动上网听音乐看书
  
   自我介绍:中文是一个字
  
     自传:中文是两个字节t
  
  
   
  
  
 
 
 Validator = {
 Require : /.+/,
 Email : /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/,
 Phone : /^((\(\d{3}\))|(\d{3}\-))?(\(0\d{2,3}\)|0\d{2,3}-)?[1-9]\d{6,7}$/,
 Mobile : /^((\(\d{3}\))|(\d{3}\-))?13\d{9}$/,
 Url : /^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^\"\"])*$/,
 IdCard : /^\d{15}(\d{2}[A-Za-z0-9])?$/,
 Currency : /^\d+(\.\d+)?$/,
 Number : /^\d+$/,
 Zip : /^[1-9]\d{5}$/,
 QQ : /^[1-9]\d{4,8}$/,
 Integer : /^[-\+]?\d+$/,
 Double : /^[-\+]?\d+(\.\d+)?$/,
 English : /^[A-Za-z]+$/,
 Chinese :  /^[\u0391-\uFFE5]+$/,
 UnSafe : /^(([A-Z]*|[a-z]*|\d*|[-_\~!@#\$%\^&\*\.\(\)\[\]\{\}\?\\\/\'\"]*)|.{0,5})$|\s/,
 IsSafe : function(str){return !this.UnSafe.test(str);},
 SafeString : "this.IsSafe(value)",
 Limit : "this.limit(value.length,getAttribute('min'),  getAttribute('max'))",
 LimitB : "this.limit(this.LenB(value), getAttribute('min'), getAttribute('max'))",
 Date : "this.IsDate(value, getAttribute('min'), getAttribute('format'))",
 Repeat : "value == document.getElementsByName(getAttribute('to'))[0].value",
 Range : "getAttribute('min') < value && value < getAttribute('max')",
 Compare : "this.compare(value,getAttribute('operator'),getAttribute('to'))",
 Custom : "this.Exec(value, getAttribute('regexp'))",
 Group : "this.MustChecked(getAttribute('name'), getAttribute('min'), getAttribute('max'))",
 ErrorItem : [document.forms[0]],
 ErrorMessage : ["以下原因导致提交失败:\t\t\t\t"],
 Validate : function(theForm, mode){
  var obj = theForm || event.srcElement;
  var count = obj.elements.length;
  this.ErrorMessage.length = 1;
  this.ErrorItem.length = 1;
  this.ErrorItem[0] = obj;
  for(var i=0;i<count;i++){
   with(obj.elements[i]){
    var _dataType = getAttribute("dataType");
    if(typeof(_dataType) == "object" || typeof(this[_dataType]) == "undefined")  continue;
    this.ClearState(obj.elements[i]);
    if(getAttribute("require") == "false" && value == "") continue;
    switch(_dataType){
     case "Date" :
     case "Repeat" :
     case "Range" :
     case "Compare" :
     case "Custom" :
     case "Group" : 
     case "Limit" :
     case "LimitB" :
     case "SafeString" :
      if(!eval(this[_dataType])) {
       this.AddError(i, getAttribute("msg"));
      }
      break;
     default :
      if(!this[_dataType].test(value)){
       this.AddError(i, getAttribute("msg"));
      }
      break;
    }
   }
  }
  if(this.ErrorMessage.length > 1){
   mode = mode || 1;
   var errCount = this.ErrorItem.length;
   switch(mode){
   case 2 :
    for(var i=1;i<errCount;i++)
     this.ErrorItem[i].style.color = "red";
   case 1 :
    alert(this.ErrorMessage.join("\n"));
    this.ErrorItem[1].focus();
    break;
   case 3 :
    for(var i=1;i<errCount;i++){
    try{
     var span = document.createElement("SPAN");
     span.id = "__ErrorMessagePanel";
     span.style.color = "red";
     this.ErrorItem[i].parentNode.appendChild(span);
     span.innerHTML = this.ErrorMessage[i].replace(/\d+:/,"*");
     }
     catch(e){alert(e.description);}
    }
    this.ErrorItem[1].focus();
    break;
   default :
    alert(this.ErrorMessage.join("\n"));
    break;
   }
   return false;
  }
  return true;
 },
 limit : function(len,min, max){
  min = min || 0;
  max = max || Number.MAX_VALUE;
  return min <= len && len <= max;
 },
 LenB : function(str){
  return str.replace(/[^\x00-\xff]/g,"**").length;
 },
 ClearState : function(elem){
  with(elem){
   if(style.color == "red")
    style.color = "";
   var lastNode = parentNode.childNodes[parentNode.childNodes.length-1];
   if(lastNode.id == "__ErrorMessagePanel")
    parentNode.removeChild(lastNode);
  }
 },
 AddError : function(index, str){
  this.ErrorItem[this.ErrorItem.length] = this.ErrorItem[0].elements[index];
  this.ErrorMessage[this.ErrorMessage.length] = this.ErrorMessage.length + ":" + str;
 },
 Exec : function(op, reg){
  return new RegExp(reg,"g").test(op);
 },
 compare : function(op1,operator,op2){
  switch (operator) {
   case "NotEqual":
    return (op1 != op2);
   case "GreaterThan":
    return (op1 > op2);
   case "GreaterThanEqual":
    return (op1 >= op2);
   case "LessThan":
    return (op1 < op2);
   case "LessThanEqual":
    return (op1 <= op2);
   default:
    return (op1 == op2);            
  }
 },
 MustChecked : function(name, min, max){
  var groups = document.getElementsByName(name);
  var hasChecked = 0;
  min = min || 1;
  max = max || groups.length;
  for(var i=groups.length-1;i>=0;i--)
   if(groups[i].checked) hasChecked++;
  return min <= hasChecked && hasChecked <= max;
 },
 IsDate : function(op, formatString){
  formatString = formatString || "ymd";
  var m, year, month, day;
  switch(formatString){
   case "ymd" :
    m = op.match(new RegExp("^((\\d{4})|(\\d{2}))([-./])(\\d{1,2})\\4(\\d{1,2})$"));
    if(m == null ) return false;
    day = m[6];
    month = m[5]--;
    year =  (m[2].length == 4) ? m[2] : GetFullYear(parseInt(m[3], 10));
    break;
   case "dmy" :
    m = op.match(new RegExp("^(\\d{1,2})([-./])(\\d{1,2})\\2((\\d{4})|(\\d{2}))$"));
    if(m == null ) return false;
    day = m[1];
    month = m[3]--;
    year = (m[5].length == 4) ? m[5] : GetFullYear(parseInt(m[6], 10));
    break;
   default :
    break;
  }
  if(!parseInt(month)) return false;
  month = month==12 ?0:month;
  var date = new Date(year, month, day);
        return (typeof(date) == "object" && year == date.getFullYear() && month == date.getMonth() && day == date.getDate());
  function GetFullYear(y){return ((y<30 ? "20" : "19") + y)|0;}
 }
 }
如何使用 Laravel 框架的 validator
Laravel Validation
Laravel’s base controller class use a ValidatesRequests trait
app/Http/routes.php :
Route::get(‘post/create’, ‘PostController@create’);
Route::post(‘post’, ‘PostController@store’);
Controller
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class PostController extends Controller
{
/**
* Show the form to create a new blog post.
*
* @return Response
*/
public function create()
{
return view('post.create');
}
/**
* Store a new blog post.
JAVA中有个org.springframework.validation.Validator是什么意思
一个验证功能
使用spring提供的org.springframework.validation.Validator的时候,在注册的验证器的时候注意写明这个验证器是是为哪个对象提供验证的,否则默认为所有@ModelAttribute提供验证,如果不支持(supports方法)就会报错误(类似org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.IllegalStateException: Invalid target for Validator [com.smvc.annonation.validator.StudentValidator@2585e]: com.smvc.annonation.utils.ResultFilter@c378f6),但是并不会对没有标注为@Valid的@ModelAttribute进行真正的验证。
[java] view plaincopyprint?
@InitBinder("student")  
    public void initBinder(WebDataBinder binder) {  
        //添加一个日期类型编辑器,也就是需要日期类型的时候,怎么把字符串转化为日期类型  
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");  
        dateFormat.setLenient(false);  
        binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));  
        //添加一个spring自带的validator  
        binder.setValidator(new StudentValidator());  
    }  
@InitBinder("student")
public void initBinder(WebDataBinder binder) {
//添加一个日期类型编辑器,也就是需要日期类型的时候,怎么把字符串转化为日期类型
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
dateFormat.setLenient(false);
binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));
//添加一个spring自带的validator
binder.setValidator(new StudentValidator());
}
如果没有标注@Valid就不会进行任何验证
定递归验证关联的对象可以用于继承对象吗 spring validate
Spring数据校验
spring拥有自己独立的数据校验框架,同时支持JSR303标注校验。springDataBinder在进行数据绑定时,可同时调用校验框架完成数据校验工作。在spring mvc中则可直接通过注解驱动的方式进行数据校验
Validator校验接口
boolean supports(Class clazz):该校验器能够对clazz类型的对象进行校验
void validate(Object target,Errors errors):对目标对象进行校验,并将校验错误记录到errors
LocalValidatorFactoryBean
LocalValidatorFactoryBean既实现了spring的validator接口,也实现了JSR303的Validator接
口。只要在spring 容器中定义一个LocalValidatorFactoryBean,即可将其注入到需要校验的Bean中。
<bean id="validator"
class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>
Spring mvc数据校验
会默认装配好一个LocalValidatorFactoryBean,通过在处理方法的入参上标注@Valid注解即可让spring mvc执行数据校验工作。
public String handle91(@Valid @ModelAttribute(“user”)Useruser,BindingResult bindingResult){
if(bingingResult.hasErrors){
return“/user/register”;
}
return “/user/showUser”
}
将入参对象添加@Valid注解,同时紧跟其后声明一个BindingResult的入参,根据BingingResult即可判断是否存在错误。绑定接口既可以是BindingResult也可以Errors类型
在页面显示错误
spring 
mvc除了会将表单/命令对象的校验结果保存在对应的BindingResult或Errors中,还会将所有校验结果保存到隐含模型中,也就是说即使处
理方法的签名没有对应于表单/命令对象的校验结果入参,校验结果也不会丢失,它们始终可以在隐含模型中获取。隐含模型中所有数据最终通过
HttpServletRequest的属性列表暴露给JSP视图对象。
通过国际化资源显示错误信息
每个属性在数据绑定和数据校验发生错误时,都会产生一个对应的FieldError对象,FieldError实现了
org.springframework.context.MessageSourceResolvable接口。
MessageSourceResolvable是可用国际化资源进行解析对象。
MessageSourceResolvable提供3个接口
Object getArguments():返回一组参数对象
String[] getCodes():返回一组消息代码,每个代码对应一个资源属性,可以使用getArguments()返回的参数对资源属性进行参数替换
String getDefaultMessage():默认消息
当一个属性校验失败后,校验框架会为该属性生成4个消息代码,这些代码以校验注解类名为前缀,结合类名、属性名、属性类型名生成多个消息代码
如User类的password属性标注了一个@Pattern的注解,当校验失败后会产生如下4个错误代码
Parttern.user.password
Parttern.password
Parttern.java.lang.String
Parttern
当使用Sprng mvc标签显示错误信息时,Spring mvc查看web上下文是否装配了对应国际化消息,如果没有,则显示默认的错误消息,否则使用国际化消息对错误代码进行翻译。
如果在数据类型转换或数据类型格式时发生错误,或者该有的参数不存在,或者调用处理方法时发生错误,都会在隐含模型中创建错误消息,其错误代码前缀说明如下:
required:必要的参数不存在,如@RequestParam(“param1”)标注了一个入参,当请求参数不存在时
typeMismatch:在数据绑定时发生数据类型不匹配
methodInvocation:spring mvc在调用方法时发生错误
示例
如果”aaa”非数字参数传递给User的salary属性,将发生数据转换的错误,Spring将为该错误生成如下错误代码
typeMismatch.user.salary
typeMismatch.salary
typeMismatch.long
typMismatch
装配国际化资源
<bean id="messageSource"
class="org.springframework.context.support.ResourceBundleMessageSource">
conf/i18n/messages
也可以通过basenames属性指定多个国际化资源
在conf/i18n下添加基名为messages的国际化资源,一个默认的messages.properties,另一个对应messages_zh_CN.properties
自定义校验规则
通过@InitBinder注解的initBinder方法中装配自定义MyValidator
@InitBinder
public void initBinder(WebDataBinder binder){
binder.setValidtor(newXXX());//在进行数据绑定时使用的校验器
}
也可以借助请求处理方法的签名传递一个Errors或BindingResult对象进来,然后在处理方法中直接校验。
public String handle92(@ModelAttribute(“user”Useruser,BindingResult bindingResult)){
ValidationUtils.rejectIfEmptyOrWritespace(bindingResult,”username”,”required”);
//产生的错误信息对象错误代码包括
//required.user.username
// required.username
// required.java.lang.String
// required
if(“aaa”.equalsIgnoreCase(user.getUsername())){
bindingResult.rejectValue(“username”,”reserved”);
//产生的错误代码如下
//reserved.user.username
// reserved.username
// reserved.java.lang.String
// reserved
}
if(bindingResult.hasErrors()){
return “/user/register4”;
}else{
return “/user/showUser”;
}
}
binder.setValidator()方法设置自定义的Validtor后,spring mvc将使用它对入参进行校验,将不在使用spring mvc框架装配的Validator对入参对象进行校验,即使入参标注了@Valid注解也不会校验
java编程spring里org.springframework.web这个包是干啥的
首先这个包是spring用来支持web应用的。
关于你说的监听,其实是当web应用启动时来执行的,举个例子
org.springframework.web.context.ContextLoaderListener
比如这个类,我们会在web.xml中这样来配置
    
        org.springframework.web.context.ContextLoaderListener
    
这个监听类的作用就是当spring发现这个标签内包含其他的xml配置文件,将这些xml文件对应的application content加载到web容器中,使得将多个application content建立起关联。
希望对你有帮助,谢谢。 
你说的很多种监听,你现在没必要花时间在这些细枝末节上,技术是为了应用服务的,根据需求去学习使用研究,会更好的。
上一篇:v10发动机
下一篇:没有了
