2010-10-27 17 views
16

Ho bisogno di aiuto. Sono un principiante in jsp, MVC. Voglio convalidare il modulo di input con validatore personalizzato in Spring 3 MVC.Spring 3 MVC: mostra il messaggio di convalida con validatore personalizzato

La mia classe di convalida

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

    } 

} 

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

     } 
     ... 
} 

modello per l'utente

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 che si trova nella directory/WEB-INF/utente (si solo 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> 

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

problema è un messaggio di convalida di visualizzazione in vista. La validazione ha esito positivo e in variabile resut (BindingResult) sono errori. ritorno controller seguire parte del codice

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

Un altro modo è la convalida l'uso di annotazione (I preffer validatore personalizzato), ma perché non riesco a vedere i messaggi di validazione in mostra, quando i campi di input sono vuoti.

Potete darmi un esempio su come farlo nel modo giusto?

Grazie per la risposta.

risposta

20

Questo accade a causa della mancata corrispondenza tra il modello predefinito per l'attributo nomi in vista e controllore:

  • Quando si scrive <form:form> senza modelAttribute (o commandName) attributo, utilizza il modello predefinito attributo name command.
  • Quando si scrive @ModelAttribute UserModel user nel controller, si presume che il nome di questo attributo sia un nome di classe decapitalizzato, ad esempio userModel.

Cioè, i messaggi di errore prodotti dal validatore sono destinati a modellare attributo denominato userModel, mentre la visualizzazione cerca di mostrare gli errori per l'attributo del modello command.

È necessario impostare un nome di attributo del modello esplicitamente, nella vista (<form:form modelAttribute = "userModel" ...>) o nel controller (@ModelAttribute("command")).

+0

Grazie mille, sta funzionando ora. – Jerry

Problemi correlati