Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
図解で学ぶ Spring MVC / Architecture of Spring MVC
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
otty375
August 28, 2019
Technology
31k
13
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
図解で学ぶ Spring MVC / Architecture of Spring MVC
otty375
August 28, 2019
More Decks by otty375
See All by otty375
Spring Boot 2.3 の Liveness & Readiness Probes 対応 について調べてみた / Spring Boot 2.3 Liveness & Readiness Probes
otty375
2
1.1k
Spring & Spring Boot 基本のキ / Spring & Spring Boot for Beginner
otty375
4
1.9k
PlantUMLでさくさくモデリングライフ
otty375
0
340
Other Decks in Technology
See All in Technology
Cloudflare Workers 向けアプリを C# で構築する ~WASM Native AOT への道~
nenonaninu
1
1.7k
SREへの勘違いに気づいた後の話
tomodakengo
0
180
Apache Iceberg が拓く AI 時代のオープンレイクハウス
tomtanaka
0
120
セルフサービスのオブザーバビリティ基盤をOpenTelemetryで作る / Building a Self-Service Observability Platform with OpenTelemetry
ymotongpoo
3
400
Antigravity SDK for the Java Developer
glaforge
0
220
あけおめLINE 傾向とその対策
nasa9084
0
340
Oracle Base Database Service 技術詳細
oracle4engineer
PRO
16
120k
Argo CDとAtlantisで実現するインフラ管理のセルフサービス化──小規模SREチームで支えるプラットフォーム
cassius7
0
200
なぜ「決定性」が 決定的に重要なのか? Durable Execution 基盤の数理的理解 #serverlessjp / ServerlessDays Tokyo 2026
ytaka23
4
1.3k
サーバーレスをどこまで使う? WebRTC対戦ゲームで選んだVPSとの共存設計
kaidouji85
0
460
Amazon Bedrock Agents ClassicからAmazon Bedrock AgentCoreへ移行した際、ガードレール設定が2箇所に割れた話
matsunobu
0
130
AWS FinOps Agent 結局何が得意なの?
siromi
0
210
Featured
See All Featured
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
390
The Limits of Empathy - UXLibs8
cassininazir
1
690
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
56k
Discover your Explorer Soul
emna__ayadi
2
1.3k
Paper Plane
katiecoart
PRO
4
53k
The Mindset for Success: Future Career Progression
greggifford
PRO
0
520
The Curse of the Amulet
leimatthew05
3
15k
Building Flexible Design Systems
yeseniaperezcruz
330
41k
Music & Morning Musume
bryan
48
7.4k
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
350
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
540
Transcript
ਤղͰֶͿ Spring MVC 2019/08/28 JSUGษڧձ 2019ͦͷ8 Spring for Beginner #jsug
͍͚ @otty_375
ࣗݾհ • ͍͚ʢ@otty_375ʣ • ITاۀͰWebγεςϜ։ൃӡ༻ • Springྺ2΄Ͳ
ࠓͷΰʔϧ • Spring MVC ͷΞʔΩςΫνϟ͕ΠϝʔδͰ͖Δ • Spring MVC ͷجຊతͳ࣮ํ๏͕ཧղͰ͖Δ
ʘࠓޙSpring MVC Λֶश͢Δ্ͰͷʹͳΕʗ
ΞδΣϯμ 1. Spring MVC ͱ 2. Spring MVC ͷΞʔΩςΫνϟ 3.
Spring MVC ͷجຊతͳ࣮ํ๏ 4. Spring MVC ͷͦͷଞͷػೳ 5. ·ͱΊ
Spring MVC ͱ
Spring MVC ͱ • WebΞϓϦέʔγϣϯΛ։ൃ͢Δࡍʹར༻͢Δ ϑϨʔϜϫʔΫ • ϑϩϯτίϯτϩʔϥύλʔϯΛ࠾༻ • ϦΫΤετϚοϐϯάͳͲΛΞϊςʔγϣϯΛ
ར༻ͯ͠ઃఆͰ͖Δ
ϑϩϯτίϯτϩʔϥύλʔϯ • શͯͷϦΫΤετͷΤϯτϦʔϙΠϯτͱͯ͠ ϑϩϯτίϯτϩʔϥΛ༻͢Δ • దͳׂͷΦϒδΣΫτʹॲཧΛҕৡ͢Δ • ϝϦοτɿϦΫΤετʹؔ͢Δॲཧͷڞ௨Խ
Spring MVC ͷ ΞʔΩςΫνϟ
ॲཧͷྲྀΕ ҎԼͷαϯϓϧΞϓϦΛྫʹઆ໌͠·͢ • ϦΫΤετɿ/greet [GET] • Ϩεϙϯεɿgreet.html • ࣌ؒଳʹΑͬͯҟͳΔݴ༿Λฦ͢
Spring MVC ͷΞʔΩςΫνϟ %JTQBUDIFS 4FSWMFU )BOEMFS.BQQJOH ᶃ ᶄ ᶅ ᶆ
ᶇ ᶈ ᶉ ᶊ ᶋ ։ൃऀ͕࣮͢Δ෦ Spring MVC ෦ ᶌ ᶎ ᶍ )BOEMFS"EBQUFS 7JFX3FTPMWFS 7JFX )BOEMFS IUNMFUD
ॲཧͷྲྀΕ ͦͷ̍ %JTQBUDIFS 4FSWMFU )BOEMFS.BQQJOH ᶄ ᶅ ᶆ ᶇ ᶈ
ᶉ ᶊ ᶋ ᶌ ᶎ ᶍ )BOEMFS"EBQUFS 7JFX3FTPMWFS 7JFX )BOEMFS IUNMFUD ᶃ
DispatcherServlet • શͯͷϦΫΤετͷΤϯτϦʔϙΠϯτͱͳΔ αʔϒϨοτΫϥε • ༷ʑͳׂͷΠϯλʔϑΣʔεΛݺͼग़ͯ͠ ϑϨʔϜϫʔΫશମΛ੍ޚ͍ͯ͠Δ
ॲཧͷྲྀΕ ͦͷ̍ %JTQBUDIFS 4FSWMFU )BOEMFS.BQQJOH ᶄ ᶅ ᶆ ᶇ ᶈ
ᶉ ᶊ ᶋ ᶌ ᶎ ᶍ )BOEMFS"EBQUFS 7JFX3FTPMWFS 7JFX )BOEMFS IUNMFUD ᶃ ΫϥΠΞϯτ ʮHSFFUΛऔಘ͍ͨ͠Ͱ͢ʯ %JTQBUDIFS4FSWMFU ʮྃղͰ͢ʯ
ॲཧͷྲྀΕ ͦͷ̎ %JTQBUDIFS 4FSWMFU )BOEMFS.BQQJOH ᶄ ᶅ ᶆ ᶇ ᶈ
ᶉ ᶊ ᶋ ᶌ )BOEMFS"EBQUFS 7JFX3FTPMWFS 7JFX )BOEMFS IUNMFUD ᶃ ᶍ ᶎ
HandlerMapping • ༻͢ΔHandlerΛಛఆ͢Δׂͷ ΠϯλʔϑΣʔε • ύεHTTPϝιουͳͲΛݩʹɹɹ ͲͷHandlerΛݺͼग़͔͢ಛఆ͢Δ
Handler • ϦΫΤετʹର͢Δ۩ମతͳॲཧΛߦ͏ׂ • ։ൃऀ͕࣮͢Δ෦ • ϦΫΤετύεHTTPϝιουͳͲͷɹɹɹ ϚοϐϯάઃఆΛߦ͏
ॲཧͷྲྀΕ ͦͷ̎ %JTQBUDIFS 4FSWMFU )BOEMFS.BQQJOH ᶄ ᶅ ᶆ ᶇ ᶈ
ᶉ ᶊ ᶋ ᶌ )BOEMFS"EBQUFS 7JFX3FTPMWFS 7JFX )BOEMFS IUNMFUD ᶃ ᶍ ᶎ )BOEMFS.BQQJOH ʮ(SFFU$POUSPMMFSͷHSFFUϝιουͰ͢ʯ Ͳͷ)BOEMFS͔ʁ ύε )551ϝιου ύϥϝʔλ )FMMP$POUSPMMFS ͷIFMMPϝιου IFMMP (&5 ͳ͠ (SFFU$POUSPMMFS ͷHSFFUϝιου HSFFU (&5 ͳ͠ ʜ ʜ ʜ ʜ %JTQBUDIFS4FSWMFU ʮHSFFUͷ(&5ϝιουͷ)BOEMFSΛ ڭ͍͑ͯͩ͘͞ʯ
ॲཧͷྲྀΕ ͦͷ̏ %JTQBUDIFS 4FSWMFU )BOEMFS.BQQJOH ᶄ ᶅ ᶆ ᶇ ᶈ
ᶉ ᶊ ᶋ ᶌ )BOEMFS"EBQUFS 7JFX3FTPMWFS 7JFX )BOEMFS IUNMFUD ᶃ ᶍ ᶎ
HandlerAdapter • HandlerΛݺͼग़ׂ͢ͷΠϯλʔϑΣʔε • ݺͼग़͠લޙʹదٓඞཁͳॲཧΛߦ͏ • ϦΫΤετϘσΟΛJavaΦϒδΣΫτʹม • Bean Validation
ͳͲ
Handler • ϦΫΤετʹର͢Δ۩ମతͳॲཧΛߦ͏ׂ • ViewΛ༻͢Δ߹ɺΓViewͷ໊લΛ ฦ͠ը໘ͷදࣔʹඞཁͳσʔλModelͷதʹ ٧Ίͯฦ͢
Model • Handler͔ΒViewςϯϓϨʔτʹΛड͚͢ ͨΊʹར༻͞ΕΔΠϯλʔϑΣʔε • ModelͷதͷใView͕ݟΕΔҐஔʹஔ͔Ε ViewͷΈཱͯʹΘΕΔ
ॲཧͷྲྀΕ ͦͷ̏ %JTQBUDIFS 4FSWMFU )BOEMFS.BQQJOH ᶄ ᶅ ᶆ ᶇ ᶈ
ᶉ ᶊ ᶋ ᶌ )BOEMFS"EBQUFS 7JFX3FTPMWFS 7JFX )BOEMFS IUNMFUD ᶃ )BOEMFS"EBQUFS ʮඞཁͳલॲཧ͓͍ͯͨ͠ͷͰ ॲཧΑΖ͓͘͠ئ͍͠·͢ʯ ᶍ ᶎ ᶆ %JTQBUDIFS4FSWMFU ʮ(SFFU$POUSPMMFSͷHSFFUϝιουͷ ݺͼग़͠Λ͓ئ͍͠·͢ʯ
ॲཧͷྲྀΕ ͦͷ̏ %JTQBUDIFS 4FSWMFU )BOEMFS.BQQJOH ᶄ ᶅ ᶆ ᶇ ᶈ
ᶉ ᶊ ᶋ ᶌ )BOEMFS"EBQUFS 7JFX3FTPMWFS 7JFX )BOEMFS IUNMFUD ᶃ )BOEMFS ʮॲཧऴΘΓ·ͨ͠ 7JFXͷ໊લHSFFUͰ͢ ඞཁͳσʔλ.PEFMʹ٧Ί͓͖ͯ·ͨ͠ʯ ᶍ ᶎ .PEFM message = "hello" ᶉ )BOEMFS"EBQUFS ʮඞཁͳޙॲཧ͓͖ͯ͠·ͨ͠ 7JFXͷ໊લHSFFUͰ͢ʯ .PEFM
ॲཧͷྲྀΕ ͦͷ̐ %JTQBUDIFS 4FSWMFU )BOEMFS.BQQJOH ᶄ ᶅ ᶆ ᶇ ᶈ
ᶉ ᶊ ᶋ ᶌ )BOEMFS"EBQUFS 7JFX3FTPMWFS 7JFX )BOEMFS IUNMFUD ᶃ ᶍ ᶎ
ViewResolver • Handler͔Βฦ٫͞ΕͨView໊ΛݩʹɺView ͷ࣮ΫϥεΛಛఆ͠ViewͷશύεΛฦ͢ ׂ
ॲཧͷྲྀΕ ͦͷ̐ %JTQBUDIFS 4FSWMFU )BOEMFS.BQQJOH ᶄ ᶅ ᶆ ᶇ ᶈ
ᶉ ᶊ ᶋ ᶌ )BOEMFS"EBQUFS 7JFX3FTPMWFS 7JFX )BOEMFS IUNMFUD ᶃ ᶍ 7JFX3FTPMWFS ʮUFNQMBUFTHSFFUIUNMͰ͢ʯ ᶎ ᶊ %JTQBUDIFS4FSWMFU ʮ7JFX໊͕HSFFUͳͷͰ͕͢ ۩ମతͳύεΛڭ͍͑ͯͩ͘͞ʯ
ॲཧͷྲྀΕ ͦͷ̑ %JTQBUDIFS 4FSWMFU )BOEMFS.BQQJOH ᶄ ᶅ ᶆ ᶇ ᶈ
ᶉ ᶊ ᶋ ᶌ )BOEMFS"EBQUFS 7JFX3FTPMWFS 7JFX )BOEMFS IUNMFUD ᶃ ᶎ ᶍ
View • ϨεϙϯεσʔλͷੜΛߦ͏ׂ • ModelͷதͷσʔλΛࢀরͯ͠ςϯϓϨʔτ ʹຒΊࠐΉ
ॲཧͷྲྀΕ ͦͷ̑ %JTQBUDIFS 4FSWMFU )BOEMFS.BQQJOH ᶄ ᶅ ᶆ ᶇ ᶈ
ᶉ ᶊ ᶋ ᶌ )BOEMFS"EBQUFS 7JFX3FTPMWFS 7JFX )BOEMFS IUNMFUD ᶃ 7JFX ʮ.PEFMͷσʔλͱUFNQMBUFTHSFFUIUNM ΛͬͯϨεϙϯεΛੜ͠·͢ʯ ᶎ ᶍ .PEFM message = "hello" <p th:text=“${message}"></p> ᶌ %JTQBUDIFS4FSWMFU ʮϨεϙϯεͷੜΛ ͓ئ͍͠·͢ʯ
ॲཧͷྲྀΕ ͦͷ̑ %JTQBUDIFS 4FSWMFU )BOEMFS.BQQJOH ᶄ ᶅ ᶆ ᶇ ᶈ
ᶉ ᶊ ᶋ ᶌ )BOEMFS"EBQUFS 7JFX3FTPMWFS 7JFX )BOEMFS IUNMFUD ᶃ %JTQBUDIFS4FSWMFU ʮϨεϙϯεͱͯ͠HSFFUIUNMΛฦ͠·͢ʯ ᶎ ᶍ 7JFX ʮϨεϙϯε͕͠·ͨ͠ʯ ᶍ <p>hello</p>
Spring MVC ͷ جຊతͳ࣮ํ๏
جຊతͳ࣮ํ๏ Spring BootΛ༻͢Δ߹Λྫʹ͠·͢ 1. Spring MVCͷґଘՃ 2. Controller࣮ 3. View࣮
• Mavenͷ߹ɿpom.xmlͷdependenciesʹՃ 1. Spring MVC ͷґଘՃ <dependencies> <dependency>
<groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!— ͦͷଞඞཁͳґଘΛهࡌɻࠓճςϯϓϨʔτΤϯδϯʹThymeleafΛ༻ --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> </dependencies>
2. Controller࣮ package com.example.demo.controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping; @Controller public class GreetController { @GetMapping("/greet") public String greet(Model model) { String message = getGreetMessage(); model.addAttribute("message", message); return "greet"; } } GreetController.java
2. Controller࣮ ͦͷ̍ package com.example.demo.controller; import org.springframework.stereotype.Controller; import
org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; @Controller public class GreetController { @GetMapping("/greet") public String greet(Model model) { String message = getGreetMessage(); model.addAttribute("message", message); return "greet"; } } GreetController.java #FBOొ͢ΔͨΊʹ Ϋϥεʹ!$POUSPMMFSΛ༩͢Δ
2. Controller࣮ ͦͷ̎ package com.example.demo.controller; import org.springframework.stereotype.Controller; import
org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; @Controller public class GreetController { @GetMapping("/greet") public String greet(Model model) { String message = getGreetMessage(); model.addAttribute("message", message); return "greet"; } } GreetController.java ϦΫΤετͱͷϚοϐϯάઃఆΛ ϝιουʹ༩͢Δ ଞʹ!1PTU.BQQJOH !1VU.BQQJOHͳͲ
2. Controller࣮ ͦͷ̐ package com.example.demo.controller; import org.springframework.stereotype.Controller; import
org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; @Controller public class GreetController { @GetMapping("/greet") public String greet(Model model) { String message = getGreetMessage(); model.addAttribute("message", message); return "greet"; } } GreetController.java 7JFXͰ༻͢ΔσʔλΛηοτ͢ΔͨΊͷ .PEFMΛҾͰड͚औΔ
2. Controller࣮ ͦͷ̏ package com.example.demo.controller; import org.springframework.stereotype.Controller; import
org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; @Controller public class GreetController { @GetMapping("/greet") public String greet(Model model) { String message = getGreetMessage(); model.addAttribute("message", message); return "greet"; } } GreetController.java ඞཁͳϏδωεϩδοΫΛ࣮ ʢ͜͜Ͱݱࡏ࣌ࠁʹԠͯ͡ҟͳΔϝοηʔδΛ ฦ͢Α͏ͳϝιουʣ
2. Controller࣮ ͦͷ̐ package com.example.demo.controller; import org.springframework.stereotype.Controller; import
org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; @Controller public class GreetController { @GetMapping("/greet") public String greet(Model model) { String message = getGreetMessage(); model.addAttribute("message", message); return "greet"; } } GreetController.java 7JFXͰ༻͢ΔσʔλΛ.PEFMʹηοτ͢Δ ʢ͜͜ͰNFTTBHFͱ͍͏໊લͰΛηο τʣ
2. Controller࣮ ͦͷ̑ package com.example.demo.controller; import org.springframework.stereotype.Controller; import
org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; @Controller public class GreetController { @GetMapping("/greet") public String greet(Model model) { String message = getGreetMessage(); model.addAttribute("message", message); return "greet"; } } GreetController.java 7JFX໊Λฦ͢
3. View࣮ <!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta
charset="UTF-8" /> <title>Greet</title> </head> <body> <p th:text="${message}"></p> </body> </html> greet.html ʢςϯϓϨʔτΤϯδϯɿThymeleafʣ
3. View࣮ <!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta
charset="UTF-8" /> <title>Greet</title> </head> <body> <p th:text="${message}"></p> </body> </html> greet.html ʢςϯϓϨʔτΤϯδϯɿThymeleafʣ )BOEMFSͰฦ٫͞ΕΔ7JFX໊ʹରԠ͢ΔϑΝΠϧΛ ࡞
3. View࣮ <!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta
charset="UTF-8" /> <title>Greet</title> </head> <body> <p th:text="${message}"></p> </body> </html> greet.html .PEFMʹηοτ͞ΕΔΛຒΊࠐΉهࡌ ʢ͜ͷ߹ల։͞ΕΔͱ QIFMMPQͷΑ͏ʹͳΔʣ ʢςϯϓϨʔτΤϯδϯɿThymeleafʣ
ิɿඞཁͳConfiguration • ࠓճSpring BootͷAutoConfigurationػೳʹ ΑΓɺඞཁͳConfigurationͳͲSpring Boot ͕༻ҙ͍ͯ͠ΔσϑΥϧτͷͷΛ༻͢Δ͜ ͱͱ͠·͢
ิɿSpring Initializr • Spring Boot ϓϩδΣΫτͷܗΛੜͰ͖Δ • ࠷ॳ͔ΒDependenciesʹՃ͢Δ͜ͱ͕Մೳ • https://start.spring.io/
•
ิɿRestController • REST APIͷ߹@RestControllerΛ༻ • ϝιουͷΓView໊Ͱͳ͘ɹɹɹ JavaΦϒδΣΫτͳͲͷϨεϙϯεϘσΟ • JavaΦϒδΣΫτ <->
JSON ͷม HandlerAdapterͷ෦ͰߦΘΕΔ
Spring MVC ͷ ͦͷଞͷػೳ
Spring MVC ͷͦͷଞͷػೳ • ҎԼͷΑ͏ͳجຊతͳػೳ͋Γ·͢ • όϦσʔγϣϯ • ྫ֎ϋϯυϥ •
RESTΫϥΠΞϯτʢRestTemplateʣ • ςετʢMockMvcʣ ͳͲ
Spring MVC ͷͦͷଞͷػೳ • ҎԼͷΑ͏ͳԠ༻తͳػೳ͋Γ·͢ • ηογϣϯͰͷσʔλཧ • ඇಉظॲཧ •
ࠃࡍԽɹͳͲ
·ͱΊ
Spring MVC ·ͱΊ • WebΞϓϦέʔγϣϯΛ։ൃ͢Δࡍʹར༻͢Δ ϑϨʔϜϫʔΫ • DispatcherServlet͕શϦΫΤετͷΤϯτϦʔ ϙΠϯτͰϑϨʔϜϫʔΫશମΛ੍ޚ͍ͯ͠Δ •
ϦΫΤετϚοϐϯάͳͲΛΞϊςʔγϣϯΛ ར༻ͯ͠ઃఆͰ͖Δ
Spring MVC ͷΞʔΩςΫνϟ %JTQBUDIFS 4FSWMFU )BOEMFS.BQQJOH ᶃ ᶄ ᶅ ᶆ
ᶇ ᶈ ᶉ ᶊ ᶋ ։ൃऀ͕࣮͢Δ෦ Spring MVC෦ ᶌ ᶎ ᶍ )BOEMFS"EBQUFS 7JFX3FTPMWFS 7JFX )BOEMFS IUNMFUD
ࢀߟࢿྉ
ࢀߟࢿྉʢॻ੶ʣ • SpringపఈೖʢגࣜձࣾNTTσʔλ / ஶʣ
ࢀߟࢿྉʢWebʣ • Spring ެࣜαΠτ • https://spring.io/ • ॳΊͯͰ30Ͱ͔ΔSpring 5 &
Spring Boot 2Φʔ όʔϏϡʔ • https://www.slideshare.net/ masatoshitada7/30spring-5-spring- boot-2-103523666
EOP