2019.04.09
今回は、spring bootを使ってWEBアプリの作成をしたいと思います。 作るものは本の在庫管理システムです。メインの画面で本の検索をし、出力されたデータから詳細や注文、納品情報ページに移動できるものを目指します。
STSを使用しバージョンは3.9.2で、gradleでビルドをしています。
プロジェクト名はStockAppとします。
以下がプロジェクト作成時に自動的に作成されたファイルです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | plugins { id 'org.springframework.boot' version '2.1.4.RELEASE' id 'java' } apply plugin: 'io.spring.dependency-management' group = 'com.transonic.springboot' version = '0.0.1-SNAPSHOT' sourceCompatibility = '1.8' repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' testImplementation 'org.springframework.boot:spring-boot-starter-test' } |
ここのdependenciesの箇所に以下の4行をつけたし必要なライブラリを取り込むようにします。
1 2 3 4 5 | compile('org.springframework.boot:spring-boot-starter-thymeleaf') compile('org.springframework.boot:spring-boot-starter-data-jpa') compile('org.hsqldb:hsqldb') compile('com.h2database:h2') compile('org.springframework.boot:spring-boot-gradle-plugin') |
画面表示であるView部分を以下の通り作成します。
以下のようにエンティティを実装します。getterとsetterは省略してあります アノテーションの詳細については以下を参照ください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | package com.transonic.springboot; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; import javax.validation.constraints.Min; import javax.validation.constraints.Max; @Entity @Table(name="bookdata") public class BookData { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column private long id; @Column(length= 40, nullable = false) private String isbn; @Column(length=10, nullable=false) private String genre; @Column(length=20, nullable=false) private String author; @Column(length=20, nullable=false) private String title; @Column @Min(value=0) @Max(value=100) private int stock; private Boolean status; } |
まずは登録してあるレコードを全て表示するところから始めたいので、データベースアクセスのメソッドを何も作らずにリポジトリを作成します。
1 2 3 4 5 6 7 8 9 10 11 12 | package com.transonic.springboot.repositories; import com.transonic.springboot.BookData; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; import java.util.Optional; import org.springframework.beans.factory.annotation.Autowired; @Repository public interface BookDataRepository extends JpaRepository<BookData, Long>{ } |
コントローラーではGETリクエストがあった際に登録済みのデータべースを全表示するようにします。 また、ダミーデータを@PostConstructで初期値として登録されるようにしておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | package com.transonic.springboot; import com.transonic.springboot.repositories.BookDataRepository; 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 javax.annotation.PostConstruct; import java.util.Optional; @Controller public class StockController { @PostConstruct public void init() { BookData b1 = new BookData(); b1.setAuthor("夏目漱石"); b1.setTitle("ぼっちゃん"); b1.setGenre("文学"); b1.setIsbn("111111111"); b1.setStock(99); b1.setStatus(false); repository.saveAndFlush(b1); BookData b2 = new BookData(); b2.setAuthor("水島広子"); b2.setTitle("女子の関係"); b2.setGenre("エッセイ"); b2.setIsbn("222222222"); b2.setStock(99); b2.setStatus(false); repository.saveAndFlush(b2); BookData b3 = new BookData(); b3.setAuthor("村上春樹"); b3.setTitle("ノルウェイの森"); b3.setGenre("文学"); b3.setIsbn("333333333"); b3.setStock(99); b3.setStatus(false); repository.saveAndFlush(b3); } @Autowired BookDataRepository repository; @RequestMapping(name="/", method = RequestMethod.GET) public ModelAndView index(ModelAndView mav) { mav.setViewName("index"); Iterable list = repository.findAll(); mav.addObject("booklist",list); return mav; } } |
ここまできたらビルドして実行してみましょう。 以下のように表示されれば正常に動いているでしょう。 この時点ではPOSTリクエストによる処理をかいていないためフォームを入力し、検索するとエラーになります。 次回は、この検索部分の実装をしていきたいと思います。