SpringMVCによるWebアプリを作成する練習問題
ToDoリストアプリ
プロジェクト名: ToDo
パッケージ名: jp.abc
コントローラクラス名: ToDoController
エンティティクラス名: ToDo
JSPファイル名: todo.jsp
最初に基本動作となる画面遷移部分を作成する。
- プロジェクトを作成する。
- [Maven]-[プロジェクトの更新]を実行する。
- [実行]-[maven install]を実行する。
- Tomcatサーバーに作成したプロジェクトを追加する。
- Tomcatサーバーを起動する。
- http://localhost:8080/ToDo/ にアクセスする。
→ 「click to enter」表示でOK - mvc-config.xml を修正して jp.abc パッケージを読み込むようにする。
- ToDoControllerを作成する。
- ToDoControllerで指定したURLにアクセスする。
→ todo.jsp がないのでエラー - todo.jspを作成する。
- ToDoControllerで指定したURLにアクセスする。
→ todo.jsp の内容が表示されればOK - 「登録」ボタンを押す。→ POSTメソッドに未対応なのでエラー
- ToDoControllerにPOSTメソッドを受け付けるメソッドを追加してtodo.jspにリダイレクトする。
- 「登録」ボタンを押す。
→ todo.jspが表示されればOK - 日本語は文字化けするのでweb.xmlを変更して文字化け対策をする。
コントローラは、単純に todo.jsp を表示させるだけのシンプルなものを作成する。
ToDoController.java
package jp.abc; import java.util.List; 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 ToDoController { @RequestMapping(value = "/list", method = RequestMethod.GET) public String todo(Model model) { return "todo"; } }
JSPは、ToDo項目を入力するフィールドと登録ボタンを用意する。
<!DOCTYPE html> <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ 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>ToDoアプリ</title> </head> <body> <h1>ToDo項目</h1> <form method="post" action="input"> <input type="text" name="item"> <input type="submit" value="登録"> </form> </body> </html>
画面遷移ができるようになったら、エンティティとDAOを用意してToDo項目をデータベースに保存できるようにする。
エンティティ: ToDo
DAO: ToDoDao
DAO実装: ToDoDaoImpl
設定ファイルなどの準備作業を行う。
- pom.xml にデータベースアクセス関連の依存関係を追加する。
- database.properties ファイルを作成する。
- persistence.xmlファイルを作成する。
- application-config.xmlファイルを修正する。
pom.xml にデータベース関連の依存関係を追加する。
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.1</version> </dependency> <dependency> <groupId>org.hsqldb</groupId> <artifactId>hsqldb</artifactId> <version>2.3.4</version> </dependency> <dependency> <groupId>javax.transaction</groupId> <artifactId>jta</artifactId> <version>1.1</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>3.2.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>${spring-framework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>3.2.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring-framework.version}</version> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-jpa</artifactId> <version>1.3.4.RELEASE</version> </dependency> <dependency> <groupId>commons-dbcp</groupId> <artifactId>commons-dbcp</artifactId> <version>1.4</version> <exclusions> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> <exclusion> <groupId>xml-apis</groupId> <artifactId>xml-apis</artifactId> </exclusion> </exclusions> </dependency>
エンティティとDAOとDAO実装を作成して、コントローラからデータベースにアクセスする。
- ToDoエンティティを作成する。
- DAOとDAOの実装を作成する。
- ToDoControllerに、DAOを通してデータベースにアクセスするコードを追加する。
ToDoエンティティでは、ToDoの内容をitem、作成した日時 created、完了日 done のメンバーを持たせる。
ToDo.java
package jp.abc; import java.util.Date; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; @Entity public class ToDo { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column private long id; @Column private String item; @Column private Date created; @Column private Date done; public long getId() { return id; } public void setId(long id) { this.id = id; } public String getItem() { return item; } public void setItem(String item) { this.item = item; } public Date getCreated() { return created; } public void setCreated(Date created) { this.created = created; } public Date getDone() { return done; } public void setDone(Date done) { this.done = done; } }
DAOインタフェースを作成する。
ToDoDao.java
package jp.abc; import java.util.List; public interface ToDoDao<T> { public List<T> getAll(); public void add(T item); }
DAOの実装を作成する。
ToDoDaoImple.java
package jp.abc; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.EntityTransaction; import javax.persistence.Persistence; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Root; public class ToDoDaoImpl implements ToDoDao<ToDo> { private static EntityManagerFactory factory = Persistence.createEntityManagerFactory("persistenceUnit"); public List<ToDo> getAll() { EntityManager manager = factory.createEntityManager(); List<ToDo> list = null; CriteriaBuilder builder = manager.getCriteriaBuilder(); CriteriaQuery<ToDo> q = builder.createQuery(ToDo.class); Root<ToDo> r = q.from(ToDo.class); q.select(r); list = (List<ToDo>)manager.createQuery(q).getResultList(); manager.close(); return list; } public void add(ToDo item) { EntityManager manager = factory.createEntityManager(); EntityTransaction tx = manager.getTransaction(); tx.begin(); manager.persist(item); tx.commit(); manager.close(); } }
コントローラからデータベースにアクセスするコードを追加する。
ToDoController.java
package jp.abc; import java.util.Date; import java.util.List; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; @Controller public class ToDoController { @RequestMapping(value = "/list", method = RequestMethod.GET) public String todo(Model model) { ToDoDao<ToDo> dao = new ToDoDaoImpl(); List<ToDo> list = dao.getAll(); model.addAttribute("list", list); return "todo"; } @RequestMapping(value = "/input", method = RequestMethod.POST) public String add(@RequestParam(value = "item") String item, Model model) { ToDo todo = new ToDo(); ToDoDao<ToDo> dao = new ToDoDaoImpl(); todo.setItem(item); todo.setCreated(new Date()); dao.add(todo); return "redirect:/list"; } }
todo.jsp に、ToDo項目のリストを表示するコードを追加する。
<!DOCTYPE html> <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ 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>ToDoアプリ</title> </head> <body> <h1>ToDo項目</h1> <form method="post" action="input"> <input type="text" name="item"> <input type="submit" value="登録"> </form> <c:if test="${list != null}"> <form method="post" action="check"> <c:forEach var="t" items="${list}"> <input type="checkbox" name="item" value="${t.id}" />${t.item}<br /> </c:forEach> </form> </c:if> </body> </html>