Spring MVCについて

MVCとは構造をModel –View-Controllerに分離し設計することです。Spring MVCはそれぞれが独立し、疎結合であるため、さまざまな拡張が可能になっています。

簡単なサンプルを動かしながら説明していきます。

Eclipseメニューの新規作成からSpringプロジェクトを選択しテンプレートはSpring MVC Projectを選択してください。
次に進むとパッケージ名を求められます。なにを入力しても構いませんが、ここではcom.mvc.sampleとしました。
作成したプロジェクトを実行し、Hello Worldの文字とサーバ時間が表示されれば問題無いです。

また作成したままでは日本語が文字化けするのでweb.xmlへ以下のエンコードフィルターを追記してください。

<filter>
		<filter-name>characterEncodingFilter</filter-name>
		<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
		<init-param>
			<param-name>forceEncoding</param-name>
			<param-value>true</param-value>
		</init-param>
</filter>
<filter-mapping>
		<filter-name>characterEncodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
</filter-mapping>

さらにjspファイルは明示的に文字コードUTF-8で宣言してください。

src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml
src/main/webapp/WEB-INF/spring/root-context.xml
上記のファイルが作成されます。上からMVCの設定ファイル、ビジネスロジックの設定ファイルとなります。

簡単にMVC設定ファイルの説明をします。
基本的な違いはBensタグ内でmvsのカスタムスキーマを導入しているところです。
次に<annotation-driven />ですが、これを定義することでSpringMVCのデフォルト設定が行われます。アノテーションを使用する場合必須と覚えておいてください。
resourceタグは静的なリソースファイルにアクセスするための設定です。
その下の設定はviewのResolverの設定になります。ここではviewの配置場所を定義しています。
最後のcontext:component-scanは@ControllerタグをDIコンテナへ登録するためのものです。設定したしたパッケージ内へControllerを探しに行きます。

次にコントロラークラスについて説明します。
@Controllerタグを付けることでDIコンテナより、コントロールクラスが自動で読み込まれます。上記の設定ファイルでスキャンの対象になっています。
@RequestMappingではURLとControllerメソッドをマッピングしています。
今回の設定ではGETでURLが「/」にアクセスする際実行されます。
homeメソッド内ではveiwに渡すオブジェクトを設定しています。
最後にreturnでveiw名を返却しています。上記のMVCの設定ファイルのresolverの設定で/WEB-INF/views/home.jspにレンダリングされます。

簡単なやまびこアプリを作成します。

com.mvc.sampleパッケージ以下にechoパッケージを作成します。
その中へ EchoFormクラス/EchoControllerクラスを作成します。
次にsrc/main/webapp/WEB-INF/views/へechoフォルダを作成します。
その中へindex.jsp/hello.jspファイルを作成します。

package com.mvc.sample.echo;

public class EchoForm {

	private String name;

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

	public String getName(){
		return name;
	}
}
package com.mvc.sample.echo;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("echo")
public class EchoController {

	@ModelAttribute
	public EchoForm setUpEchoFrom(){
		EchoForm form = new EchoForm();
		return form;
	}

	@RequestMapping
	public String index(Model model){
		return "echo/index";
	}

	@RequestMapping("hello")
	public String hello(EchoForm form, Model model){
		model.addAttribute("name", form.getName());
		return "echo/hello";
	}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@taglib uri="http://www.springframework.org/tags" prefix="spring" %>
<%@taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Echo Application</title>
</head>
<body>
	<form:form modelAttribute="echoForm" action="${pageContext.request.contextPath}/echo/hello">
		<form:label path="name">Input Your Name:</form:label>
		<form:input path="name" />
		<input type="submit" />
	</form:form>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@taglib uri="http://www.springframework.org/tags" prefix="spring" %>
<%@taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Echo Application</title>
</head>
<body>
	<p>
		Hello <c:out value="${name }" />
	</p>
</body>
</html>

Echoクラスはプロパティを1つだけ持つ単純なプロパティです。

Controllerクラスでの説明をします。
@ModelAttributeというアノテーションがついたメソッドがありますが、これがついたメソッドは戻り値を自動でmodelに追加します。
Modelの属性をアノテーションで指定することもできますが、今回はデフォルトのまま使用しています。この場合、クラス名の先頭を小文字にした値が属性名となり、今回は「echoForm」という値になっています。この値はform:formタグのmodelattributeの値と一致している必要があります。
次に@RequestMappingです。
クラスにはvalue属性の値を「echo」、indexメソッドはデフォルトで、helloメソッドには「hello」を設定しています。メソッドのアノテーションにvalue属性を明示的に設定しない場合は、クラスに付与された@RequestMappingのルートにマッピングされます。今回「<cntextPath>/echo>」にアクセスするとindexメソッドが呼ばれるようになっています。
またmethod属性に何も設定しない場合は任意のHTTPメソッドでマッピングされます。
Helloメソッドの引数では、EchoFormに先ほどModelに追加したEchoFormオブジェクトが渡されています。

index.jspではタグライブラリでHTMLを構築しています。modelAttribute属性に、Controllerで用意したフォームオブジェクトの名前を指定しています。

hello.jspでは、helloメソッドから帰ってきた値を表示しています。

次は入力チェックについてです。
SpringMVCはBean Validation(JSR-303)という、アノテーションで入力チェックを行ってくれるものがあります。
簡単に実装ができるので先のサンプルを元に実装します。

まずBean Validationを利用するため、pom.xmlのdependenciesのなかへ以下を追記してください。

<!-- Bean Validation (JSR-303) -->
<dependency>
	<artifactId>hibernate-validator</artifactId>
	<groupId>org.hibernate</groupId>
	<version>4.3.1.Final</version>
</dependency>

次に先のサンプルへ変更を加えます。

package com.mvc.sample.echo;

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;


public class EchoForm {

	@NotNull
	@Size(min = 1, max = 5)
	private String name;

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

	public String getName(){
		return name;
	}
}
package com.mvc.sample.echo;

import javax.validation.Valid;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("echo")
public class EchoController {

	@ModelAttribute
	public EchoForm setUpEchoFrom(){
		EchoForm form = new EchoForm();
		return form;
	}

	@RequestMapping
	public String index(Model model){
		return "echo/index";
	}

	@RequestMapping("hello")
	public String hello(@Valid EchoForm form, BindingResult result, Model model){
		if(result.hasErrors()){
			return "echo/index";
		}
		model.addAttribute("name", form.getName());
		return "echo/hello";
	}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@taglib uri="http://www.springframework.org/tags" prefix="spring" %>
<%@taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Echo Application</title>
</head>
<body>
	<form:form modelAttribute="echoForm" action="${pageContext.request.contextPath}/echo/hello">
		<form:label path="name">Input Your Name:</form:label>
		<form:input path="name" />
		<form:errors path="name" cssStyle="color:red" />
		<input type="submit" />
	</form:form>
</body>
</html>

処理はすべてframeworkが行ってくれます。
追記したものについて説明します。
@NotNullアノテーションはリクエストにnameパラメータがあるか確認し、@Sizeはパラメータの値のサイズを判定します。
コントローラーではValidation対象の引数に@ValidアノテーションとBindingResultを追加しています。入力チェックの結果は、BindingResulオブジェクトに渡されるようになっています。
メソッド内でhasErrorsメソッドを実行し入力結果を判定しています。エラーが有った場合はエラーメッセージとともにindex.jspへ受け渡されます。
Index.jspのform:errorsはエラーメッセージ用のタグになっています。

今回最も簡単なSpringMVCの利用方法について説明させてもらいました。
以上で解説終わります。

この記事を読んだ人は以下の記事も読んでいます

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA