SlideShare a Scribd company logo
Groovy 2.3,2.4の新機能より、
「マークアップテンプレー
トエンジン」機能のご紹介
2014/12/19
NTTソフトウェア株式会社
上原潤二
Copyright (C) 2014 NTT Software Corp.
The Groovy Roadmap
• Groovy 2.3
• 2.3.0(2014.5.5)
• Groovy 2.4
• 2.4b1(2014.6.12)
• 2.4b2(2014.7.29)
• 2.4b3(2014.9.2)
• 2.4b4(2014.11.27)
• RC1,2,3…
• Release(2015.初?)
• Groovy 3.0(2016?)
http://www.slideshare.net/SpringCentral/groovy-
in-2014andbeyond?qid=c66045f1-fab4-44f8-
a86e-afccd3e7e56f&v=qf1&b=&from_search=3
Groovy 2.3新機能一覧
• Trait
• 新規AST変換
• @TailRecursive/
@Builder/@Sortable/
@SourceURI
• ライブラリ改良・拡張
• マークアップテンプ
レートエンジンの追
加
• JSON Slurper
• ConfigSlurper
• Java8/7対応
• JUnit4対応
• @ClosureParams
• ツール拡張
• Groovysh
• GroovyConsole
• ドキュメント改善
Groovy 2.4

∼beta4)新機能一覧
• Android対応
• ライブラリ改良・拡張
• toUnique(), toSorted()の
追加
• init(), dropRight()、
takeRight()の追加
• System.currentTimeSec
ond()の追加
• ツール拡張
• Groovysh
• -eオプション
• ローカル変数の型宣言
• SelfTypeアノテーション
• MacroGroovy/
ASTMatcher→2.5へ
今日のテーマ
• マークアップテンプレートエンジン
• groovy.text.markup.MarkupTemplateEngine
継承階層
• SimpleTemplateEngineと同列
• MarkupBuilderのような記法のテンプレート
XML/HTMLを生成するDSL
html {
head {
title "タイトル"
}
body {
h1 "タイトル"
ul {
(1..10).each {
li it
}
}
}
}
<html>
<head>
<title>タイトル</title>
</head><body>
<h1>タイトル</h1><ul>
<li>1</li><li>2</li><li>3</
li><li>4</li><li>5</li><li>6</li><li>7</
li><li>8</li><li>9</li><li>10</li>
</ul>
</body>
</html>
機能
• プログラマブルマークアップ言語
• HTML/XMLを生成
• 型チェック機能つき
• インクルード
• エスケープ
• レイアウト
• http://beta.groovy-lang.org/docs/latest/html/gapi/
groovy/text/markup/
BaseTemplate.html#layout(java.util.Map, java.lang.String)
• 国際化
• Grailsタグリブを呼び出す
• http://beta.groovy-lang.org/docs/latest/html/gapi/groovy/
text/markup/TagLibAdapter.html
フレームワークにくみこまれ始
めている
• Spring MVC 4のGroovyMarkupViewはそれである
• Spring Bootから呼んだり
• http://spring.io/blog/2014/05/28/using-the-
innovative-groovy-template-engine-in-spring-
boot
• Ratpackでも使える
今日は
• マークアップテンプレートエンジンを使って
Webアプリケーションフレームワークを作っちゃ
おう!!
• マークアップテンプレートエンジンは、基
本的には「文字列生成処理」なので、http
リクエストに繋げ、レスポンスを返す
• TemplateServletとのアダプタを作ればよい
これだけだ
package org.jggug.markup
import groovy.text.markup.MarkupTemplateEngine
import groovy.text.markup.TemplateConfiguration
class ServletAwareMarkupTemplateEngine extends
MarkupTemplateEngine {
ServletAwareMarkupTemplateEngine() {
super(new TemplateConfiguration(autoIndent:true,
autoNewLine:true, expandEmptyElements:true))
}
}
html {
includeGroovy('head.tpl')
body {
nav (class:"navbar navbar-inverse navbar-fixed-top", role:"navigation") {
div (class:"container") {
div (class:"navbar-header") {
button (type:"button", class:"navbar-toggle collapsed", 'data-
toggle':"collapse", 'data-target':"#navbar", 'aria-expanded':"false", 'aria-
controls':"navbar") {
span class:"sr-only", "ナビゲーションの切替"
span class:"icon-bar"
span class:"icon-bar"
span class:"icon-bar"
}
a(class:"navbar-brand", href:"#", yield "Bootstrap theme")
}
div (id:"navbar", class:"navbar-collapse collapse") {
ul (class:"nav navbar-nav") {
li (class:"active") { a (href:"#", "Home") }
li { a (href:"#about", "About" ) }
li { a (href:"#contact", "Contact" ) }
li (class:"dropdown") {
a (href:"#", class:"dropdown-toggle", 'data-toggle':"dropdown",
role:"button", 'aria-expanded':"false", "Dropdown"; span class:"caret" )
ul (class:"dropdown-menu", role:"menu") {
デモ
BootstrapのHTML/CSSのサン
プルを機械的に変換。つらい。
web.xml
<web-app>
<servlet>
<servlet-name>template</servlet-name>
<servlet-class>groovy.servlet.TemplateServlet</servlet-class>
<init-param>
<param-name>template.engine</param-name>
<param-value>org.jggug.markup.ServletAwareMarkupTemplateEngine</
param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>template</servlet-name>
<url-pattern>*.tpl</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.tpl</welcome-file>
</welcome-file-list>
</web-app>
war
.
├── META-INF
│ └── MANIFEST.MF
├── WEB-INF
│ ├── classes
│ │ ├── META-INF
│ │ ├── cars.tpl
│ │ ├── defer.tpl
│ │ ├── head.tpl
│ │ ├── index.tpl
│ │ ├── list.tpl
│ │ ├── navi.tpl
│ │ ├── org
│ │ │ └── jggug
│ │ │ ├── Car.class
│ │ │ └── markup
│ │ │ ├── ServletAwareMarkupTemplateEngine.class
│ │ │ └── ServletAwareTypeCheckedMarkupTemplateEngine.class
│ │ ├── sample.tpl
│ │ └── typechecked
│ │ └── index.stpl
│ ├── lib
│ │ └── groovy-all-2.4.0-beta-4.jar
│ └── web.xml
├── cars.tpl
├── defer.tpl
├── head.tpl
├── index.tpl
├── list.tpl
├── navi.tpl
├── sample.tpl
└── typechecked
└── index.stpl
includeするには
classpathにある必要が
あり、暫定的に二重保持
型チェックつきにする
package org.jggug.markup
import
groovy.text.markup.MarkupTemplateEngine
import
groovy.text.markup.TemplateConfiguration
import groovy.text.Template
class
ServletAwareTypeCheckedMarkupTempl
ateEngine extends MarkupTemplateEngine
{
HashMap<String,String> modelTypes = [
request:'javax.servlet.http.HttpServletReque
st',
response:'javax.servlet.http.HttpServletResp
onse',
context:'javax.servlet.ServletContext',
application:'javax.servlet.ServletContext',
session:'javax.servlet.http.HttpSession',
params:'Map',
headers:'LinkedHashMap<String,
String>'
]
ServletAwareTypeCheckedMarkupTemplate
Engine() {
super(new
TemplateConfiguration(autoIndent:true,
autoNewLine:true,
expandEmptyElements:true))
}
Template createTemplate(Reader reader)
{
createTypeCheckedModelTemplate(reader,
modelTypes)
}
Template createTemplate(Reader reader,
String sourceName) {
createTypeCheckedModelTemplate(reader,
sourceName, modelTypes)
}
Template createTemplate(URL resource)
{
createTypeCheckedModelTemplate(resourc
e, modelTypes)
}
}
型情報の与え方
HashMap<String,String> modelTypes = [
request:'javax.servlet.http.HttpServletRequest',
response:'javax.servlet.http.HttpServletResponse',
context:'javax.servlet.ServletContext',
application:'javax.servlet.ServletContext',
session:'javax.servlet.http.HttpSession',
params:'Map',
headers:'LinkedHashMap<String, String>'
]
createTypeCheckedModelTemplate(reader, modelTypes)
文字列で!
型エラー
javax.servlet.ServletException: Creation of template failed:
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup
failed:
GeneratedMarkupTemplate0: 4: [Static type checking] - No such
property: foo for class: javax.servlet.http.HttpServletRequest
@ line 4, column 33.
h1 { yield "request.foo="+request.foo }
^
html {
body {
h1 "headers="+headers.'user-agent'
h1 "request.foo="+request.foo
}
}
プログラミングHTML:
Helper Functions
def container(clos) {
div (class:"container") {
clos.call()
}
}
def row(clos) {
div (class:"row") {
clos.call()
}
}
def col_md(n, clos) {
div (class:"col-md-"+n) {
clos.call()
}
}
def header(s) {
div (class:"page-header")
{
h1 s
}
}
def alert(s, clos) {
div (class:"alert alert-
$s", role:"alert", clos)
}
Programming HTML:
You can writecontainer {
row {
col_md(2) {
header "サイドバーの表示"
}
col_md(10) {
header "メインの表示"
alert('success') {
strong "Well done!"
yield "You successfully read this important alert
message."
}
alert('info') {
strong "Heads up!"
yield "This alert needs your attention, but it's not
super important."
}
}
}
Simpler
and Tidy way
まとめ
• MarkupTemplateEngineは、

新世代型付きDSL実装の模範コード。
• 以下を使用して実装
• 型チェッカ拡張(TypeChecking Extension)
• aka (カスタムタイプチェッカ)Custom Type Checker)
• CompilerConfiguration
• プログラミング言語のフル機能を使ってマークアップ
• 抽象化、型システム、モジュラリテイ、合成、部品化
• HTML+CSSのような言語もどきではなく
参考リンク
• http://groovy.codehaus.org/Groovy%202.3%20release%20notes
• https://jira.codehaus.org/secure/ReleaseNote.jspa?
projectId=10242&version=20369
• https://jira.codehaus.org/secure/ReleaseNote.jspa?
projectId=10242&version=20433
• https://jira.codehaus.org/secure/ReleaseNote.jspa?
projectId=10242&version=20544
• https://jira.codehaus.org/secure/ReleaseNote.jspa?
projectId=10242&version=20612
• http://www.slideshare.net/rstoya05/spring-4-web-app
• http://spring.io/blog/2014/05/28/using-the-innovative-groovy-template-engine-in-
spring-boot

More Related Content

PDF
Indy(Invokedynamic) and Bytecode DSL and Brainf*ck
PDF
groovy 2.1.0 20130118
PDF
Introduce Groovy 2.3 trait
PDF
GroovyServ concept, how to use and outline.
PDF
enterprise grails challenge, 2013 Summer
PDF
Groovy Bootcamp 2015 by JGGUG
PDF
Groovy Shell Scripting 2015
PDF
New features of Groovy 2.0 and 2.1
Indy(Invokedynamic) and Bytecode DSL and Brainf*ck
groovy 2.1.0 20130118
Introduce Groovy 2.3 trait
GroovyServ concept, how to use and outline.
enterprise grails challenge, 2013 Summer
Groovy Bootcamp 2015 by JGGUG
Groovy Shell Scripting 2015
New features of Groovy 2.0 and 2.1

What's hot (20)

KEY
Java One 2012 Tokyo JVM Lang. BOF(Groovy)
PDF
New feature of Groovy2.0 G*Workshop
KEY
G* Workshop in fukuoka 20120901
PDF
Use JWT access-token on Grails REST API
PDF
Java開発の強力な相棒として今すぐ使えるGroovy
PDF
Groovyの紹介20130323
PDF
Groovy base gradle_20130309
PDF
Gws 20130315 gradle_handson
PDF
Read Groovy Compile process(Groovy Benkyoukai 2013)
ODP
こんにちはGroovy
PDF
GContractsの基礎
PDF
Groovy indy 20120222
PDF
What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの...
PPTX
GraalVMで使われている、他言語をJVM上に実装する仕組みを学ぼう
PDF
基礎からのCode Contracts
PDF
The History of Groovy #GroovyBase
PDF
Observable Everywhere - Rxの原則とUniRxにみるデータソースの見つけ方
PDF
【20220120 toranoana.deno#4】denoでffiの続き
PDF
分散バージョン管理システムって何なん 20101218
PDF
git-svnつかってみる?
Java One 2012 Tokyo JVM Lang. BOF(Groovy)
New feature of Groovy2.0 G*Workshop
G* Workshop in fukuoka 20120901
Use JWT access-token on Grails REST API
Java開発の強力な相棒として今すぐ使えるGroovy
Groovyの紹介20130323
Groovy base gradle_20130309
Gws 20130315 gradle_handson
Read Groovy Compile process(Groovy Benkyoukai 2013)
こんにちはGroovy
GContractsの基礎
Groovy indy 20120222
What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの...
GraalVMで使われている、他言語をJVM上に実装する仕組みを学ぼう
基礎からのCode Contracts
The History of Groovy #GroovyBase
Observable Everywhere - Rxの原則とUniRxにみるデータソースの見つけ方
【20220120 toranoana.deno#4】denoでffiの続き
分散バージョン管理システムって何なん 20101218
git-svnつかってみる?
Ad

Similar to Markup Template Engine introduced Groovy 2.3 (20)

PDF
Groovy Grails eXchage 2014 報告
PDF
Groovy kisobenkyoukai20130309
PDF
明日から使えるgradle
PDF
Djangoとweb2pyをapacheに組込む
PDF
GoBGP活用によるSD-WANプラクティス
PDF
ホームディレクトリに埋もれた便利なコードをさがせ!
PDF
Getting Started GraalVM (再アップロード)
PDF
Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2
PPTX
RgGen ご紹介
PPTX
Code Pack の話
PDF
How to run P4 BMv2
ODP
Gopenflow demo v1
PDF
Gws 20141024 gradle_intro
PDF
Jvm internal
PDF
組み込みLinuxでのGolangのススメ(Go con版)
PDF
Grailsのススメ(仮)
PDF
WebRTC開発者向けプラットフォーム SkyWayの裏側
PDF
Rocroにおけるgcp活用事例
PDF
GNU awk (gawk) を用いた Apache ログ解析方法
PDF
長いの
Groovy Grails eXchage 2014 報告
Groovy kisobenkyoukai20130309
明日から使えるgradle
Djangoとweb2pyをapacheに組込む
GoBGP活用によるSD-WANプラクティス
ホームディレクトリに埋もれた便利なコードをさがせ!
Getting Started GraalVM (再アップロード)
Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2
RgGen ご紹介
Code Pack の話
How to run P4 BMv2
Gopenflow demo v1
Gws 20141024 gradle_intro
Jvm internal
組み込みLinuxでのGolangのススメ(Go con版)
Grailsのススメ(仮)
WebRTC開発者向けプラットフォーム SkyWayの裏側
Rocroにおけるgcp活用事例
GNU awk (gawk) を用いた Apache ログ解析方法
長いの
Ad

More from Uehara Junji (16)

PDF
Shibuya JVM Groovy 20150418
KEY
JJUG CCC 2012 Real World Groovy/Grails
PDF
Java x Groovy: improve your java development life
KEY
Groovy 1.8の新機能について
PDF
Let's go Developer 2011 sendai Let's go Java Developer (Programming Language ...
KEY
Jggug ws 15th LT 20110224
PDF
Easy Going Groovy 2nd season on DevLOVE
PDF
Easy Going Groovy(Groovyを気軽に使いこなそう)
PDF
Clojure
PDF
Groovy, Transforming Language
KEY
Jggug Nagoya 20090925 Groovy
PDF
Lisp Builder
PDF
G*WS 3rd Lightning talk
PDF
Groovy Now And Future
PDF
Seasar Conference2008 Grails(Final)
PPT
Groovy Conference2008 Nttsoft
Shibuya JVM Groovy 20150418
JJUG CCC 2012 Real World Groovy/Grails
Java x Groovy: improve your java development life
Groovy 1.8の新機能について
Let's go Developer 2011 sendai Let's go Java Developer (Programming Language ...
Jggug ws 15th LT 20110224
Easy Going Groovy 2nd season on DevLOVE
Easy Going Groovy(Groovyを気軽に使いこなそう)
Clojure
Groovy, Transforming Language
Jggug Nagoya 20090925 Groovy
Lisp Builder
G*WS 3rd Lightning talk
Groovy Now And Future
Seasar Conference2008 Grails(Final)
Groovy Conference2008 Nttsoft

Markup Template Engine introduced Groovy 2.3