Я проверяю простую форму с использованием 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
. Любые подсказки или рекомендации были бы полезны для меня.
[Приложение работает без ошибок, но форма, которая предназначена быть подтверждена не подтверждена]
Какие изменения я должен внести в свой код, чтобы заставить его работать? Не могли бы вы рассказать мне? – Tiny
Вот быстрая и грязная версия, ознакомьтесь с руководством по весне для подробных примеров. – Affe
Привет @Affe. Я изменил способ проверки форм. Теперь я использую 'Validator' вместо' HibernateValidator', так как мне приходится работать с 'SimpleFormController', хотя он уже устарел. Я только что внедрил метод проверки формы с помощью 'Validator', и он работает отлично. Большое спасибо за ваше предложение. Я действительно ошибался, чтобы проверить формы, которые я мог знать из вашего ответа. Я оболочка, конечно, поставил метод, который вы предложили на практике позже. – Tiny