美文网首页
springmvc 10 表单与验证

springmvc 10 表单与验证

作者: 小小机器人 | 来源:发表于2016-10-23 23:24 被阅读374次

    表单

    表单用的是springmvc的form标签

    1. 引入springmvc的form标签
    2. 在form标签中使用modelAttribute属性指明表单对应的bean对象
    3. 如果bean对象是空值,那么表单没有内容
      如果bean对象有内容,那么表单回显内容
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
        <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
        <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <!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="${pageContext.request.contextPath}/test" method="post" modelAttribute="employee">
            
            name:<form:input path="empName"/><br>
            <!-- path对应的是bean对象的属性名 -->
            
            email:<form:input path="empEmail"/><br>
    
            <br><button type="submit">提交</button>
        </form:form>
    
    </body>
    </html>
    
    @Controller
    public class Test {
        
        @RequestMapping(value="/test")
        public String test(Map<String,Object> map){
    
    //      map.put("employee", new Employee());//"employee"是表单对应的bean名称
            
            Employee employee = new Employee();
            employee.setEmpName("dd");
            employee.setEmpEmail("1137@qq.com");
            map.put("employee", employee);
            return "test";
        }
    }
    
    Paste_Image.png Paste_Image.png

    JSR-303进行校验:

    1. 新加hibernate-validator jar包
    到官网下载>http://hibernate.org/validator/

    Paste_Image.png Paste_Image.png

    2. 开启<mvc:annotation-driven/>

    3. 在bean属性中添加对应的注解

        @Email //表单验证-邮箱格式
        @NotEmpty //表单验证-不能为空
        private String empEmail;
    
    空检查
    @Null       验证对象是否为null
    @NotNull    验证对象是否不为null, 无法查检长度为0的字符串
    @NotBlank 检查约束字符串是不是Null还有被Trim的长度是否大于0,只对字符串,且会去掉前后空格.
    @NotEmpty 检查约束元素是否为NULL或者是EMPTY.
     
    Booelan检查
    @AssertTrue     验证 Boolean 对象是否为 true  
    @AssertFalse    验证 Boolean 对象是否为 false  
     
    长度检查
    @Size(min=, max=) 验证对象(Array,Collection,Map,String)长度是否在给定的范围之内  
    @Length(min=, max=) Validates that the annotated string is between min and max included.
     
    日期检查
    @Past           验证 Date 和 Calendar 对象是否在当前时间之前  
    @Future     验证 Date 和 Calendar 对象是否在当前时间之后  
    @Pattern    验证 String 对象是否符合正则表达式的规则
     
    数值检查,建议使用在Stirng,Integer类型,不建议使用在int类型上,因为表单值为“”时无法转换为int,但可以转换为Stirng为"",Integer为null
    @Min            验证 Number 和 String 对象是否大等于指定的值  
    @Max            验证 Number 和 String 对象是否小等于指定的值  
    @DecimalMax 被标注的值必须不大于约束中指定的最大值. 这个约束的参数是一个通过BigDecimal定义的最大值的字符串表示.小数存在精度
    @DecimalMin 被标注的值必须不小于约束中指定的最小值. 这个约束的参数是一个通过BigDecimal定义的最小值的字符串表示.小数存在精度
    @Digits     验证 Number 和 String 的构成是否合法  
    @Digits(integer=,fraction=) 验证字符串是否是符合指定格式的数字,interger指定整数精度,fraction指定小数精度。
     
    @Range(min=, max=) Checks whether the annotated value lies between (inclusive) the specified minimum and maximum.
    @Range(min=10000,max=50000,message="range.bean.wage")
    private BigDecimal wage;
     
    @Valid 递归的对关联对象进行校验, 如果关联对象是个集合或者数组,那么对其中的元素进行递归校验,如果是一个map,则对其中的值部分进行校验.(是否进行递归验证)
    @CreditCardNumber信用卡验证
    @Email  验证是否是邮件地址,如果为null,不进行验证,算通过验证。
    @ScriptAssert(lang= ,script=, alias=)
    @URL(protocol=,host=, port=,regexp=, flags=)
    

    4. 在目标方法bean类型前面添加@Valid注解

    public String save(@Valid Employee employee)
    

    补充
    还可以结合BindingResult,如果表单验证出错将会在后台和前台显示出错误信息;这里还要用到一个标签

    <form:errors path="bean属性名"/>

            name:<form:input path="empName"/>
            <form:errors path="empName"/><br>
            
            
            email:<form:input path="empEmail"/>
            <form:errors path="empEmail"/><br>
            
            gender:
            <form:radiobuttons path="empGender" items="${genders}"/>
            <form:errors path="empGender"/><br>
    
        /**添加Employee*/
        @RequestMapping(value="/emp",method=RequestMethod.POST)
        public String save(@Valid Employee employee,BindingResult result,Map<String,Object> map){
            if (result.getFieldErrorCount()>0){
                for (FieldError error:result.getFieldErrors()){
                    System.out.println(error.getField()+":"+error.getDefaultMessage());
                }
                
                Map<Integer,String> genders = new HashMap<Integer,String>();
                genders.put(0, "Female");
                genders.put(1, "Male");
                
                map.put("genders", genders);
                map.put("depts", departmentDao.getAll());
                
                //跳到要显示错误的页面(不能使用redirect)
                return "input";//
            }
            employeeDao.save(employee);
            return "redirect:/list";
        }
    //empEmail:不是一个合法的电子邮件地址
    //empEmail:不能为空
    //empName:不能为空
    //!!! @Valid修饰的bean对象必须紧挨着BindingResult对象
    
    Paste_Image.png

    自定义显示错误信息

    前面已经在后台和前台输出了表单验证的错误信息,但是错误信息的内容是已经内置好的,现在我们要自定义一份自己的表单验证错误信息

    1. 配置国际化资源文件
        <!-- 配置国际化资源文件 -->
        <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
            <property name="basename" value="errors"></property>
        </bean>
    
    1. src下创建errors.properties资源文件
    NotEmpty.employee.empName=\u8BF7\u8F93\u5165\u7528\u6237\u540D
    NotNull.employee.empGender=\u8BF7\u9009\u62E9\u6027\u522B
    NotEmpty.employee.empEmail=\u8BF7\u8F93\u5165\u90AE\u7BB1
    Email.employee.empEmail=\u8BF7\u8F93\u5165\u6B63\u786E\u683C\u5F0F\u7684\u90AE\u7BB1
    
    //格式:标签注解(不要@).bean名.bean对应属性
    required:必要的参数不存在,如@RequiredParam("param1")标注
    了一个入惨,但是该参数不存在
    typeMismatch:在数据绑定时,发生数据类型不匹配的问题,如日期格式不匹配
    methodInvocation:Spring MVC在调用处理方法时发生了错误******
    

    换个姿势再来一次

    Paste_Image.png

    相关文章

      网友评论

          本文标题:springmvc 10 表单与验证

          本文链接:https://www.haomeiwen.com/subject/xtgkuttx.html