こちらで示したWebアプリケーションをSpring Bootで作ってみましょう。
ではまず、STS (Spring Tool Suite)で新規プロジェクトを作成します。
メニューバーの「File」をクリックし、「New」→「Spring Starter Project」と進みます。
「Name」欄を Sample Entry とし、後はデフォルトのまま「Next」。
Dependencies では 「Web」のみ選択し「Finish」をクリックします。
pom.xmlを編集します。
画面のテンプレートとしてはThymeleaf、データベースとしてはHSQLDBを使用しているので、各々 <dependencies>タグ下に次のdependencyを追記します。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.hsqldb</groupId> <artifactId>hsqldb</artifactId> </dependency>
View部分の画面を作成します。src/main/resourcesフォルダにあるtemplatesフォルダを右クリックし、「New」→「File」へ進みます。
「File name」は index.html として「Finish」。
index.htmlは以下です。
<!DOCTYPE HTML> <html xmlns:th="http://www.thymeleaf.org"> <head> <title>top page</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <style> table { border-collapse: collapse; } table th { padding: 10px; border: solid 1px black; } table td { padding: 3px 10px; border: solid 1px black; } </style> </head> <body> <h1>sample entry page</h1> <table> <form method="post" action="/" th:object="${formModel}"> <tr> <td><label for="name">名前</label></td> <td><input type="text" name="name" th:value="*{name}" /></td> </tr> <tr> <td><label for="post">投稿内容</label></td> <td><input type="text" name="post" th:value="*{post}" /></td> </tr> <tr> <td><input type="submit" /></td> </tr> </form> </table> <br /> <table> <tr><th>名前</th><th>投稿内容</th></tr> <tr th:each="obj : ${postlist}"> <td th:text="${obj.name}"></td> <td th:text="${obj.post}"></td> </table> </body> </html>
次にEntityクラスを作成します。プロジェクトの src/main/java フォルダを右クリックし、「New」→「Class」。
「Name」は SampleEntryData とします。その他の部分はデフォルト。
SampleEntryData.java は以下。ID、 名前、投稿内容のみのシンプルな構造です。
IDはauto_incrementにしたいので、アノテーションにIDENTITYをセットしています。
package com.example.demo; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; @Entity @Table public class SampleEntryData { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) @Column private long id; @Column(length=50, nullable = false) private String name; @Column(length=2000, nullable = false) private String post; public long getId() { return id; } public void setId(long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPost() { return post; } public void setPost(String post) { this.post = post; } }
データアクセスを行うためのRepositoryインタフェース作成に移ります。com.example.demo パッケージを右クリックし、「New」→「Package」へと進みます。
「Name」欄に com.example.demo.repositories を入れて「Finish」。
今度は先ほど作成した com.example.demo.repositories を右クリックして、interface作成画面を表示させます。
「Name」に SampleDataRepository を入力して「Finish」。
SampleDataRepositoryはこちら。先ほど作成したSampleEntryDataクラスと紐付けられています。
package com.example.demo.repositories; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; import com.example.demo.SampleEntryData; @Repository public interface SampleDataRepository extends JpaRepository<SampleEntryData, Long>{ }
最後のJavaクラスであるコントローラーを作成します。src/main/java フォルダを右クリックしてClass作成画面へ進み、SampleEntryController クラスを作成します。
SampleEntryControllerクラス。画面を表示した際に。データベースに登録されたデータを全て取得します。
これが データアクセスの役割を担う SampleDataRepository の findAll メソッド一つで実現できてしまいます。
また、送信ボタンを押すと入力した内容をデータベースに書き込み、redirect で同じページを表示します。
データベースへの書き込みは、同じくSampleDataRepository の saveAndFlush メソッドのみです。
package com.example.demo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.transaction.annotation.Transactional; 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 com.example.demo.repositories.SampleDataRepository; @Controller public class SampleEntryController { @Autowired SampleDataRepository repository; @RequestMapping(value="/", method=RequestMethod.GET) public ModelAndView index(@ModelAttribute("formModel") SampleEntryData sedata, ModelAndView mav) { mav.setViewName("index"); Iterable<SampleEntryData> list = repository.findAll(); mav.addObject("postlist", list); return mav; } @RequestMapping(value="/", method=RequestMethod.POST) @Transactional(readOnly=false) public ModelAndView form(@ModelAttribute("formModel") SampleEntryData sedata, ModelAndView mav) { repository.saveAndFlush(sedata); return new ModelAndView("redirect:/"); } }
最後に、src/main/resources 以下の application.properties を開き、次の内容を記述します。
特に最終行の設定は、データを永続化させるのに必要です。これがないと、アプリケーションが終了するたびにテーブルがドロップされてしまう様です。
spring.datasource.url=jdbc:hsqldb:hsql://localhost/ spring.datasource.username=sa spring.jpa.hibernate.ddl-auto=update
アプリケーションを実行してみましょう。データベースを起動したあと、プロジェクトを右クリックして、「Run As」から「Spring Boot App」を実行。
無事起動したら、ブラウザで http://localhost:8080 へアクセスしてみましょう。こちらのページで示した画面が表示されるはずです。
またデータベースを確認すると、特にテーブルをCREATEしたわけでもないのに、必要なテーブルが自動で作成されていることがわかります。