0

ここで説明するように、JSPでSpringとHibernateを使用して(を使用してSimpleFormController)単純なフォームを検証しています。フィールドを1つだけ含むフォームは次のとおりです。HibernateValidator

<%@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で、は1つのメソッドのみを含むインターフェイスで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が呼び出されることです。ifif(errors.hasErrors()){}

したがって、フォーム上の唯一のTextFieldが空の場合、レンダリングしているフォームには検証エラーが含まれ、if条件はtrueと評価され、指定されたエラーメッセージが表示されます(ValidationFormクラスで指定されているように@NotEmpty(message="Must not be left blank."))が、これは発生しません[オブジェクトのは、メソッドのパラメータをValidationForm介して利用できますObject commandonSubmit()]。テキストボックスに値が含まれているかどうかに関係なく、条件がtrueと評価されることはありません。

ここで何が欠けていますか?間違った使い方をしているような気がしますHibernateValidator。ヒントやガイドラインは私に役立ちます。

[アプリケーションはエラーなしで実行されますが、検証されることを目的としたフォームは検証されません]

4

1 に答える 1

1

メソッドparamsに@Validを設定すると、から拡張された旧式のコントローラー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;
}

インターネット上には、ここで再現できるよりもはるかに多くのコンテンツを含むチュートリアルがたくさんあります。詳細な例については、SpringPetClinicサンプルアプリケーションの現在のバージョンを確認してください。

于 2012-06-30T19:02:28.773 に答える