2012-06-30 2 views
0

Я проверяю простую форму с использованием Spring и Hibernate в JSP (используя SimpleFormController) с помощью HibernateValidator, как описано here. Форма, содержащая только одно поле, такова.Проверка формы в JSP

<%@page contentType="text/html" pageEncoding="UTF-8" %> 
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 
<%@taglib uri="http://www.springframework.org/tags/form" prefix="form" %> 

<form:form method="post" id="userForm" name="userForm" action="Temp.htm" commandName="validationForm">   

    <table> 
     <tr> 
      <td>User Name:<font color="red"><form:errors path="userName" /></font></td> 
     </tr> 

     <tr> 
      <td><form:input path="userName" /></td> 
     </tr>    

     <tr> 
      <td><input type="submit" value="Submit" /></td> 
     </tr> 
     </table> 

</form:form> 

Ниже приведен командный класс, в котором определены критерии валидации.

package validators; 

import javax.validation.constraints.Size; 
import org.hibernate.validator.constraints.NotEmpty; 


final public class ValidationForm 
{ 
    @NotEmpty(message="Must not be left blank.") 
    @Size(min = 1, max = 2) 
    private String userName; 

    public void setUserName(String userName) 
    { 
      this.userName = userName; 
    } 

    public String getUserName() 
    { 
      return userName; 
    }   
} 

Ниже приводится dispatchar-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:aop="http://www.springframework.org/schema/aop"    
    xmlns:mvc="http://www.springframework.org/schema/mvc" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd 
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-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"> 




<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping" /> 
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" /> 


<bean id="tempService" class="usebeans.TempServiceImpl" /> 
<bean id="tempController" class="controller.Temp" p:tempService-ref="tempService" p:formView="Temp" p:successView="Temp"/> 

<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> 
    <property name="basename" value="/WEB-INF/messages" /> 
</bean> 

<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> 
    <property name="mappings"> 
     <props> 
      <prop key="index.htm">indexController</prop> 
      <prop key="Temp.htm">tempController</prop>     
     </props> 
    </property> 
</bean> 

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

<bean name="indexController" 
     class="org.springframework.web.servlet.mvc.ParameterizableViewController" 
     p:viewName="index" /> 

Где TempService представляет собой интерфейс, содержащий только один метод add(ValidationForm validationForm){...} и TempServiceImpl это класс, который реализует интерфейс TempService.

Контрольный класс Temp выглядит следующим образом.

package controller; 

import java.util.HashMap; 
import java.util.Map; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import javax.validation.Valid; 
import org.springframework.validation.BindException; 
import org.springframework.web.bind.annotation.ModelAttribute; 
import org.springframework.web.servlet.ModelAndView; 
import org.springframework.web.servlet.mvc.SimpleFormController; 
import usebeans.TempService; 
import validators.ValidationForm; 

@SuppressWarnings("deprecation") 
final public class Temp extends SimpleFormController 
{ 
    private TempService tempService=null; 
    public Temp() 
    {    
     setCommandClass(ValidationForm.class); 
     setCommandName("validationForm"); 
    } 

    //This method may not be necessary. 
    public void setTempService(TempService tempService) 
    { 
     this.tempService = tempService; 
    } 

    @Override 
    protected ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response, @ModelAttribute("validationForm") @Valid Object command, BindException errors) throws Exception 
    { 
     ValidationForm validationForm=(ValidationForm) command; 
     tempService.add(validationForm); //May not be necessary.   

     if(errors.hasErrors()) //Never evaluates to true even though the text box on the form is left blank. 
     {     
      System.out.println("User Name : "+validationForm.getUserName()); 
      //Or do something. 
     }  
     else 
     { 
      //Do some stuff such as database operations like insert, update or delete. 
     }   

     ModelAndView mv=new ModelAndView("Temp", "validationForm", validationForm); 
     return mv; 
    } 

    @Override 
    protected ModelAndView showForm(HttpServletRequest request, HttpServletResponse response, BindException errors) throws Exception 
    {    
     ModelAndView mv=new ModelAndView("Temp", "validationForm", new ValidationForm()); 
     return mv; 
    } 
} 

Теперь, что происходит здесь в том, что, когда форма будет отправлена ​​на нажатия на кнопке только представить в форме, метод onSubmit() в классе контроллера Temp вызывается, в котором я навязывание if состояния if(errors.hasErrors()){} ,

Соответственно, если только TextField на форме пусто, то форма, рендеринг содержит ошибки проверки и условия if должны быть оценены, чтобы верно и указанное сообщение об ошибке должно отображаться (как указано в ValidationForm класса @NotEmpty(message="Must not be left blank.")) но этого никогда не бывает [Объект ValidationForm доступен через параметр Object command метода onSubmit()]. Условие никогда не оценивает значение true, имеет ли текстовое поле значение.

Что мне здесь не хватает? Я чувствую, что следую неправильному способу использования HibernateValidator. Любые подсказки или рекомендации были бы полезны для меня.

[Приложение работает без ошибок, но форма, которая предназначена быть подтверждена не подтверждена]

ответ

1

Ввода @Valid по методе Params не работает с старомодными контроллерами, которые простираются от CommandController и его детей (например, SimpleFormController). Это особенность AnnotationMethodHandlerAdapter, поэтому вам нужно использовать аннотированный контроллер для его работы.

(Существует причина, вы должны были подавить предупреждение устаревания на этом классе! :)) переваривать версия

читателя:

Вместо определение собственного urlMapping и все в диспетчерском использовании <mvc:annotation-driven/>

Затем вместо расширения из SimpleFormController вы просто создаете обычный класс и аннотируете его с помощью @Controller и вашего метода с помощью @RequestMapping.

@Controller 
@RequestMapping("/Temp.htm") 
public class Temp { 

@RequestMapping(method=RequestMethod.GET) 
public ModelAndView getForm() { 
    ModelAndView mv=new ModelAndView("Temp", "validationForm", new ValidationForm()); 
    return mv; 
} 

@RequestMapping(method=RequestMethod.POST) 
public ModelAndView postForm(@Valid ValidationForm validationForm, BindingResult errors) { 
     tempService.add(validationForm); //May not be necessary.   

     if(errors.hasErrors()) //Never evaluates to true even though the text box on the form is left blank. 
     {     
      System.out.println("User Name : "+validationForm.getUserName()); 
      //Or do something. 
     }  
     else 
     { 
      //Do some stuff such as database operations like insert, update or delete. 
     }   

     ModelAndView mv=new ModelAndView("Temp", "validationForm", validationForm); 
     return mv; 
} 

В Интернете есть тонны учебников, в которых содержится больше контента, чем я могу воспроизвести здесь.Ознакомьтесь с текущей версией примера приложения Spring PetClinic для подробных примеров.

+0

Какие изменения я должен внести в свой код, чтобы заставить его работать? Не могли бы вы рассказать мне? – Tiny

+0

Вот быстрая и грязная версия, ознакомьтесь с руководством по весне для подробных примеров. – Affe

+0

Привет @Affe. Я изменил способ проверки форм. Теперь я использую 'Validator' вместо' HibernateValidator', так как мне приходится работать с 'SimpleFormController', хотя он уже устарел. Я только что внедрил метод проверки формы с помощью 'Validator', и он работает отлично. Большое спасибо за ваше предложение. Я действительно ошибался, чтобы проверить формы, которые я мог знать из вашего ответа. Я оболочка, конечно, поставил метод, который вы предложили на практике позже. – Tiny

Смежные вопросы