2010-10-27 78 views
16

我需要帮助。我是jsp,MVC的初学者。我想在Spring 3 MVC中使用自定义验证器验证表单输入。Spring 3 MVC:使用自定义验证器显示验证消息

我的验证器类

package validators; 

import models.UserModel; 

import org.springframework.stereotype.Component; 
import org.springframework.validation.Errors; 
import org.springframework.validation.ValidationUtils; 
import org.springframework.validation.Validator; 
@Component 
public class UserValidator implements Validator { 

    @Override 
    public boolean supports(Class clazz) { 
     return UserModel.class.isAssignableFrom(clazz); 
    } 

    @Override 
    public void validate(Object target, Errors errors) { 
     ValidationUtils.rejectIfEmptyOrWhitespace(errors, "firstname", "Enter firstname."); 
     ValidationUtils.rejectIfEmptyOrWhitespace(errors, "surname", "Enter surname."); 
     ValidationUtils.rejectIfEmptyOrWhitespace(errors, "login", "Enter login."); 

    } 

} 

控制器类用户

package controllers; 

import java.util.ArrayList; 
import models.UserModel; 
import org.springframework.stereotype.Controller; 
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 org.springframework.web.servlet.ModelAndView; 
import validators.UserValidator; 
import database.UserDB; 


@Controller 
public class UserController { 

@RequestMapping(value="pouzivatel/new", method=RequestMethod.POST) 
    public ModelAndView newUser(@ModelAttribute UserModel user, BindingResult result){ 
     UserValidator validator = new UserValidator(); 
     validator.validate(user, result); 
     if(result.hasErrors()){ 
     return new ModelAndView("/user/new","command",user); 

     } 
     ... 
} 

模型

package models; 

public class UserModel { 
    private String firstname=""; 
    private String surname=""; 

    public String getFirstname() { 
     return firstname; 
    } 
    public String getSurname() { 
     return surname; 
    } 

    public void setFirstname(String firstname) { 
     this.firstname = firstname; 
    } 
    public void setSurname(String surname) { 
     this.surname = surname; 
    } 

} 

JSP教职员new.jsp这是在目录/ WEB-INF /用户(它只是形式)

<form:form method="post" action="new.html"> 
      <fieldset> 
       <table> 
        <tr> 
        <td> 
         <form:label path="firstname">FirstName</form:label> 
        </td> 
        <td> 
         <form:input path="firstname" /> 
         <form:errors path="firstname" /> 
        </td> 
        </tr> 
        <tr> 
        <td> 
         <form:label path="surname">Surname</form:label> 
        </td> 
        <td> 
         <form:input path="surname" /> 
         <form:errors path="surname" /> 
        </td> 
        </tr> 
       </table> 
      </fieldset> 
      <div> 
       <button type="submit" id="btOk">Ok</button> 
      </div> 
</form:form> 

调度servlet.xml中

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:p="http://www.springframework.org/schema/p" 
    xmlns:context="http://www.springframework.org/schema/context" 
    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"> 

    <context:component-scan base-package="controllers" /> 
    <context:component-scan base-package="validators" /> 

    <bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver"> 
     <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> 
     <property name="prefix" value="/WEB-INF/jsp/" /> 
     <property name="suffix" value=".jsp" /> 
    </bean> 

</beans> 

问题是在视图的显示验证消息。验证成功并且在变量resut(BindingResult)中有错误。控制器返回遵循的代码部分

if(result.hasErrors()){ 
     return new ModelAndView("/user/new","command",user); 

另一种方法是使用注释验证(我preffer自定义验证),但为什么我不能看到视图验证消息,当输入字段为空。

你能举个例子怎么做对吗?

感谢您的回复。

回答

20

这是因为默认模型之间的不匹配的属性在视图和控制器的名字:

  • 当你写<form:form>没有modelAttribute(或commandName)属性,它使用默认的模型属性名称command
  • 当您在您的控制器中编写@ModelAttribute UserModel user时,它假定此属性的名称是一个非资产类名称,即userModel

也就是说,通过验证产生的错误消息被绑定到模型命名userModel属性,而你的观点试图显示错误的模型属性command

您需要在视图(<form:form modelAttribute = "userModel" ...>)或控制器(@ModelAttribute("command"))中明确设置模型属性名称。

+0

非常感谢,现在正在工作。 – Jerry 2010-10-27 15:15:13