SlideShare a Scribd company logo
1 of 70
Download to read offline
JSP/JSF から
Spring Web +
Thymeleaf への移⾏
初⼼者向け
JSP (+Struts) など古いタイプの動的Webページ サーバレンダリング開発から、
最新系 Web 開発環境の Spring Web + Thymeleaf によるレンダリングへ
の移⾏に関⼼がある⽅向け。
ひとたび Spring Boot + Spring Web + Thymeleaf に乗り換えてしまえば、
幸せな開発環境が⼿に⼊ります。
前提知識︓Java、HTMLを多少は知っていること。
16:15-17:00 Room B
Spring Fest 2019 #jsug
2019/12/18
まえおき
本⽇の発表は、発表者である 伊賀敏樹 が休暇を取得のうえ実施しています。
内容や⾒解は、私 伊賀敏樹 個⼈のものであり、Wipro および Appirio は当個⼈的⾒
解に⼀切責任を持ちません。
発表者について (1/2)
伊賀 敏樹 (いがぴょん) 古くからの Java エンジニア
2003年
於: いがぴょんの⽇記v2
2018年
於: オーケストラ本番直前
15年後
=>
発表者について (2/2)
本業では アピリオ という会社で Heroku + Spring Boot + Thymeleaf を使って
⼤規模エンタープライズシステム開発してます
最近の(強制)マイブームは Classic ASP + VB6
字句解析器や構⽂解析器と戯れています
NEKOGET スライド⽀援サービス (仮称)
本スライドは NEKOGETさんによる有償のスライド⽀援
サービスを受けています。
猫イラストなどは NEKOGET さんの著作物であり、この
発表に限定して有償で NEKOGET さんから使⽤を許
諾されたものです。
猫イラストによる⽀援を受けたい⽅は、NEKOGETさん
に連絡してくださいね。
はじめに
このセッションで知って欲しいこと
● Thymeleaf を知るためのヒントと道筋を理解する
○ Webサイトの読み解き⽅を知り、セッションの後にも⾃⼒で調べられるように
● Thymeleaf を採⽤する利点
○ 後発 OSS テンプレートエンジンとしての優秀さ
○ 動的Webページ サーバレンダリングでのテンプレート⽅式の優位性
○ 共通化・再利⽤を強⼒に⽀援する各種機能
● セッションの前提知識 : Java、HTMLを多少は知っていること
Thymeleaf って なあに
Thymeleaf って なあに (1/5)
● 汎⽤テンプレートエンジン
● ⽇本語としては「タイムリーフ」と記載・発⾳
● 現代的な設計のテンプレートエンジン
● OSS で開発・提供される
● 過去の様々な Java 向けの OSS テンプレートエンジンのどれよりも、
Thymeleaf が優れている (個⼈の感想です)
● Spring で 動的Webページ サーバレンダリングをおこなうなら、⼤抵の開発では
Thymeleaf の選択をおすすめしたい
● Thymeleaf はソースコードがとても綺麗です
Thymeleaf って なあに (2/5)
● 汎⽤テンプレートエンジン
○ テンプレート(定型フォーマット)の内容の⼀部を書き換えることができる仕組み
テンプレート
エンジン処理
連想される、ありがちな例:
- メールの定型⽂の内容の⼀部を書き換え
- HTML の内容の⼀部を書き換え
テキストファイル
(テンプレート)
テキストファイル
Thymeleaf って なあに (3/5)
● 動的Webページ Java テンプレートエンジン
○ Standard dialect を利⽤することにより HTML ⽤のタグ処理機能が利⽤可能
○ Thymeleaf - Spring 連携パッケージを利⽤することで Spring との連携が可能
テンプレート
エンジン処理
HTML ファイル
(テンプレート)
HTML ファイル
Thymeleaf って なあに (4/5)
HTML ファイル
(テンプレート)
w/Standard dialect
テンプレート処理
Thymeleaf
w/Thymeleaf - Spring 連携
on/Spring Web
Web
Browser
Java
プログラム
HTML
HTTP(S) HTTP(S)
Thymeleaf って なあに (5/5)
● Thymeleaf 公式 (⽇本語訳) は以下
○ https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf_ja.html#%E3%83%80%E3%82%A4%E3%82%A2
%E3%83%AC%E3%82%AF%E3%83%88%E3%82%B9%E3%82%BF%E3%83%B3%E3%83%80%E3%83%BC
%E3%83%89%E3%83%80%E3%82%A4%E3%82%A2%E3%83%AC%E3%82%AF%E3%83%88
○ このサイトをよく閲覧
● ほとんどのThymeleafの記載は「スタンダードダイアレクト(standard dialect)」の説明
● HTML5 に対応
動的Webページ
サーバレンダリング
動的Webページ サーバレンダリングの種類
Java Servlet
JavaServer
Pages
JavaServer
Faces
Thymeleaf
愛称 Servlet JSP JSF Thymeleaf
JSR JSR-369 JSR-245 JSR-372 N/A
Java EE 8 ◯ ◯ ◯ ×
記法 Java でコーディング
<%
jsp:
独⾃タグ形式
<h:outputText
jsfc属性形式
<span
jsfc="h:outputText“
#{bean.name}
<div th:text="${message}"
<div>[[${message}]]
特徴
テンプレートなしで
⾃⼒で頑張る
Classic ASP 似
jsfc属性形式は
Thymeleaf 似
妥当な HTML
+ 独⾃属性
Thymeleaf を選択する動機
● Spring Boot による最新系技術を利⽤したい
● Spring との⾼い親和性
● テンプレートファイルが妥当な HTML となるため⾒通しが良い
● デフォルトの挙動がセキュア
● カスタムタグの開発しやすさ
WebLogic / WebSphere / Tomcat / Jboss / GlassFish
的なものを
Spring Boot + Spring Web + Thymeleaf 化
Thymeleaf を選択する動機 : JSP vs Thyemeleaf
● https://www.thymeleaf.org/doc/articles/thvsjsp.html
Thymeleaf なら…
● サーバ上で動作させないでもクライアントのWebブラウザでのレンダリングが可能
○ デザイナーとの分業が可能?
● Thymeleaf のテンプレート⽅式が現代的で有利
● ⾃然なセキュアさについて Thymeleaf のほうが有利
● Fragment 、カスタムタグライブラリの作り勝⼿にて断然有利
動的Webページ サーバレンダリング以外 (参考)
● クライアントサイド Web レンダリング
● スマホ・タブレットアプリ
● サーバ間通信
● API
● etc…
⼤抵の場合は、REST/JSON や SOAP をもちいて
HTTP(S) アクセスを提供
そもそも 動的Webページ サーバレンダリングはレガシー⽅式(!?)…
マイブームは Vue.js / React で SPA
使ってみよう Thymeleaf
Thymeleaf を使ってみよう (普通は コレジャナイ)
● https://www.thymeleaf.org/download.html
●だがしかし、⼤抵の⼈はここからはダウンロード操作しない
●「Java SE 6 以降」って書いてある!
Thymeleaf を使ってみよう w/Spring Boot
● https://start.spring.io/
みんな⼤好き Spring Initializr
Maven / Java / 2.2.2
/ Web + Thymeleaf
Eclipseだと(1/5)
●みんな⼤好き Eclipse
●File -> Import...
●Eclipse IDE
for Java Developers
が私のお気に⼊り
Eclipseだと(2/5)
●Eclipse Initializr の
出⼒を選択
Eclipseだと(3/5)
●main のアプリケーションクラスを選択
●Run As で実⾏
mvn spring-boot:runmvn の代替記法でも可
Eclipseだと(4/5)
index.html
<!doctype html>
<html lang="ja" xmlns:th="http://www.thymeleaf.org">
<head>
<title>Hello World!</title>
<meta charset="utf-8">
</head>
<body>
<h1>Hello World.</h1>
<p th:text="${'Hello World!'}"/>
</body>
</html>
●ファイル作成して Spring Bootを再起動
Eclipseだと(5/5)
●http://localhost:8080/
●コントローラは使っていないけれど
Thymeleaf のテンプレート処理は動作している
Thymeleaf の凄いところ
テンプレートレイアウト機能による共通化
• th:fragment
• th:insert
• th:replace
画⾯共通化・標準化が助けられる
画⾯の⼀部共通化などに
⼤変役⽴つ
カスタムダイアレクト作成による共通化・再利⽤
中級者以上向け (シンプルなカスタムダイアレクトの作成向き)
l AbstractAttributeTagProcessor
l AbstractElementTagProcessor
上級者向け (⾼度ななカスタムダイアレクトの作成向き)
l AbstractElementModelProcessor
とてもパワフル
サンプル少ない...
難易度⾼い
https://www.thymeleaf.org/doc/tutorials/3.0/extendingthymeleaf.html#creating-our-own-dialect
Thymeleaf のレンダリング処理に、⾃作のダイアレクトを追加できる仕組み
JSP に対して圧倒的に優位なカスタムダイアレクト作成による共通化・再利⽤の効果
ここが気になる
Thymeleaf
Thymeleaf 依存関係を知りたくなったら : 依存関係表⽰
● [INFO] --- maven-dependency-plugin:3.1.1:tree (default-cli) @ demo ---
● [INFO] com.igapyon:demo:jar:0.0.1-SNAPSHOT
● [INFO] +- org.springframework.boot:spring-boot-starter-thymeleaf:jar:2.2.2.RELEASE:compile
● [INFO] | +- org.springframework.boot:spring-boot-starter:jar:2.2.2.RELEASE:compile
● [INFO] | | +- org.springframework.boot:spring-boot:jar:2.2.2.RELEASE:compile
● [INFO] | | +- org.springframework.boot:spring-boot-autoconfigure:jar:2.2.2.RELEASE:compile
● [INFO] | | +- org.springframework.boot:spring-boot-starter-logging:jar:2.2.2.RELEASE:compile
● [INFO] | | | +- ch.qos.logback:logback-classic:jar:1.2.3:compile
● [INFO] | | | | ¥- ch.qos.logback:logback-core:jar:1.2.3:compile
● [INFO] | | | +- org.apache.logging.log4j:log4j-to-slf4j:jar:2.12.1:compile
● [INFO] | | | | ¥- org.apache.logging.log4j:log4j-api:jar:2.12.1:compile
● [INFO] | | | ¥- org.slf4j:jul-to-slf4j:jar:1.7.29:compile
● [INFO] | | +- jakarta.annotation:jakarta.annotation-api:jar:1.3.5:compile
● [INFO] | | ¥- org.yaml:snakeyaml:jar:1.25:runtime
● [INFO] | +- org.thymeleaf:thymeleaf-spring5:jar:3.0.11.RELEASE:compile
● [INFO] | | +- org.thymeleaf:thymeleaf:jar:3.0.11.RELEASE:compile
mvn dependency:tree
詳しくは次ページ
依存関係 (抜粋)
[INFO] | +- org.thymeleaf:thymeleaf-spring5:jar:3.0.11.RELEASE:compile
[INFO] | | +- org.thymeleaf:thymeleaf:jar:3.0.11.RELEASE:compile
[INFO] | | | +- org.attoparser:attoparser:jar:2.0.5.RELEASE:compile
[INFO] | | | ¥- org.unbescape:unbescape:jar:1.1.6.RELEASE:compile
[INFO] | | ¥- org.slf4j:slf4j-api:jar:1.7.29:compile
[INFO] | ¥- org.thymeleaf.extras:thymeleaf-extras-java8time:jar:3.0.4.RELEASE:compile
[INFO] +- org.springframework.boot:spring-boot-starter-web:jar:2.2.2.RELEASE:compile
[INFO] | +- org.springframework.boot:spring-boot-starter-json:jar:2.2.2.RELEASE:compile
[INFO] | +- org.springframework.boot:spring-boot-starter-tomcat:jar:2.2.2.RELEASE:compile
[INFO] | | +- org.apache.tomcat.embed:tomcat-embed-core:jar:9.0.29:compile
[INFO] | | +- org.apache.tomcat.embed:tomcat-embed-el:jar:9.0.29:compile
[INFO] | | ¥- org.apache.tomcat.embed:tomcat-embed-websocket:jar:9.0.29:compile
[INFO] | +- org.springframework:spring-web:jar:5.2.2.RELEASE:compile
[INFO] | ¥- org.springframework:spring-webmvc:jar:5.2.2.RELEASE:compile
mvn dependency:tree
ちょっとインターネットに公開したいときは Heroku がオススメ
● Spring Boot + Spring Web + Thymeleaf を
ちょっとインターネット上に公開したりテストしたりしたいときには
Spring Boot と親和性の⾼い Heroku の利⽤がオススメ
● https://jp.heroku.com/
例えば...
1. オートスケールする Web システムを構築したい
2. でも スケールする Webアプリケーションサーバに重課⾦したくない
3. Spring + Spring Web + Thymeleaf を Heroku にデプロイにより微課⾦構成化
4. Heroku コンソールから簡単オートスケーリング!
まとめ
このセッションで知って欲しいこと (再掲)
● Thymeleaf を知るためのヒントと道筋を理解する
○ Webサイトの読み解き⽅を知り、セッションの後にも⾃⼒で調べられるように
● Thymeleaf を採⽤する利点
○ 後発 OSS テンプレートエンジンとしての優秀さ
○ 動的Webページ サーバレンダリングでのテンプレート⽅式の優位性
○ 共通化・再利⽤を強⼒に⽀援する各種機能
● セッションの前提知識 : Java、HTMLを多少は知っていること
中締め
Appendix
その他⾊々
Appendix : HTMLパーサ、エスケープライブラリ
● attoparser
Thymeleaf が利⽤している HTML parser.
Thymeleaf 互換 html 処理が可能
● unbescape
Thymeleaf が利⽤しているエスケープライブラリ
ソースコードを読もう
Appendix : Maven 重要
● Maven そのもの
● Maven Repository !
みんな⼤好き Maven Repository!
みんなで作ろう Maven Repository!
Appendix: Maven Repository
Appendix : Spring Boot Actuator
groupId: org.springframework.boot
artifactId: spring-boot-starter-actuator
management.endpoints.web.exposure.include=*
本番環境ではこの記述は削除するなどoff に
なにか変だと思ったら
Appendix : Java SE Development Kit 1.8 以降を強く推奨
● 開発環境でバージョン衝突などする場合は
VirtualBox や VMware などの活⽤検討もアリ
● ある程度は新しいバージョンの統合開発環境を利⽤しよう
JDK バージョンアップによって
Eclipse などのバージョンアップが必要に…
● Thymeleaf ⾃体は 1.6 以降…
本締め
Thymeleaf
さいしょの⼀歩
(抜粋再掲)
初⼼者向け Thymeleaf ⼊⾨。Thymeleaf はもちろん Spring もあまり知ら
ない⼈向けの Thymeleaf をもちいた Web アプリ開発⼊⾨。
前提条件︓HTML、⼀般的な Web アプリの仕組み、Java、Maven、そして
Spring についての最低限で基礎的な知識があること。
DBの話題は扱いません。
Spring Fest 2018
発表資料より
Initializer の
アウトプットを実⾏
コマンドラインから Web アプリを実⾏
. ____ _ __ _ _
/¥¥ / ___'_ __ _ _(_)_ __ __ _ ¥ ¥ ¥ ¥
( ( )¥___ | '_ | '_| | '_ ¥/ _` | ¥ ¥ ¥ ¥
¥¥/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_¥__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.0.6.RELEASE)
2018-10-29 11:44:56.396 INFO 95896 --- [ main]
jp.igapyon.webdemo.WebdemoApplication : Starting WebdemoApplication on pomegat-
virtual-machine with PID 99999 (/.../webdemo/target/classes started by user1 in
/.../webdemo)
やった
Hello World が近づいてきた!
mvn spring-boot:run
この時点だと、接続してもエラー
エラーの確認も重要
ようやく
はじめての Thymeleaf
まずは静的コンテンツ
静的リソースによる Hello World.
.
├── src
│ ├── main
│ │ └── resources
│ │ ├── application.properties
│ │ ├── static
│ │ └── templates
│ │ └── index.html <html>
<head>
<title>Hello World!</title>
</head>
<body>
<p>Hello the Thymeleaf World!</p>
</body>
</html>
index.html
静的リソースによる Hello World.
ctrl+C
mvn spring-boot:run
とめる
うごかす
Bootstrap 付き 静的 Hello World.
<!doctype html>
<html lang="ja">
<head>
<title>Hello World!</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css"
integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm"
crossorigin="anonymous">
</head>
<body>
<h1>Hello World.</h1>
<p>Hello the Thymeleaf World!</p>
</body>
</html>
index.html
はじめての
動的な Thymeleaf
はじめての動的な Hello World (1)
.
├── src
│ ├── main
│ │ ├── java
│ │ │ └── jp
│ │ │ └── igapyon
│ │ │ └── webdemo
│ │ │ ├── HelloController.java
│ │ │ └── WebdemoApplication.java
│ │ └── resources
│ │ └── templates
│ │ ├── hello.html
│ │ └── index.html
テンプレート
コントローラ
ファイルの配置パスを間違えると
動作しない
はじめての動的な Hello World (2)
package jp.igapyon.webdemo;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HelloController {
@GetMapping("/hello")
public String hello(Model model) {
model.addAttribute("message", "Hello World from Thymeleaf.");
return "hello";
}
}
← htmlテンプレートファイル名
← アクセスパス
HelloController.java
はじめての動的な Hello World (3)
<!doctype html>
<html lang="ja" xmlns:th="http://www.thymeleaf.org">
<head>
<title>Hello World!</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-
fit=no">
<link rel="stylesheet" href="https://maxcdn.boots…(省略)...">
</head>
<body>
<h1>Hello World.</h1>
<p th:text="${message}"/>
</body>
</html>
hello.html
はじめての動的な Hello World (4)
やった
Hello World だっ!
mvn spring-boot:run
ctrl+C で停⽌する⽅は適宜...
動的な Thymeleaf
のエラーの例
Thymeleaf の典型的なエラー例 (1) - マッピング無し
マッピングがない URL の場合のエラー例
@Controller
public class HelloController {
@GetMapping("/hello")
public String hello(Model model) {
model.addAttribute("message", "Hello World from Thymeleaf.");
return "hello2";
}
Thymeleaf の典型的なエラー例 (2) - テンプレート無し
わざとテンプレートを存在させない例
エラー確認体験重要
Thymeleaf での
テキスト出⼒⽅法
Thymeleaf でのテキスト出⼒⽅法 - 基本
<body>
<h1>Hello World.</h1>
<p th:text="${message}"/>
</body>
hello.html から
基本形
Thymeleaf でのテキスト出⼒⽅法 - 応⽤1
<body>
<h1>Hello World.</h1>
<p>[[${message}]]</p>
</body>
hello.html から
簡単系
Thymeleaf でのテキスト出⼒⽅法 - 応⽤2
<body>
<h1>Hello World.</h1>
<p><span
th:text="${message}"
th:remove="tag"/></p>
</body>
hello.html から
th:remove 属性で
タグ出⼒を制御
タグが不要な時に便利
困った時の特
効薬!?
Standard Expression
について
$ って、なあに
${message} の箇所は Standard Expression と呼ばれるもの
Java と Thymeleaf をつなぐ記法。
Simple expressions:
● ${...} : Variable expressions.
● *{...} : Selection expressions.
● #{...} : Message (i18n) expressions.
● @{...} : Link (URL) expressions.
● ~{...} : Fragment expressions.
see:
https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html#standard-expression-syntax
$ と * が、よく利⽤される
Standard Expression を使える属性
https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html#setting-
value-to-specific-attributes
th:abbr、th:accept、th:accept-charset、th:accesskey、th:action、th:align、th:alt、th:archive、th:audio
th:autocomplete、th:axis、th:background、th:bgcolor、th:border、th:cellpadding、th:cellspacing、
th:challenge、th:charset、th:cite、th:class、th:classid、th:codebase、th:codetype、th:cols、th:colspan
th:compact、th:content、th:contenteditable、th:contextmenu、th:data、th:datetime、th:dir、th:draggable
th:dropzone、th:enctype、th:for、th:form、th:formaction、th:formenctype、th:formmethod、th:formtarget
th:fragment、th:frame、th:frameborder、th:headers、th:height、th:high、th:href、th:hreflang、th:hspace
th:http-equiv、th:icon、th:id、th:inline、th:keytype、th:kind、th:label、th:lang、th:list、th:longdesc
th:low、th:manifest、th:marginheight、th:marginwidth、th:max、th:maxlength、th:media、th:method
th:min、th:name、th:onabort、th:onafterprint、th:onbeforeprint、th:onbeforeunload、th:onblur
th:oncanplay、th:oncanplaythrough、th:onchange、th:onclick、th:oncontextmenu、th:ondblclick
th:ondrag、th:ondragend、th:ondragenter、th:ondragleave、th:ondragover、th:ondragstart、th:ondrop
th:ondurationchange、th:onemptied、th:onended、th:onerror、th:onfocus、th:onformchange
th:onforminput、th:onhashchange、th:oninput、th:oninvalid、th:onkeydown、th:onkeypress、th:onkeyup
th:onload、th:onloadeddata、th:onloadedmetadata、th:onloadstart、th:onmessage、th:onmousedown
boolean の属性
https://www.thymeleaf.org/doc/tutorials/3.0/usingthymelea
f.html#fixed-value-boolean-attributes
th:async, th:autofocus, th:autoplay, th:checked, th:controls, th:declare,
th:default, th:defer, th:disabled, th:formnovalidate, th:hidden, th:ismap,
th:loop, th:multiple, th:novalidate, th:nowrap, th:open, th:pubdate,
th:readonly, th:required, th:reversed, th:scoped, th:seamless, th:selected
繰り返し記法
Iteration
https://www.thymeleaf.org/doc/tutorials/3.0/u
singthymeleaf.html#iteration-basics
前回発表資料の終端

More Related Content

What's hot

PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門泰 増田
 
これからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきことこれからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきこと土岐 孝平
 
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)NTT DATA Technology & Innovation
 
Spring Bootハンズオン ~Spring Bootで作る マイクロサービスアーキテクチャ! #jjug_ccc #ccc_r53
Spring Bootハンズオン ~Spring Bootで作る マイクロサービスアーキテクチャ! #jjug_ccc #ccc_r53Spring Bootハンズオン ~Spring Bootで作る マイクロサービスアーキテクチャ! #jjug_ccc #ccc_r53
Spring Bootハンズオン ~Spring Bootで作る マイクロサービスアーキテクチャ! #jjug_ccc #ccc_r53Toshiaki Maki
 
CircleCIのinfrastructureを支えるTerraformのCI/CDパイプラインの改善
CircleCIのinfrastructureを支えるTerraformのCI/CDパイプラインの改善CircleCIのinfrastructureを支えるTerraformのCI/CDパイプラインの改善
CircleCIのinfrastructureを支えるTerraformのCI/CDパイプラインの改善Ito Takayuki
 
Azure App Service Overview
Azure App Service OverviewAzure App Service Overview
Azure App Service OverviewTakeshi Fukuhara
 
JDK 16 で導入された JEP 396 にご注意!! (JJUG CCC 2021 Spring)
JDK 16 で導入された JEP 396 にご注意!! (JJUG CCC 2021 Spring)JDK 16 で導入された JEP 396 にご注意!! (JJUG CCC 2021 Spring)
JDK 16 で導入された JEP 396 にご注意!! (JJUG CCC 2021 Spring)Yoshiro Tokumasu
 
イミュータブルデータモデルの極意
イミュータブルデータモデルの極意イミュータブルデータモデルの極意
イミュータブルデータモデルの極意Yoshitaka Kawashima
 
ジェネリクスの基礎と クラス設計への応用
ジェネリクスの基礎とクラス設計への応用ジェネリクスの基礎とクラス設計への応用
ジェネリクスの基礎と クラス設計への応用nagise
 
入社1年目のプログラミング初心者がSpringを学ぶための手引き
入社1年目のプログラミング初心者がSpringを学ぶための手引き入社1年目のプログラミング初心者がSpringを学ぶための手引き
入社1年目のプログラミング初心者がSpringを学ぶための手引き土岐 孝平
 
Apache Airflow入門 (マーケティングデータ分析基盤技術勉強会)
Apache Airflow入門  (マーケティングデータ分析基盤技術勉強会)Apache Airflow入門  (マーケティングデータ分析基盤技術勉強会)
Apache Airflow入門 (マーケティングデータ分析基盤技術勉強会)Takeshi Mikami
 
Java開発の強力な相棒として今すぐ使えるGroovy
Java開発の強力な相棒として今すぐ使えるGroovyJava開発の強力な相棒として今すぐ使えるGroovy
Java開発の強力な相棒として今すぐ使えるGroovyYasuharu Nakano
 
DI(依存性注入)について
DI(依存性注入)についてDI(依存性注入)について
DI(依存性注入)についてYui Ito
 
これからのJDK 何を選ぶ?どう選ぶ? (v1.2) in 熊本
これからのJDK 何を選ぶ?どう選ぶ? (v1.2) in 熊本これからのJDK 何を選ぶ?どう選ぶ? (v1.2) in 熊本
これからのJDK 何を選ぶ?どう選ぶ? (v1.2) in 熊本Takahiro YAMADA
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean ArchitectureAtsushi Nakamura
 
JAVA_HOME/binにあるコマンド、いくつ使っていますか?[JVM関連ツール編](JJUGナイトセミナー「Java解析ツール特集」 発表資料)
JAVA_HOME/binにあるコマンド、いくつ使っていますか?[JVM関連ツール編](JJUGナイトセミナー「Java解析ツール特集」 発表資料)JAVA_HOME/binにあるコマンド、いくつ使っていますか?[JVM関連ツール編](JJUGナイトセミナー「Java解析ツール特集」 発表資料)
JAVA_HOME/binにあるコマンド、いくつ使っていますか?[JVM関連ツール編](JJUGナイトセミナー「Java解析ツール特集」 発表資料)NTT DATA Technology & Innovation
 
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5Takahiro YAMADA
 
SQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するかSQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するかShogo Wakayama
 
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とはがんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とはJun-ichi Sakamoto
 
What's new in Spring Batch 5
What's new in Spring Batch 5What's new in Spring Batch 5
What's new in Spring Batch 5ikeyat
 

What's hot (20)

PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門
 
これからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきことこれからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきこと
 
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
 
Spring Bootハンズオン ~Spring Bootで作る マイクロサービスアーキテクチャ! #jjug_ccc #ccc_r53
Spring Bootハンズオン ~Spring Bootで作る マイクロサービスアーキテクチャ! #jjug_ccc #ccc_r53Spring Bootハンズオン ~Spring Bootで作る マイクロサービスアーキテクチャ! #jjug_ccc #ccc_r53
Spring Bootハンズオン ~Spring Bootで作る マイクロサービスアーキテクチャ! #jjug_ccc #ccc_r53
 
CircleCIのinfrastructureを支えるTerraformのCI/CDパイプラインの改善
CircleCIのinfrastructureを支えるTerraformのCI/CDパイプラインの改善CircleCIのinfrastructureを支えるTerraformのCI/CDパイプラインの改善
CircleCIのinfrastructureを支えるTerraformのCI/CDパイプラインの改善
 
Azure App Service Overview
Azure App Service OverviewAzure App Service Overview
Azure App Service Overview
 
JDK 16 で導入された JEP 396 にご注意!! (JJUG CCC 2021 Spring)
JDK 16 で導入された JEP 396 にご注意!! (JJUG CCC 2021 Spring)JDK 16 で導入された JEP 396 にご注意!! (JJUG CCC 2021 Spring)
JDK 16 で導入された JEP 396 にご注意!! (JJUG CCC 2021 Spring)
 
イミュータブルデータモデルの極意
イミュータブルデータモデルの極意イミュータブルデータモデルの極意
イミュータブルデータモデルの極意
 
ジェネリクスの基礎と クラス設計への応用
ジェネリクスの基礎とクラス設計への応用ジェネリクスの基礎とクラス設計への応用
ジェネリクスの基礎と クラス設計への応用
 
入社1年目のプログラミング初心者がSpringを学ぶための手引き
入社1年目のプログラミング初心者がSpringを学ぶための手引き入社1年目のプログラミング初心者がSpringを学ぶための手引き
入社1年目のプログラミング初心者がSpringを学ぶための手引き
 
Apache Airflow入門 (マーケティングデータ分析基盤技術勉強会)
Apache Airflow入門  (マーケティングデータ分析基盤技術勉強会)Apache Airflow入門  (マーケティングデータ分析基盤技術勉強会)
Apache Airflow入門 (マーケティングデータ分析基盤技術勉強会)
 
Java開発の強力な相棒として今すぐ使えるGroovy
Java開発の強力な相棒として今すぐ使えるGroovyJava開発の強力な相棒として今すぐ使えるGroovy
Java開発の強力な相棒として今すぐ使えるGroovy
 
DI(依存性注入)について
DI(依存性注入)についてDI(依存性注入)について
DI(依存性注入)について
 
これからのJDK 何を選ぶ?どう選ぶ? (v1.2) in 熊本
これからのJDK 何を選ぶ?どう選ぶ? (v1.2) in 熊本これからのJDK 何を選ぶ?どう選ぶ? (v1.2) in 熊本
これからのJDK 何を選ぶ?どう選ぶ? (v1.2) in 熊本
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
 
JAVA_HOME/binにあるコマンド、いくつ使っていますか?[JVM関連ツール編](JJUGナイトセミナー「Java解析ツール特集」 発表資料)
JAVA_HOME/binにあるコマンド、いくつ使っていますか?[JVM関連ツール編](JJUGナイトセミナー「Java解析ツール特集」 発表資料)JAVA_HOME/binにあるコマンド、いくつ使っていますか?[JVM関連ツール編](JJUGナイトセミナー「Java解析ツール特集」 発表資料)
JAVA_HOME/binにあるコマンド、いくつ使っていますか?[JVM関連ツール編](JJUGナイトセミナー「Java解析ツール特集」 発表資料)
 
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
 
SQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するかSQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するか
 
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とはがんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
 
What's new in Spring Batch 5
What's new in Spring Batch 5What's new in Spring Batch 5
What's new in Spring Batch 5
 

Similar to Practical migration from JSP to Thymeleaf

thymeleafさいしょの一歩
thymeleafさいしょの一歩thymeleafさいしょの一歩
thymeleafさいしょの一歩Yuichi Hasegawa
 
Introduction to Favmemo for Immature Engineers
Introduction to Favmemo for Immature EngineersIntroduction to Favmemo for Immature Engineers
Introduction to Favmemo for Immature EngineersTakeshi Arabiki
 
Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)Tokuhiro Matsuno
 
2009年のPHPフレームワーク
2009年のPHPフレームワーク2009年のPHPフレームワーク
2009年のPHPフレームワークTakuya Sato
 
まだFTPで消耗してるの? Wordmoveではじめる 異次元のデータ転送
まだFTPで消耗してるの? Wordmoveではじめる 異次元のデータ転送まだFTPで消耗してるの? Wordmoveではじめる 異次元のデータ転送
まだFTPで消耗してるの? Wordmoveではじめる 異次元のデータ転送Sou Lab
 
Thymeleafのすすめ
ThymeleafのすすめThymeleafのすすめ
Thymeleafのすすめeiryu
 
PlayFramework1.x基礎編
PlayFramework1.x基礎編PlayFramework1.x基礎編
PlayFramework1.x基礎編Asami Abe
 
8時間耐久 PHP構築の教室
8時間耐久 PHP構築の教室8時間耐久 PHP構築の教室
8時間耐久 PHP構築の教室Yusuke Ando
 
今すぐブラウザでES6を使おう
今すぐブラウザでES6を使おう今すぐブラウザでES6を使おう
今すぐブラウザでES6を使おうHayashi Yuichi
 
2015/04/11 第4回G-Study発表資料 Risoluto開発に見る車輪の再発明
2015/04/11 第4回G-Study発表資料 Risoluto開発に見る車輪の再発明2015/04/11 第4回G-Study発表資料 Risoluto開発に見る車輪の再発明
2015/04/11 第4回G-Study発表資料 Risoluto開発に見る車輪の再発明Yuta Hayakawa
 
Scala 初めての人が Heroku で Web アプリを公開するまで
Scala 初めての人が Heroku で Web アプリを公開するまでScala 初めての人が Heroku で Web アプリを公開するまで
Scala 初めての人が Heroku で Web アプリを公開するまでHideaki Miyake
 
HTML5 アプリ開発
HTML5 アプリ開発HTML5 アプリ開発
HTML5 アプリ開発tomo_masakura
 
【Camphor ×サイボウズ】selenium勉強会
【Camphor ×サイボウズ】selenium勉強会【Camphor ×サイボウズ】selenium勉強会
【Camphor ×サイボウズ】selenium勉強会Yuki Okada
 
Javaな人が気を付けるべきJavaScriptコーディングスタイル
Javaな人が気を付けるべきJavaScriptコーディングスタイルJavaな人が気を付けるべきJavaScriptコーディングスタイル
Javaな人が気を付けるべきJavaScriptコーディングスタイルMaaya Ishida
 
.NETのTuple応用チャレンジ WCFとC++/CLI
.NETのTuple応用チャレンジ WCFとC++/CLI.NETのTuple応用チャレンジ WCFとC++/CLI
.NETのTuple応用チャレンジ WCFとC++/CLIkeitasudo1
 
爆速フレームワークでREST APIを作った話
爆速フレームワークでREST APIを作った話爆速フレームワークでREST APIを作った話
爆速フレームワークでREST APIを作った話Shohei Tai
 

Similar to Practical migration from JSP to Thymeleaf (20)

thymeleafさいしょの一歩
thymeleafさいしょの一歩thymeleafさいしょの一歩
thymeleafさいしょの一歩
 
Introduction to Favmemo for Immature Engineers
Introduction to Favmemo for Immature EngineersIntroduction to Favmemo for Immature Engineers
Introduction to Favmemo for Immature Engineers
 
Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)
 
2009年のPHPフレームワーク
2009年のPHPフレームワーク2009年のPHPフレームワーク
2009年のPHPフレームワーク
 
OSC福岡 20111203
OSC福岡 20111203OSC福岡 20111203
OSC福岡 20111203
 
まだFTPで消耗してるの? Wordmoveではじめる 異次元のデータ転送
まだFTPで消耗してるの? Wordmoveではじめる 異次元のデータ転送まだFTPで消耗してるの? Wordmoveではじめる 異次元のデータ転送
まだFTPで消耗してるの? Wordmoveではじめる 異次元のデータ転送
 
Thymeleafのすすめ
ThymeleafのすすめThymeleafのすすめ
Thymeleafのすすめ
 
PlayFramework1.x基礎編
PlayFramework1.x基礎編PlayFramework1.x基礎編
PlayFramework1.x基礎編
 
8時間耐久 PHP構築の教室
8時間耐久 PHP構築の教室8時間耐久 PHP構築の教室
8時間耐久 PHP構築の教室
 
今すぐブラウザでES6を使おう
今すぐブラウザでES6を使おう今すぐブラウザでES6を使おう
今すぐブラウザでES6を使おう
 
2015/04/11 第4回G-Study発表資料 Risoluto開発に見る車輪の再発明
2015/04/11 第4回G-Study発表資料 Risoluto開発に見る車輪の再発明2015/04/11 第4回G-Study発表資料 Risoluto開発に見る車輪の再発明
2015/04/11 第4回G-Study発表資料 Risoluto開発に見る車輪の再発明
 
PHPにおけるI/O多重化とyield
PHPにおけるI/O多重化とyieldPHPにおけるI/O多重化とyield
PHPにおけるI/O多重化とyield
 
Scala 初めての人が Heroku で Web アプリを公開するまで
Scala 初めての人が Heroku で Web アプリを公開するまでScala 初めての人が Heroku で Web アプリを公開するまで
Scala 初めての人が Heroku で Web アプリを公開するまで
 
HTML5 アプリ開発
HTML5 アプリ開発HTML5 アプリ開発
HTML5 アプリ開発
 
【Camphor ×サイボウズ】selenium勉強会
【Camphor ×サイボウズ】selenium勉強会【Camphor ×サイボウズ】selenium勉強会
【Camphor ×サイボウズ】selenium勉強会
 
Javaな人が気を付けるべきJavaScriptコーディングスタイル
Javaな人が気を付けるべきJavaScriptコーディングスタイルJavaな人が気を付けるべきJavaScriptコーディングスタイル
Javaな人が気を付けるべきJavaScriptコーディングスタイル
 
Pythonでwebdriver
PythonでwebdriverPythonでwebdriver
Pythonでwebdriver
 
.NETのTuple応用チャレンジ WCFとC++/CLI
.NETのTuple応用チャレンジ WCFとC++/CLI.NETのTuple応用チャレンジ WCFとC++/CLI
.NETのTuple応用チャレンジ WCFとC++/CLI
 
Beginners scala 20121113
Beginners scala 20121113Beginners scala 20121113
Beginners scala 20121113
 
爆速フレームワークでREST APIを作った話
爆速フレームワークでREST APIを作った話爆速フレームワークでREST APIを作った話
爆速フレームワークでREST APIを作った話
 

Practical migration from JSP to Thymeleaf