9月4日

コントローラの実装

作成したDAOを経由してMyDataを利用するコントローラを作成する。

新規でコントローラクラスを作成する。
クラス名: MyDataController

MyDataController.java

package jp.abc;

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

@Controller
public class MyDataController {

	@RequestMapping(value = "/mydata", method = RequestMethod.GET)
	public String mydata(Model model) {
		return "mydata";
	}
}

新規にJSPファイルを作成する。
src/main/webapp/WEB-INF/view/mydata.jsp

最初は動作確認のために、シンプルなJSPを作成する。

mydata.jsp

<!DOCTYPE html>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>MyData</title>
</head>
<body>
	<h1>${title}</h1>
	<p>${message}</p>
</body>
</html>

次に、サーバーから受け取ったデータを表示できるようにJSPを変更する。

mydata.jsp

<!DOCTYPE html>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>MyData</title>
</head>
<body>
	<h1>${title}</h1>
	<p>${message}</p>
	<table>
	<form:form modelAttribute="myData">
		<form:errors path="*" />
		<form:hidden path="id"/>
		<tr>
			<td><form:label path="name">名前</form:label></td>
			<td><form:input path="name" size="20" /></td>
		</tr>
		<tr>
			<td><form:label path="age">年齢</form:label></td>
			<td><form:input path="age" size="20" /></td>
		</tr>
		<tr>
			<td><form:label path="mail">メール</form:label></td>
			<td><form:input path="mail" size="20" /></td>
		</tr>
		<tr>
			<td><form:label path="memo">メモ</form:label>
			<td><form:textarea path="memo" cols="20" rows="5" /></td>
		</tr>
		<tr><td></td><td><input type="submit"></td></tr>
	</form:form>
	</table>
	<hr />
	<c:if test="${datalist != null}">
		<table border="1">
			<tr><th>ID</th><th>名前</th></tr>
			<c:forEach var="obj" items="${datalist}" varStatus="status">
				<tr>
					<td>${obj.id}</td>
					<td>${obj.name}</td>
				</tr>
			</c:forEach>
		</table>
	</c:if>
</body>
</html>

この状態で http://localhost:8080/MyData/mydata/ にアクセスするとJSPが必要としているデータが設定されていないためにエラーになる。
JSP側でアクセスしようとしているデータを、MyDataController で設定する。

MyDataController.java

package jp.abc;

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

@Controller
public class MyDataController {

	@RequestMapping(value = "/mydata", method = RequestMethod.GET)
	public String mydata(Model model) {
		model.addAttribute("title", "MyData");
		model.addAttribute("message", "データを入力してください");
		MyData mydata = new MyData();
		model.addAttribute("myData", mydata);
		return "mydata";
	}
}

MyDataControllerで必要なデータを設定すれば、画面を表示できるようになる。

バリデーションを有効にするために、pom.xml に dependency を追加する。

pom.xml

		<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.0.1.Final</version>
		</dependency>

今の設定ではTomcatを再起動するとデータベースのテーブルが初期化されるので、設定を変更してデータベースサーバーに保存できるようにする。

Eclipseマーケットプレイスで「HSQLDB」を検索し、「HSQLDB Database Server」をインストールする。
インストール後にEclipseが再起動したら、[ウィンドウ]-[ビューの表示]-[その他]を選択。
「HSQLDB Server」を選択して「OK」すると、下のタブに「HSQLDB Server」が追加される。

以下、設定の変更。

persistence.xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  version="2.0"
  xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
  <persistence-unit name="persistenceUnit" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <properties>
      <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect" />
      <property name="hibernate.hbm2ddl.auto" value="update" />
      <property name="javax.persistence.jdbc.driver" value="org.hsqldb.jdbc.JDBCDriver" />
      <property name="javax.persistence.jdbc.url" value="jdbc:hsqldb:hsql://localhost/mydatabase" />
    </properties>
  </persistence-unit>
</persistence>

database.properties

database.driverClassName=org.hsqldb.jdbc.JDBCDriver
database.url=jdbc:hsqldb:hsql://localhost/mydatabase
database.username=sa
database.password=

データベースサーバーに接続できるようになったので、コントローラにコードを追加する。

MyDataController.java

package jp.abc;

import java.util.List;

import javax.validation.Valid;

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

@Controller
public class MyDataController {

	@RequestMapping(value = "/mydata", method = RequestMethod.GET)
	public String mydata(Model model) {
		model.addAttribute("title", "MyData");
		model.addAttribute("message", "データを入力してください");
		MyData mydata = new MyData();
		model.addAttribute("myData", mydata);
		MyDataDao<MyData> dao = new MyDataDaoImpl();
		List<MyData> list = dao.getAll();
		model.addAttribute("datalist", list);
		return "mydata";
	}

	@RequestMapping(value = "/mydata", method = RequestMethod.POST)
	public String form(@Valid @ModelAttribute MyData mydata, Errors errors, Model model) {
		if (errors.hasErrors()) {
			model.addAttribute("title", "MyData - エラー");
			model.addAttribute("message", "値をチェックしてください");
			return "mydata";
		}
		MyDataDao<MyData> dao = new MyDataDaoImpl();
		dao.add(mydata);
		return "redirect:/mydata";
	}
}

コメントを残す

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