SlideShare una empresa de Scribd logo
1 de 25
Descargar para leer sin conexión
基本編
アジェンダ
 はじめに
 階層構造
 Repositoryの実装
 Serviceの実装
 Controllerの実装
 まとめ
はじめに
 Spring Bootを使って、
実際に簡単なWebページを作成する。
階層構造
 下記の階層構造でシステムを構築する
Controller
ブラウザ
Service
Repository
Database
TemplateModel
Entity
Entity
Entity
Entity
Model1.入力値を受け取る
2.ビジネスロジックを書く
3.データの取得・更新をする 4.データを返す
5.データを返す
6.HTMLに変換
実際に下の階層から
実装してみる
Repositoryの実装
 Serviceから処理要求を受け取り、
Databaseに対してデータの取得・更新を行う
Service
Repository
Database
Entity Entity
3.データの取得・更新をする 4.データを返す
Repositoryの実装
 商品のデータ(productテーブル)を制御するRepositoryと
データの入れ物のEntityを作成
package sample.springbootweb.repository;
/** productテーブルのRepository */
public interface ProductRepository {
}
package sample.springbootweb.model;
/** productテーブルのEntity */
public class Product {
}
「repository」パッケージに
productテーブルの
Repositoryを作成
「model」パッケージに
productテーブルの
Entityを作成
Repositoryの実装
 ただのクラスをEntityに仕立てる
/** productテーブルのEntity */
@Entity
@Table(name="product")
public class Product {
/** 商品コード */
@Id
public Integer productCode;
/** 商品名 */
public String productName;
/** 価格 */
public Integer price;
}
クラス宣言に@Entityを付けて、
Entityであることを明記
「product」テーブルの
Entityであることを明記
それぞれのカラムに対応した
フィールドを宣言
フィールド宣言に「@Id」を付けて、
このフィールドがPKであることを明記
※便宜上、フィールドをpublic宣言している。
本来、フィールドはprivateであるべき。
Repositoryの実装
 Productテーブルとサンプルデータ
-- DDL
create table product (
product_code int(5),
product_name varchar(50),
price int(10),
primary key ( product_code )
);
--DML
insert into product values( 1, 'ガム', 100 );
insert into product values( 2, 'アメ', 120 );
insert into product values( 3, 'チョコ', 150 );
Repositoryの実装
 ただのクラスをRepositoryに仕立てる
/** productテーブルのRepository */
public interface ProductRepository
extends JpaRepository <Product, Integer> {
}
JpaRepositoryを拡張した
インターフェースであることを明記 「product」テーブルの
Repositoryであることを明記
PKはInteger(数値フィールド)
であることを明記
JpaRepositoryには基本的なデータベース操作は宣言されていて、
カスタマイズの必要がなければ特に中身のないインターフェース宣言で良い(そんなケースは稀な気が・・・)
Serviceの実装
 Controllerから処理要求を受け取り、
Repositoryに対してデータの取得・更新を行う
Controller
Service
Repository
Entity
Entity
Entity
Entity
2.ビジネスロジックを書く 5.データを返す
Serviceの実装
 商品関連のビジネスロジックを実行するServiceを作成
package sample.springbootweb.service.product;
/** 商品関連のビジネスロジックを実行するService */
public class ProductService {
}
「service」パッケージに
商品関連のパッケージ
「product」を作成
Serviceの実装
 ただのクラスをServiceに仕立てる
/** 商品関連のビジネスロジックを実行するService */
@Service
public class ProductService {
}
クラス宣言に@Serviceを付けて、
Serviceであることを明記
Serviceの実装
 Repositoryを呼び出す
/** 商品関連のビジネスロジックを実行するService */
@Service
public class ProductService {
@Autowired
ProductRepository productRepository;
/** 商品一覧を返す */
public List<Product> getProductList() {
List<Product> list = productRepository.findAll();
return list;
}
}
使用するRepositoryを宣言
Repositoryのメソッドを
呼び出してデータを取得
取得したデータを返却
Controllerの実装
 ブラウザからの入力値を受け取り、
Serviceへ処理要求を出し、
結果をテンプレートに渡してHTMLをレンダリングさせる
Controller
ブラウザ
Service
TemplateModel
Entity Entity
Model1.入力値を受け取る
6.HTMLに変換
Controllerの実装
 商品関連のページを制御するControllerを作成
package sample.springbootweb.app.product;
/** 商品関連のページを制御するController */
public class ProductController {
}
「app」パッケージに
商品関連のパッケージ
「product」を作成
Controllerの実装
 ただのクラスをControllerに仕立てる
/** 商品関連のページを制御するController */
@Controller
@RequestMapping("product")
public class ProductController {
}
クラス宣言に@Controllerを
付けて、Controllerであることを明記
URL「product」に対する
Controllerとして関連付ける
http://someserver/someapp/product/
Controllerの実装
 リクエストとメソッドを関連付ける
/** 商品関連のページを制御するController */
@Controller
@RequestMapping("product")
public class ProductController {
/** 商品一覧を表示する */
@RequestMapping(value = "/", method=RequestMethod.GET)
public String list() {
return "product/list“;
}
}
value値でURL「product」の
ルート(/) Controllerとして関連付ける
method値でHTTPメソッド「GET」に
関連付ける
テンプレート「product/list.html」を
表示する
Controllerの実装
 Serviceを呼び出す
/** 商品関連のページを制御するController */
@Controller
@RequestMapping("product")
public class ProductController {
@Autowired
private ProductService productService;
/** 商品一覧を表示する */
@RequestMapping(value = "/", method=RequestMethod.GET)
public String list() {
return "product/list";
}
}
使用するServiceを宣言
Controllerの実装
 Serviceを呼び出す
/** 商品関連のページを制御するController */
@Controller
@RequestMapping("product")
public class ProductController {
@Autowired
private ProductService productService;
/** 商品一覧を表示する */
@RequestMapping(value = "/", method=RequestMethod.GET)
public String list(Model model) {
List<Product> list = productService.getProductList();
model.addAttribute("productList", list);
return "product/list";
}
}
引数にModelを受け取る
(ControllerとTemplateの架け橋)
Serviceを呼び出す
Serviceの実行結果を
Modelに詰める
Controllerの実装
 TemplateのHTMLを記述する
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>商品一覧</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
商品一覧
</body>
</html>
テンプレートエンジン「Thymeleaf」で
使用するネームスペースの宣言
src¥main¥resources¥templates¥product¥list.html
Controllerの実装
 テンプレートを作成する
<body>
商品一覧
<table border="1">
<tr>
<th style="background-color:#CCCCCC">Code</th>
<th style="background-color:#CCCCCC">商品名</th>
<th style="background-color:#CCCCCC">金額</th>
</tr>
<tr>
<td>1</td>
<td>ダミー商品</td>
<td>50</td>
</tr>
</table>
</body>
素のHTMLで見た目の確認をする
HTMLをブラウザで開いて見た目の確認をする (デザイナーさんの仕事)
Controllerの実装
 テンプレートを作成する
HTMLをブラウザで開いてみる
Controllerの実装
 動的部分を作成する
<body>
商品一覧
<table border="1">
<tr>
<th style="background-color:#CCCCCC">Code</th>
<th style="background-color:#CCCCCC">商品名</th>
<th style="background-color:#CCCCCC">金額</th>
</tr>
<tr th:each="product: ${productList}">
<td th:text="${product.productCode}">1</td>
<td th:text="${product.productName}">ダミー商品</td>
<td th:text="${product.price}">50</td>
</tr>
</table>
</body>
Modelに詰めたproductListを取り出し、
for-eachでループさせる
Thymeleafで動的部分を実装する (エンジニアさんの仕事)
必要なEntityの要素を出力する
Controllerの実装
 実行する
Webサーバにアクセスする
http://localhost:8080/product/
まとめ
 各階層に応じた役割を意識し実装する
Repository → データベース操作
Service → ビジネスロジックの実装
Controller → 画面制御
 テンプレートはエンジニアは触らずデザイナーに任せる
 入力値チェック、セッション管理、トランザクション制御
・・・などなど、まだ触れていないことは色々

Más contenido relacionado

La actualidad más candente

La actualidad más candente (20)

AWSとオンプレミスを繋ぐときに知っておきたいルーティングの基礎知識(CCSI監修!)
AWSとオンプレミスを繋ぐときに知っておきたいルーティングの基礎知識(CCSI監修!)AWSとオンプレミスを繋ぐときに知っておきたいルーティングの基礎知識(CCSI監修!)
AWSとオンプレミスを繋ぐときに知っておきたいルーティングの基礎知識(CCSI監修!)
 
Zabbixを徹底活用してみよう ~4.2の最新情報もご紹介~
Zabbixを徹底活用してみよう ~4.2の最新情報もご紹介~Zabbixを徹底活用してみよう ~4.2の最新情報もご紹介~
Zabbixを徹底活用してみよう ~4.2の最新情報もご紹介~
 
Selenium WebDriver + python で E2Eテスト自動化
Selenium WebDriver + python で E2Eテスト自動化Selenium WebDriver + python で E2Eテスト自動化
Selenium WebDriver + python で E2Eテスト自動化
 
はじめてのSpring Boot
はじめてのSpring BootはじめてのSpring Boot
はじめてのSpring Boot
 
SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021
 
Docker Compose 徹底解説
Docker Compose 徹底解説Docker Compose 徹底解説
Docker Compose 徹底解説
 
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門
 
PHPで大規模ブラウザゲームを開発してわかったこと
PHPで大規模ブラウザゲームを開発してわかったことPHPで大規模ブラウザゲームを開発してわかったこと
PHPで大規模ブラウザゲームを開発してわかったこと
 
MySQLからPostgreSQLへのマイグレーションのハマリ所
MySQLからPostgreSQLへのマイグレーションのハマリ所MySQLからPostgreSQLへのマイグレーションのハマリ所
MySQLからPostgreSQLへのマイグレーションのハマリ所
 
RESTfulとは
RESTfulとはRESTfulとは
RESTfulとは
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
 
Where狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキーWhere狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキー
 
SaaS テナント毎のコストを把握するための「AWS Application Cost Profiler」のご紹介
SaaS テナント毎のコストを把握するための「AWS Application Cost Profiler」のご紹介SaaS テナント毎のコストを把握するための「AWS Application Cost Profiler」のご紹介
SaaS テナント毎のコストを把握するための「AWS Application Cost Profiler」のご紹介
 
Sonar qubeでちょっと楽しい静的解析
Sonar qubeでちょっと楽しい静的解析Sonar qubeでちょっと楽しい静的解析
Sonar qubeでちょっと楽しい静的解析
 
Web App for Containers + MySQLでコンテナ対応したPHPアプリを作ろう!
Web App for Containers + MySQLでコンテナ対応したPHPアプリを作ろう! Web App for Containers + MySQLでコンテナ対応したPHPアプリを作ろう!
Web App for Containers + MySQLでコンテナ対応したPHPアプリを作ろう!
 
MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法
 
こんなに使える!今どきのAPIドキュメンテーションツール
こんなに使える!今どきのAPIドキュメンテーションツールこんなに使える!今どきのAPIドキュメンテーションツール
こんなに使える!今どきのAPIドキュメンテーションツール
 
Swagger ではない OpenAPI Specification 3.0 による API サーバー開発
Swagger ではない OpenAPI Specification 3.0 による API サーバー開発Swagger ではない OpenAPI Specification 3.0 による API サーバー開発
Swagger ではない OpenAPI Specification 3.0 による API サーバー開発
 
ぱぱっと理解するSpring Cloudの基本
ぱぱっと理解するSpring Cloudの基本ぱぱっと理解するSpring Cloudの基本
ぱぱっと理解するSpring Cloudの基本
 
爆速クエリエンジン”Presto”を使いたくなる話
爆速クエリエンジン”Presto”を使いたくなる話爆速クエリエンジン”Presto”を使いたくなる話
爆速クエリエンジン”Presto”を使いたくなる話
 

Similar a Spring bootでweb 基本編

Ec cube開発合宿 プラグインセミナー
Ec cube開発合宿 プラグインセミナーEc cube開発合宿 プラグインセミナー
Ec cube開発合宿 プラグインセミナー
Ayumu Kawaguchi
 
XAML と C# を使った Windows ストアアプリ(LOB)構築のためのtips Prism 4.5 & Kona project 等のご紹介
XAML と C# を使った Windows ストアアプリ(LOB)構築のためのtips   Prism 4.5 & Kona project 等のご紹介XAML と C# を使った Windows ストアアプリ(LOB)構築のためのtips   Prism 4.5 & Kona project 等のご紹介
XAML と C# を使った Windows ストアアプリ(LOB)構築のためのtips Prism 4.5 & Kona project 等のご紹介
Shotaro Suzuki
 
20091030cakephphandson 01
20091030cakephphandson 0120091030cakephphandson 01
20091030cakephphandson 01
Yusuke Ando
 
Azure サポート エンジニア直伝 ~ PowerShell 実践活用術 ~
Azure サポート エンジニア直伝 ~ PowerShell 実践活用術 ~Azure サポート エンジニア直伝 ~ PowerShell 実践活用術 ~
Azure サポート エンジニア直伝 ~ PowerShell 実践活用術 ~
ShuheiUda
 
ASP.NET シングル ページ アプリケーション (SPA) 詳説
ASP.NET シングル ページ アプリケーション (SPA) 詳説ASP.NET シングル ページ アプリケーション (SPA) 詳説
ASP.NET シングル ページ アプリケーション (SPA) 詳説
Akira Inoue
 
Windows azuremobileservice入門
Windows azuremobileservice入門Windows azuremobileservice入門
Windows azuremobileservice入門
Makoto Nishimura
 
2011年2月9日第130回FxUG勉強会@東京第一打者空振り三振
2011年2月9日第130回FxUG勉強会@東京第一打者空振り三振2011年2月9日第130回FxUG勉強会@東京第一打者空振り三振
2011年2月9日第130回FxUG勉強会@東京第一打者空振り三振
Sadao Tokuyama
 

Similar a Spring bootでweb 基本編 (20)

20081003
2008100320081003
20081003
 
SpringBootによるDB更新
SpringBootによるDB更新SpringBootによるDB更新
SpringBootによるDB更新
 
20080524
2008052420080524
20080524
 
Ec cube開発合宿 プラグインセミナー
Ec cube開発合宿 プラグインセミナーEc cube開発合宿 プラグインセミナー
Ec cube開発合宿 プラグインセミナー
 
Entity Framework 6.1.3 + Windows フォーム サンプル アプリケーション構築 手順書
Entity Framework 6.1.3 + Windows フォームサンプル アプリケーション構築手順書Entity Framework 6.1.3 + Windows フォームサンプル アプリケーション構築手順書
Entity Framework 6.1.3 + Windows フォーム サンプル アプリケーション構築 手順書
 
G0042 h
G0042 hG0042 h
G0042 h
 
PowerShellを使用したWindows Serverの管理
PowerShellを使用したWindows Serverの管理PowerShellを使用したWindows Serverの管理
PowerShellを使用したWindows Serverの管理
 
XAML と C# を使った Windows ストアアプリ(LOB)構築のためのtips Prism 4.5 & Kona project 等のご紹介
XAML と C# を使った Windows ストアアプリ(LOB)構築のためのtips   Prism 4.5 & Kona project 等のご紹介XAML と C# を使った Windows ストアアプリ(LOB)構築のためのtips   Prism 4.5 & Kona project 等のご紹介
XAML と C# を使った Windows ストアアプリ(LOB)構築のためのtips Prism 4.5 & Kona project 等のご紹介
 
Entity Framework 5.0 deep dive
Entity Framework 5.0 deep diveEntity Framework 5.0 deep dive
Entity Framework 5.0 deep dive
 
20091030cakephphandson 01
20091030cakephphandson 0120091030cakephphandson 01
20091030cakephphandson 01
 
Azure サポート エンジニア直伝 ~ PowerShell 実践活用術 ~
Azure サポート エンジニア直伝 ~ PowerShell 実践活用術 ~Azure サポート エンジニア直伝 ~ PowerShell 実践活用術 ~
Azure サポート エンジニア直伝 ~ PowerShell 実践活用術 ~
 
Mvc conf session_4_ono
Mvc conf session_4_onoMvc conf session_4_ono
Mvc conf session_4_ono
 
20110607
2011060720110607
20110607
 
Data Factory V2 新機能徹底活用入門
Data Factory V2 新機能徹底活用入門Data Factory V2 新機能徹底活用入門
Data Factory V2 新機能徹底活用入門
 
sbc_rc_200_RealtimeCompute_handson_ver1.0
sbc_rc_200_RealtimeCompute_handson_ver1.0 sbc_rc_200_RealtimeCompute_handson_ver1.0
sbc_rc_200_RealtimeCompute_handson_ver1.0
 
構築手順 Ssis イベントログ取込み 第2版
構築手順 Ssis イベントログ取込み 第2版構築手順 Ssis イベントログ取込み 第2版
構築手順 Ssis イベントログ取込み 第2版
 
ASP.NET シングル ページ アプリケーション (SPA) 詳説
ASP.NET シングル ページ アプリケーション (SPA) 詳説ASP.NET シングル ページ アプリケーション (SPA) 詳説
ASP.NET シングル ページ アプリケーション (SPA) 詳説
 
Windows azuremobileservice入門
Windows azuremobileservice入門Windows azuremobileservice入門
Windows azuremobileservice入門
 
Let's build a simple app with .net 6 asp.net core web api, react, and elasti...
Let's build a simple app with  .net 6 asp.net core web api, react, and elasti...Let's build a simple app with  .net 6 asp.net core web api, react, and elasti...
Let's build a simple app with .net 6 asp.net core web api, react, and elasti...
 
2011年2月9日第130回FxUG勉強会@東京第一打者空振り三振
2011年2月9日第130回FxUG勉強会@東京第一打者空振り三振2011年2月9日第130回FxUG勉強会@東京第一打者空振り三振
2011年2月9日第130回FxUG勉強会@東京第一打者空振り三振
 

Más de なべ

Más de なべ (6)

Javaで学ぶネットワークプログラミングの基礎
Javaで学ぶネットワークプログラミングの基礎Javaで学ぶネットワークプログラミングの基礎
Javaで学ぶネットワークプログラミングの基礎
 
Reladomoを使ったトランザクション履歴管理をプロダクトに適用した際のメリット/デメリット/課題など
Reladomoを使ったトランザクション履歴管理をプロダクトに適用した際のメリット/デメリット/課題などReladomoを使ったトランザクション履歴管理をプロダクトに適用した際のメリット/デメリット/課題など
Reladomoを使ったトランザクション履歴管理をプロダクトに適用した際のメリット/デメリット/課題など
 
普通のJavaエンジニアが、なぜ技術書を出版するに至ったか?
普通のJavaエンジニアが、なぜ技術書を出版するに至ったか?普通のJavaエンジニアが、なぜ技術書を出版するに至ったか?
普通のJavaエンジニアが、なぜ技術書を出版するに至ったか?
 
Spring bootでweb バリデート編
Spring bootでweb バリデート編Spring bootでweb バリデート編
Spring bootでweb バリデート編
 
Spring bootでweb ユニットテスト編
Spring bootでweb ユニットテスト編Spring bootでweb ユニットテスト編
Spring bootでweb ユニットテスト編
 
Lombokのススメ
LombokのススメLombokのススメ
Lombokのススメ
 

Spring bootでweb 基本編