zoukankan      html  css  js  c++  java
  • Spring 3 MVC and JSR303 @Valid example

    http://www.mkyong.com/spring-mvc/spring-3-mvc-and-jsr303-valid-example/

    ————————————————————————————————————————————————————————

    用jsr303验证表单数据,搞了很长时间,验证倒是验证了,但是@Valid不起作用,表现是:

    无论是否加@Valid, 都会验证,并且spring无法捕获到异常BindingResult.hasErrors始终是false。

    上面那个例子就可以。具体原因还不是很明了,按上面那个例子,对有问题的项目做如下处理:

    1 使用<mvc:annotation-driven />

    2 去掉DefaultAnnotationHandlerMapping, ControllerClassNameHandlerMapping, AnnotationMethodHandlerAdapter

    3 因为去掉了ControllerClassNameHandlerMapping,在控制器做相应处理

    ————————————————————————————

    现在想想之前尝试各种办法都不成功,有没有可能跟这个异常有关系呢?应该没有,之前应该已经尝试过这种情况。

    Caused by: java.lang.OutOfMemoryError: PermGen space

    ————————————————————————————————————————————————————————

    In Spring 3, you can enable “mvc:annotation-driven” to support JSR303 bean validation via @Valid annotation, if any JSR 303 validator framework on the classpath.

    Note
    Hibernate Validator is the reference implementation for JSR 303

    In this tutorial, we show you how to integrate Hibernate validator with Spring MVC, via @Valid annotation, to perform bean validation in a HTML form.

    Technologies used :

    1. Spring 3.0.5.RELEASE
    2. Hibernate Validator 4.2.0.Final
    3. JDK 1.6
    4. Eclipse 3.6
    5. Maven 3

    1. Project Dependencies

    Hibernate validator is available at JBoss public repository.

        <repositories>
            <repository>
                <id>JBoss repository</id>
                <url>http://repository.jboss.org/nexus/content/groups/public/</url>
            </repository>
        </repositories>
     
        <properties>
            <spring.version>3.0.5.RELEASE</spring.version>
        </properties>
     
        <dependencies>
     
            <!-- Spring 3 dependencies -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-core</artifactId>
                <version>${spring.version}</version>
            </dependency>
     
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-web</artifactId>
                <version>${spring.version}</version>
            </dependency>
     
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-webmvc</artifactId>
                <version>${spring.version}</version>
            </dependency>
     
            <!-- Hibernate Validator -->
            <dependency>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-validator</artifactId>
                <version>4.2.0.Final</version>
            </dependency>
     
        </dependencies>

    2. JSR303 Bean Validation

    A simple POJO, annotated with Hibernate validator annotation.

    Note
    Refer to this Hibernate validator documentation for detail explanation
    package com.mkyong.common.model;
     
    import org.hibernate.validator.constraints.NotEmpty;
    import org.hibernate.validator.constraints.Range;
     
    public class Customer {
     
        @NotEmpty //make sure name is not empty
        String name;
     
        @Range(min = 1, max = 150) //age need between 1 and 150
        int age;
     
        //getter and setter methods
     
    }

    3. Controller + @Valid

    For validation to work, just annotate the “JSR annotated model object” via @Valid. That’s all, other stuff is just a normal Spring MVC form handling.

    package com.mkyong.common.controller;
     
    import javax.validation.Valid;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.ModelMap;
    import org.springframework.validation.BindingResult;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import com.mkyong.common.model.Customer;
     
    @Controller
    @RequestMapping("/customer")
    public class SignUpController {
     
        @RequestMapping(value = "/signup", method = RequestMethod.POST)
        public String addCustomer(@Valid Customer customer, BindingResult result) {
     
            if (result.hasErrors()) {
                return "SignUpForm";
            } else {
                return "Done";
            }
     
        }
     
        @RequestMapping(method = RequestMethod.GET)
        public String displayCustomerForm(ModelMap model) {
     
            model.addAttribute("customer", new Customer());
            return "SignUpForm";
     
        }
     
    }

    4. Error Message

    By default, if validation failed.

    1. @NotEmpty will display “may not be empty”
    2. @Range will display “must be between 1 and 150″

    You can override it easily, create a properties with “key” and message. To know which @annotation bind to which key, just debug it and view value inside “BindingResult result“. Normally, the key is “@Annotation Name.object.fieldname“.

    File : messages.properties

    NotEmpty.customer.name = Name is required!
    Range.customer.age = Age value must be between 1 and 150

    5. mvc:annotation-driven

    Enable “mvc:annotation-driven” to make Spring MVC supports JSR303 validator via @Valid, and also bind your properties file.

    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:mvc="http://www.springframework.org/schema/mvc" 
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="
            http://www.springframework.org/schema/beans     
            http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
            http://www.springframework.org/schema/context 
            http://www.springframework.org/schema/context/spring-context-3.0.xsd
            http://www.springframework.org/schema/mvc
            http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
     
        <context:component-scan base-package="com.mkyong.common.controller" />
     
             <!-- support JSR303 annotation if JSR 303 validation present on classpath -->
        <mvc:annotation-driven />
     
        <bean id="viewResolver"
            class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix">
                <value>/WEB-INF/pages/</value>
            </property>
            <property name="suffix">
                <value>.jsp</value>
            </property>
        </bean>
     
            <!-- bind your messages.properties -->
        <bean class="org.springframework.context.support.ResourceBundleMessageSource"
            id="messageSource">
            <property name="basename" value="messages" />
        </bean>
     
    </beans>

    6. JSP Pages

    Last one, normal JSP page with Spring form tag library.

    File : SignUpForm.jsp

    <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
    <html>
    <head>
    <style>
    .error {
        color: #ff0000;
    }
     
    .errorblock {
        color: #000;
        background-color: #ffEEEE;
        border: 3px solid #ff0000;
        padding: 8px;
        margin: 16px;
    }
    </style>
    </head>
     
    <body>
        <h2>Customer SignUp Form - JSR303 @Valid example</h2>
     
        <form:form method="POST" commandName="customer" action="customer/signup">
            <form:errors path="*" cssClass="errorblock" element="div" />
            <table>
                <tr>
                    <td>Customer Name :</td>
                    <td><form:input path="name" /></td>
                    <td><form:errors path="name" cssClass="error" /></td>
                </tr>
                <tr>
                    <td>Customer Age :</td>
                    <td><form:input path="age" /></td>
                    <td><form:errors path="age" cssClass="error" /></td>
                </tr>
                <tr>
                    <td colspan="3"><input type="submit" /></td>
                </tr>
            </table>
        </form:form>
     
    </body>
    </html>

    File : Done.jsp

    <html>
    <body>
        <h2>Done</h2>
    </body>
    </html>

    6. Demo

    URL : http://localhost:8080/SpringMVC/customer – Customer form page, with 2 text boxes for name and age.

    Spring MVC JSR303 demo page

    URL : http://localhost:8080/SpringMVC/customer/signup – If you didn’t fill in the form and click on the “submit” button, your customized validation error messages will be displayed.

    Spring MVC JSR303 demo page - error message

    Download Source Code

    References

    1. Spring JSR303 validation documentation
    2. JSR303 bean validation
    3. Hibernate Validator
  • 相关阅读:
    C++文件流类与文件流对象
    当java出现异常,应如何进行处理
    C语言函数的声明以及函数原型
    MySQL的create table as 与 like区别
    java中BigDecimal加减乘除基本用法
    项目小结
    自动化测试 如何快速提取Json数据
    Java Map 集合类在selenium自动化测试设计中的应用
    UFT对于PDF 文档的操作方法 VBS代码
    Selenium 自动化测试中对页面元素的value比较验证 java语言
  • 原文地址:https://www.cnblogs.com/cuizhf/p/3528034.html
Copyright © 2011-2022 走看看