springmvc中如何使用验证框架

客户端验证(js) + 服务器端验证(java)

客户端验证能够提供更好的体验,但是不够安全。永远不要将验证寄托于客户端验证。服务器端验证才永远安全


1.springmvc 和 hibernate-validation验证框架的整合

  首先要根据spring的版本导入不同版本的hibernate-validation的jar包

  springmvc 3.x
    hibernate-validator-4.1.0.Final.jar
    validation-api-1.0.0.GA.jar
    jboss-logging-3.1.0.GA.jar

  springmvc 4.x

    classmate-1.3.1.jar
    hibernate-validator-5.3.1.Final.jar
    jboss-logging-3.3.0.Final.jar
    validation-api-1.1.0.Final.jar

2.hibernate-validation验证框架所提供的关于验证的注解

       * @Null   被注释的元素必须为 null       
       * @NotNull    被注释的元素必须不为 null       
       * @AssertTrue     被注释的元素必须为 true       
       * @AssertFalse    被注释的元素必须为 false       
       * @Min(value)     被注释的元素必须是一个数字,其值必须大于等于指定的最小值       
       * @Max(value)     被注释的元素必须是一个数字,其值必须小于等于指定的最大值       
       * @DecimalMin(value)  被注释的元素必须是一个数字,其值必须大于等于指定的最小值       
       * @DecimalMax(value)  被注释的元素必须是一个数字,其值必须小于等于指定的最大值       
       * @Size(max=, min=)   被注释的元素的大小必须在指定的范围内       
       * @Digits (integer, fraction)     被注释的元素必须是一个数字,其值必须在可接受的范围内       
       * @Past   被注释的元素必须是一个过去的日期       
       * @Future     被注释的元素必须是一个将来的日期       
       * @Pattern(regex=,flag=)  被注释的元素必须符合指定的正则表达式       
       * Hibernate Validator 附加的 constraint       
       * @NotBlank(message =)   验证字符串非null,且长度必须大于0       
       * @Email  被注释的元素必须是电子邮箱地址       
       * @Length(min=,max=)  被注释的字符串的大小必须在指定的范围内       
       * @NotEmpty   被注释的字符串的必须非空       
       * @Range(min=,max=,message=)  被注释的元素必须在合适的范围内
       * @URL(protocol=,host,port)//检查是否是一个有效的URL,如果提供了protocol,host等,则该URL还需满足提供的条件

3.验证的使用步骤

  1>.导入验证相关的jar包

  2>.在实体类的相应属性上添加注解

        @NotBlank(message="商品名称不能为空")
    private String goodsName;
    
    @NotNull(message="商品价格不能为空")
    @DecimalMin(value="0", message="价格不能小于0")
    private Double price;
    
    @Min(value=0, message="库存数量不能小于0")
    private Integer storage;

  3>.在springmvc的控制器方法上,添加注解和参数

        @RequestMapping(value="/add", method=RequestMethod.POST)
    public String add(@Validated @ModelAttribute("goods") Goods goods, BindingResult validResult){
        
        if(validResult.hasFieldErrors()==true){
            return "goods/add";
        }
        
        
        goods.setGoodsId(generateGoodsId());
        
        goodsList.add(goods);
        return "redirect:list";
    }

        注意:BindingResult参数必须紧跟被验证的参数





在pojo 中


private Integer stuId;
    
    //message当验证没有通过时,提示的错误信息
    
    @NotBlank(message="学生姓名不能为空")
    private String stuName;//
    
    @Pattern(message="手机号码格式错误", regexp="^((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(18[0,5-9]))\\d{8}$")
    private String phone;
    
    @Range(message="年龄介于18-60之间", min=18, max=60)
    private Integer age;

    public Integer getStuId() {
        return stuId;
    }

    public void setStuId(Integer stuId) {
        this.stuId = stuId;
    }



在pojo中在创建一个 SimpleResult:



public class SimpleResult implements Serializable {
	
	/**
	 * 处理异常信息
	 * @param errors
	 */
	public void handlerError(List<FieldError> errors){
		
		for(FieldError error : errors){
			message+=error.getDefaultMessage()+"\n";
		}
		
		result = false;
		
	}

	//设置操作的结果:true|false
	private boolean result = true;
	//错误信息
	private String message = "";

	public boolean isResult() {
		return result;
	}

	public void setResult(boolean result) {
		this.result = result;
	}

	public String getMessage() {
		return message;
	}

	public void setMessage(String message) {
		this.message = message;
	}
	
	
}









在Controller



@Controller
@RequestMapping("/validate")
public class ValidateController {

    @RequestMapping(value="/demo1.do", method=RequestMethod.GET)
    public String demo1(){
        
        return "validate/demo1";
    }
    
    /*
     * 首先在被验证的对象上添加注解@Validated,这样springmvc就会对该对象进行验证
     * 其次在方法的参数列表的最后,额外添加参数BindingResult,该参数存储了验证的结果
     *
     */
    
    @RequestMapping(value="/demo1.do", method=RequestMethod.POST)
    public String demo1(Integer id, String data,  @ModelAttribute("stu") @Validated Student stu, BindingResult result){
        
        
        
        //取数据库查询学生姓名是否存在
        //result.addError(arg0);
        
        //判断是否通过验证   result.hasErrors()
        if(result.hasFieldErrors()){
            return "validate/demo1";
        }
        
        return "index";
    }
    
    @RequestMapping("/index.do")
    public String index(){
        return "index";
    }
    
}




还有一种是


@ResponseBody
	
@RequestMapping(value="add.do",method=RequestMethod.POST)
	public SimpleResult add(Model model,Integer id, String data,  @ModelAttribute("emp") @Validated Emp emp, BindingResult result){
		
		SimpleResult rtnResult = new SimpleResult();
		//取数据库查询学生姓名是否存在
		//result.addError(arg0);
		//判断是否通过验证 result.hasErrors()
				


                               if(result.hasFieldErrors()){
                                    //如果为flase 记录错误
                             rtnResult.handlerError(result.getFieldErrors());
				}else{
                                    //如果为true  执行下面的方法
                                   empService.insertEmp(emp);
				}
				return rtnResult;
		
	}



这个在jsp页面 的写法是



$("#formadd").ajaxSubmit({
    			url:"<%= request.getContextPath()%>/Emp/add.do",
    			type:"post",
    			resetForm:false,
    			success:function(data){
    				if(data.rtnResult==true){
                        //获取父窗口的window对象
                        var win = art.dialog.open.origin;  
                        //调用父窗口的js方法refresh();
                        win.refresh();
                        //关闭对话框
                        art.dialog.close();
                    }else{
                        alert(data.message);
                    }






}, error:function(xhr,textStatus,errorThrown){ alert("新增员工失败,请重试"); } });









在 Jsp 页面中 





<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
    
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

	<form:form action="demo1.do" method="post" modelAttribute="stu">
	
		<div style="color:red;">
		<form:errors path="*"></form:errors>
		</div>

		
	
		姓名:<input type="text" name="stuName" />
		<form:errors path="stuName"></form:errors>
		<br>
		
		电话:<input type="text" name="phone" />
		<form:errors path="phone"></form:errors>
		<br>
		
		年龄:<input type="text" name="age" />
		<form:errors path="age"></form:errors>
		<br>
		
		<input type="submit" value="新增" />
	
	</form:form>


</body>
</html>






















     





<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
    
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

	<form:form action="demo1.do" method="post" modelAttribute="stu">
	
		<div style="color:red;">
		<form:errors path="*"></form:errors>
		</div>

		
	
		姓名:<input type="text" name="stuName" />
		<form:errors path="stuName"></form:errors>
		<br>
		
		电话:<input type="text" name="phone" />
		<form:errors path="phone"></form:errors>
		<br>
		
		年龄:<input type="text" name="age" />
		<form:errors path="age"></form:errors>
		<br>
		
		<input type="submit" value="新增" />
	
	</form:form>


</body>
</html>