2010-10-27 3 views
16

Potrzebuję pomocy. Jestem początkujący w jsp, MVC. Chcę zweryfikować dane wejściowe formularza z niestandardowym weryfikatorem w Spring 3 MVC.Spring 3 MVC: Pokaż komunikat sprawdzania poprawności z własnym weryfikatorem

Moja klasa walidator

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."); 

    } 

} 

klasy Controller

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); 

     } 
     ... 
} 

Wzór Użytkownika

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 veiw new.jsp który jest w katalogu/WEB-INF/użytkownika (IT tylko forma)

<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> 

dyspozytora 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> 

Problem jest wiadomość walidacji wyświetlane w widoku. Sprawdzanie poprawności powiodło się, a zmienna resut (BindingResult) to błędy. powrót kontroler wykonaj część kodu

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

Innym sposobem jest użycie adnotacji walidacji (I preferujących własny walidator), ale dlaczego nie mogę zobaczyć komunikaty walidacji na widoku, gdy pola wejściowe są puste.

Czy możesz dać mi przykład, jak to zrobić dobrze?

Dzięki za odpowiedź.

Odpowiedz

20

Dzieje się tak z powodu niedopasowania modelu domyślnej nazwy atrybutów w widoku i kontrolera:

  • Kiedy piszesz <form:form> bez modelAttribute (lub commandName) atrybutu, używa domyślnego modelu nazwa atrybutu command.
  • Podczas pisania @ModelAttribute UserModel user w kontrolerze zakłada się, że nazwa tego atrybutu jest zdekapitalizowaną nazwą klasy, tj. userModel.

Oznacza to, że komunikaty o błędach produkowane przez walidator są zobowiązane do modelowania atrybut o nazwie userModel, podczas gdy twój widok próbuje pokazać błędy do atrybutu modelu command.

Należy jawnie ustawić nazwę atrybutu modelu w widoku (<form:form modelAttribute = "userModel" ...>) lub w kontrolerze (@ModelAttribute("command")).

+0

Dziękuję bardzo, działa już. – Jerry