簡體   English   中英

Spring MVC 3表單驗證注釋被忽略了嗎?

[英]Spring MVC 3 form validation annotations ignored?

我正在學習如何使用本教程進行簡單的表單驗證: http//www.raistudies.com/spring/spring-mvc/form-validation-spring-mvc-3-hibernate-validator-jsr-303/

問題是,當我輸入無效數據(空白字段)時,任何地方的用戶都沒有錯誤。 result.hasErrors()總是產生錯誤。

我制作了以下代碼:

IndexController.java:

package pl.aadamczyk.springtest.controllers;

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import pl.aadamczyk.springtest.beans.LoginBean;

@Controller
@RequestMapping("/index")
public class IndexController
{   
    @RequestMapping(method = RequestMethod.GET)
    public String getIndex(ModelMap model)
    {
        LoginBean loginBean = new LoginBean();
        model.addAttribute("loginBean", loginBean);

        return "index";
    }
}

+ LoginController.java:

package pl.aadamczyk.springtest.controllers;

import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import pl.aadamczyk.springtest.beans.LoginBean;
import pl.aadamczyk.springtest.validators.LoginValidator;

@Controller
@RequestMapping("/login")
public class LoginController
{
    private LoginValidator loginValidator;

    private LoginValidator getValidator()
    {
        return loginValidator;
    }

    @Autowired
    public void setValidator(LoginValidator loginValidator)
    {
        this.loginValidator = loginValidator;
    }

    @RequestMapping(method= RequestMethod.POST)
    public String login(@Valid @ModelAttribute(value="loginBean") LoginBean loginBean,
                        ModelMap model,
                        BindingResult result)
    {
        System.out.println(result.hasErrors()); // always false

        loginValidator.validate(loginBean, result);

        return "redirect:index.html";

    }
}

+ LoginValidator.java

package pl.aadamczyk.springtest.validators;

import org.springframework.stereotype.Component;
import org.springframework.validation.Errors;
import org.springframework.validation.Validator;
import pl.aadamczyk.springtest.beans.LoginBean;

@Component
public class LoginValidator implements Validator
{
    @Override
    public boolean supports(Class<?> type)
    {
        return LoginBean.class.isAssignableFrom(type);
    }

    @Override
    public void validate(Object o, Errors errors)
    {

    }
}

LoginBean.java:

package pl.aadamczyk.springtest.beans;

import org.hibernate.validator.Length;
import org.hibernate.validator.NotEmpty;

public class LoginBean
{
    @NotEmpty(message="Username is mandatory.")
    @Length(min=3,max=25,message="Username must be between 3 and 25 characters length")
    private String username;

    @NotEmpty(message="Password field is mandatory.")
    @Length(min=3,max=25,message="Password must be between 5 and 25 characters length")
    private String password;

    // getters+setters skipped
}

index.jsp的一部分:

<form:form method="post" action="login.html" modelAttribute="loginBean">
    <table>
        <tr>
            <td>Login:</td>
            <td><form:input path="username"/></td>
            <td><form:errors path="username"/></td>
        </tr>
        <tr>
            <td>Password</td>
            <td><form:input path="password"/></td>
            <td><form:errors path="password"/></td>
        </tr>
        <tr>
            <td colspan="3"><button type="submit">Login</button></td>
        </tr>
    </table>
</form:form>

dispatcher-servlet的重要內容:

<context:annotation-config /> 
<context:component-scan base-package="pl.aadamczyk.springtest"/>
<mvc:annotation-driven/>

<bean id="viewResolver"
      class="org.springframework.web.servlet.view.InternalResourceViewResolver"
      p:prefix="/WEB-INF/jsp/"
      p:suffix=".jsp" />

pom.xml依賴項:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aop</artifactId>
    <version>3.1.1.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-asm</artifactId>
    <version>3.1.1.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aspects</artifactId>
    <version>3.1.1.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-beans</artifactId>
    <version>3.1.1.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>3.1.1.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>3.1.1.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>3.1.1.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-expression</artifactId>
    <version>3.1.1.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-instrument</artifactId>
    <version>3.1.1.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-instrument-tomcat</artifactId>
    <version>3.1.1.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>3.1.1.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jms</artifactId>
    <version>3.1.1.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-orm</artifactId>
    <version>3.1.1.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-oxm</artifactId>
    <version>3.1.1.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>3.1.1.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
    <version>3.1.1.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>3.1.1.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc-portlet</artifactId>
    <version>3.1.1.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>3.1.1.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-struts</artifactId>
    <version>3.1.1.RELEASE</version>
</dependency>
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <version>1.1.2</version>
</dependency>
<dependency>
    <groupId>taglibs</groupId>
    <artifactId>standard</artifactId>
    <version>1.1.2</version>
</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>3.0.0.ga</version>
    <type>jar</type>
</dependency>
<dependency>
    <groupId>javax</groupId>
    <artifactId>javaee-web-api</artifactId>
    <version>6.0</version>
    <scope>provided</scope>
</dependency>

要使驗證正常工作,請確保在類路徑中有最新版本的hibernate-validator

要在A JSP頁面中打印錯誤,請使用以下內容

<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
...

 <spring:hasBindErrors name="person">
    <div class="error">
        <c:forEach var="error" items="${errors.allErrors}">
            <p>Errors ${error.defaultMessage}</p>
        </c:forEach>
    </div>
</spring:hasBindErrors>

您還需要jstlspring-webmvc在類路徑庫。

BindingResult必須在驗證的模型對象之后,否則Spring將無法驗證對象並拋出異常。

Spring看到@Valid時 ,它會嘗試為要驗證的對象找到驗證器 如果啟用了注釋驅動, Spring會自動選擇驗證注釋。 然后,Spring調用驗證器並將任何錯誤放入BindingResult中 ,並將BindingResult添加到視圖模型中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM