トッカンソフトウェア

Spring アノテーションで入力チェック

今回はアノテーションで入力チェックをやります。MVCでHello Worldをベースに変更部分だけ記述するので、
まずはMVCでHello Worldを作成して下さい。


簡易版

pom.xml

				
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>springMVC</groupId>
	<artifactId>springMVC</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>war</packaging>
	<build>
		<sourceDirectory>src</sourceDirectory>
		<plugins>
			<plugin>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.3</version>
				<configuration>
					<source>1.8</source>
					<target>1.8</target>
				</configuration>
			</plugin>
			<plugin>
				<artifactId>maven-war-plugin</artifactId>
				<version>2.6</version>
				<configuration>
					<warSourceDirectory>WebContent</warSourceDirectory>
					<failOnMissingWebXml>false</failOnMissingWebXml>
				</configuration>
			</plugin>
		</plugins>
	</build>
	<dependencies>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>4.2.3.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>javax.servlet-api</artifactId>
			<version>4.0.1</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>javax.validation</groupId>
			<artifactId>validation-api</artifactId>
			<version>1.1.0.Final</version>
		</dependency>
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-validator</artifactId>
			<version>5.2.4.Final</version>
		</dependency>
	</dependencies>
</project>


			

UserModel.java

				
package spring.test;

import javax.validation.constraints.Size;

import org.hibernate.validator.constraints.NotBlank;

public class UserModel {

	@NotBlank
	@Size(min = 0, max = 3)
	String id;
	String name;

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}


			

LoginControler.java

				
package spring.test.controller;

import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.validation.annotation.Validated;
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 spring.test.UserModel;

@Controller
@RequestMapping(value = "/login")
public class LoginControler {

	@ModelAttribute("UM")
	public UserModel init() {
		return new UserModel();
	}

	@RequestMapping(method = RequestMethod.GET)
	public String loginGet() {
		return "login";
	}

	@RequestMapping(method = RequestMethod.POST)
	public ModelAndView loginPost(@Validated @ModelAttribute("UM") UserModel userModel, 
			BindingResult bindingResult) {

		String id = userModel.getId();
		ModelAndView mv = new ModelAndView("login");

		if (bindingResult.hasErrors()) {
			String message = "";
			for (FieldError fieldError : bindingResult.getFieldErrors()) {

				message += "<hr />Field:" + fieldError.getField();
				message += "<br />Code:" + fieldError.getCode();
				message += "<br />DefaultMessage:" + fieldError.getDefaultMessage();
			}
			userModel.setName("");
			mv.addObject("msg", message);
			return mv;
		}
		if (id.equals("abc")) {
			userModel.setName("ABCさん");
			mv.addObject("msg", "ログイン成功");
		} else {
			userModel.setName("");
			mv.addObject("msg", "ログイン失敗2");
		}
		return mv;
	}
}

			

実行イメージ

未入力


桁数エラー


メッセージを指定

簡易版ではSpringのデフォルトメッセージを表示するだけでしたが、今回は自分で用意したメッセージを
messageSourceを利用して表示してみます。またJsp側でもメッセージ表示をやってみます。

messageSourceについてはこちらを参照ください。


applicationContext.xml

				
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="
		http://www.springframework.org/schema/beans
		http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
		http://www.springframework.org/schema/context
		http://www.springframework.org/schema/context/spring-context-4.2.xsd
		http://www.springframework.org/schema/mvc
		http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd">

	<context:component-scan base-package="spring.test" />

	<mvc:annotation-driven />

	<bean id="messageSource"
		class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
		<property name="basename" value="/META-INF/messages" />
	</bean>
	<bean
		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/WEB-INF/" />
		<property name="suffix" value=".jsp" />
	</bean>
</beans>

			

LoginControler.java

				
package spring.test.controller;

import java.util.Locale;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.validation.annotation.Validated;
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 spring.test.UserModel;

@Controller
@RequestMapping(value = "/login")
public class LoginControler {

	@Autowired
	MessageSource messageSource;

	@ModelAttribute("UM")
	public UserModel init() {
		return new UserModel();
	}

	@RequestMapping(method = RequestMethod.GET)
	public String loginGet() {
		return "login";
	}

	@RequestMapping(method = RequestMethod.POST)
	public ModelAndView loginPost(@Validated @ModelAttribute("UM") UserModel userModel, BindingResult bindingResult,
			Locale locale) {

		String id = userModel.getId();
		ModelAndView mv = new ModelAndView("login");

		if (bindingResult.hasErrors()) {
			String message = "";
			for (FieldError fieldError : bindingResult.getFieldErrors()) {

				message += "Field:" + fieldError.getField();
				message += "<br />Code:" + fieldError.getCode();
				message += "<br />DefaultMessage:" + fieldError.getDefaultMessage();
				String[] strs = { 
					messageSource.getMessage(fieldError.getField(), null, locale) };
				message += "<br />Message:" + 
					messageSource.getMessage(fieldError.getCode(), strs, locale);
			}
			userModel.setName("");
			mv.addObject("msg", message);
			return mv;
		}
		if (id.equals("abc")) {
			userModel.setName("ABCさん");
			mv.addObject("msg", "ログイン成功");
		} else {
			userModel.setName("");
			mv.addObject("msg", "ログイン失敗2");
		}
		return mv;
	}
}

			

login.jsp

				
<%@ page import="spring.test.controller.LoginControler"%>
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<html>
<head>
<title>ログイン</title>
</head>
<body>
	<spring:url value="/login" var="url" htmlEscape="true" />
	<form:form action="${url}" method="POST" modelAttribute="UM">

		ID:<form:input path="id" />
		<form:input path="name" disabled="true" />
		<BR />
		<input type="submit" value="ログイン" />
		<BR />
		<h4>Jsp側で作成したメッセージ①</h4>
		<form:errors path="*" />
		<h4>Jsp側で作成したメッセージ②</h4>
		<form:errors path="id" />
		<h4>Jsp側で作成したメッセージ③</h4>
		<spring:hasBindErrors name="UM">
			<c:forEach items="${errors.fieldErrors}" var="error">
				<spring:message message="${error}" />
			</c:forEach>
		</spring:hasBindErrors>
	</form:form>
	<h4>サーバ側で作成したメッセージ</h4>
	${msg}
</body>
</html>

			

messages.properties

				
id=ID(アイディー)
NotBlank={0}を入力して下さい。

			

実行イメージ

未入力




ページのトップへ戻る