Download free for 30 days
Sign in
Upload
Language (EN)
Support
Business
Mobile
Social Media
Marketing
Technology
Art & Photos
Career
Design
Education
Presentations & Public Speaking
Government & Nonprofit
Healthcare
Internet
Law
Leadership & Management
Automotive
Engineering
Software
Recruiting & HR
Retail
Sales
Services
Science
Small Business & Entrepreneurship
Food
Environment
Economy & Finance
Data & Analytics
Investor Relations
Sports
Spiritual
News & Politics
Travel
Self Improvement
Real Estate
Entertainment & Humor
Health & Medicine
Devices & Hardware
Lifestyle
Change Language
Language
English
Español
Português
Français
Deutsche
Cancel
Save
Submit search
EN
Uploaded by
Y Watanabe
5,397 views
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
Technology
◦
Read more
8
Save
Share
Embed
Embed presentation
Download
Downloaded 33 times
1
/ 56
2
/ 56
3
/ 56
4
/ 56
5
/ 56
6
/ 56
7
/ 56
8
/ 56
9
/ 56
10
/ 56
11
/ 56
12
/ 56
13
/ 56
14
/ 56
15
/ 56
16
/ 56
17
/ 56
18
/ 56
19
/ 56
20
/ 56
21
/ 56
22
/ 56
23
/ 56
24
/ 56
25
/ 56
26
/ 56
27
/ 56
28
/ 56
29
/ 56
30
/ 56
31
/ 56
32
/ 56
33
/ 56
34
/ 56
35
/ 56
36
/ 56
37
/ 56
38
/ 56
39
/ 56
40
/ 56
41
/ 56
42
/ 56
43
/ 56
44
/ 56
45
/ 56
46
/ 56
47
/ 56
48
/ 56
49
/ 56
50
/ 56
51
/ 56
52
/ 56
53
/ 56
54
/ 56
55
/ 56
56
/ 56
More Related Content
PDF
Mixer2 で作るカスタムテンプレートエンジン #渋谷java
by
Jun Futagawa
PPT
Spring3.1概要 データアクセスとトランザクション処理
by
土岐 孝平
PDF
Spring AMQP × RabbitMQ
by
Keisuke Nishitani
PDF
20160521 大規模映像配信サービスの Java8による全面リニューアルの裏側
by
賢 秋穂
PDF
Introduction to JShell: the Java REPL Tool #jjug_ccc #ccc_ab4
by
bitter_fox
PPTX
.NET Compiler Platform
by
信之 岩永
PDF
Java Batch 仕様 (Public Review時点)
by
Norito Agetsuma
PDF
【Spring fest 2019】徹底解剖Spring MVCアーキテクチャー
by
ssuser070fa9
Mixer2 で作るカスタムテンプレートエンジン #渋谷java
by
Jun Futagawa
Spring3.1概要 データアクセスとトランザクション処理
by
土岐 孝平
Spring AMQP × RabbitMQ
by
Keisuke Nishitani
20160521 大規模映像配信サービスの Java8による全面リニューアルの裏側
by
賢 秋穂
Introduction to JShell: the Java REPL Tool #jjug_ccc #ccc_ab4
by
bitter_fox
.NET Compiler Platform
by
信之 岩永
Java Batch 仕様 (Public Review時点)
by
Norito Agetsuma
【Spring fest 2019】徹底解剖Spring MVCアーキテクチャー
by
ssuser070fa9
What's hot
PPTX
XPagesDay2015 - 誰も教えてくれなかったデバッグ方法
by
Mitsuru Katoh
PDF
Java EEを補完する仕様 MicroProfile
by
Norito Agetsuma
PDF
10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
by
kenjis
PDF
WildFly Swarmではじめる「パーツとしてのJavaEE」
by
Hiroaki NAKADA
PPTX
HTML5最新動向
by
Shumpei Shiraishi
PDF
Java SE 9の紹介: モジュール・システムを中心に
by
Taku Miyakawa
PDF
マイクロフレームワークEnkan(とKotowari)ではじめるREPL駆動開発
by
Yoshitaka Kawashima
PDF
10分でわかるFuelPHP @ 2011/12
by
kenjis
PDF
Deep dive into instanceof
by
Hiroshi Saito
PPTX
Heap statsfx analyzer
by
Yasumasa Suenaga
PDF
Groovyで楽にSQLを実行してみよう
by
Akira Shimosako
PDF
JavaScript.Next
by
dynamis
PDF
JavaFX 2.0 - リッチクライアントのためのUI基盤
by
Yuichi Sakuraba
PDF
What's New in MySQL 5.7 Optimizer @MySQL User Conference Tokyo 2015
by
Mikiya Okuno
PDF
PHP 2大 web フレームワークの徹底比較!
by
Shohei Okada
PDF
テストゼロからイチに進むための戦略と戦術
by
Y Watanabe
PDF
20091030cakephphandson 01
by
Yusuke Ando
PDF
PHP勉強会 #51
by
Takako Miyagawa
XPagesDay2015 - 誰も教えてくれなかったデバッグ方法
by
Mitsuru Katoh
Java EEを補完する仕様 MicroProfile
by
Norito Agetsuma
10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
by
kenjis
WildFly Swarmではじめる「パーツとしてのJavaEE」
by
Hiroaki NAKADA
HTML5最新動向
by
Shumpei Shiraishi
Java SE 9の紹介: モジュール・システムを中心に
by
Taku Miyakawa
マイクロフレームワークEnkan(とKotowari)ではじめるREPL駆動開発
by
Yoshitaka Kawashima
10分でわかるFuelPHP @ 2011/12
by
kenjis
Deep dive into instanceof
by
Hiroshi Saito
Heap statsfx analyzer
by
Yasumasa Suenaga
Groovyで楽にSQLを実行してみよう
by
Akira Shimosako
JavaScript.Next
by
dynamis
JavaFX 2.0 - リッチクライアントのためのUI基盤
by
Yuichi Sakuraba
What's New in MySQL 5.7 Optimizer @MySQL User Conference Tokyo 2015
by
Mikiya Okuno
PHP 2大 web フレームワークの徹底比較!
by
Shohei Okada
テストゼロからイチに進むための戦略と戦術
by
Y Watanabe
20091030cakephphandson 01
by
Yusuke Ando
PHP勉強会 #51
by
Takako Miyagawa
Viewers also liked
PDF
Springの今
by
Kazuyuki Kawamura
PDF
Spring3.1概要x di
by
Yuichi Hasegawa
PDF
Javaでやってみる The Twelve Factor App JJUG-CCC 2014 Fall 講演資料
by
Y Watanabe
PDF
Spring3.1概要 AOP & MVC
by
Yuichi Hasegawa
PDF
20130511 jjug ccc講演 さらばjsp JAXBとmixer2
by
Y Watanabe
PDF
The cost of learning - advantage of mixer2
by
Y Watanabe
PDF
201311 webデザイナとエンジニアのチームワークを加速させるテンプレートエンジンmixer2 devlove現場甲子園
by
Y Watanabe
PDF
Mixer2によるdynamic css sprite 201309第三回渋谷java
by
Y Watanabe
PDF
2013-09 テンプレートエンジンMixer2紹介 HTML5J&JJUG合同勉強会LT
by
Y Watanabe
PDF
日本語によるJUnitの拡張について
by
Kazuro Fukuhara
PDF
俺のコードがどこでつかわれているのかわからない問題 あるいはマイナーOSSの生存戦略
by
Y Watanabe
PDF
jooqってなんて読むの? から始めるO/RマッパーとSpringBootの世界
by
Y Watanabe
PPTX
Java Puzzlers JJUG CCC 2016
by
Yoshio Terada
PDF
渋谷java−あなたのプロジェクトで気軽にjavaをバージョンアップするために必要なこと
by
Y Watanabe
PDF
テンプレートエンジンにMixer2を使うとSeleniumでのテストもラクになるかもねという話
by
Y Watanabe
PDF
properties, yaml, and me
by
Y Watanabe
PDF
Seleniumと相性がいいテンプレートエンジンMixer2-第1回selenium勉強会ライトニングトーク
by
Y Watanabe
PPTX
Java8移行から始めた技術的負債との戦い(jjug ccc 2015 fall)
by
sogdice
PDF
20140405 mavenセントラルリポジトリへの登録のコツ 第5回渋谷java
by
Y Watanabe
PDF
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
by
増田 亨
Springの今
by
Kazuyuki Kawamura
Spring3.1概要x di
by
Yuichi Hasegawa
Javaでやってみる The Twelve Factor App JJUG-CCC 2014 Fall 講演資料
by
Y Watanabe
Spring3.1概要 AOP & MVC
by
Yuichi Hasegawa
20130511 jjug ccc講演 さらばjsp JAXBとmixer2
by
Y Watanabe
The cost of learning - advantage of mixer2
by
Y Watanabe
201311 webデザイナとエンジニアのチームワークを加速させるテンプレートエンジンmixer2 devlove現場甲子園
by
Y Watanabe
Mixer2によるdynamic css sprite 201309第三回渋谷java
by
Y Watanabe
2013-09 テンプレートエンジンMixer2紹介 HTML5J&JJUG合同勉強会LT
by
Y Watanabe
日本語によるJUnitの拡張について
by
Kazuro Fukuhara
俺のコードがどこでつかわれているのかわからない問題 あるいはマイナーOSSの生存戦略
by
Y Watanabe
jooqってなんて読むの? から始めるO/RマッパーとSpringBootの世界
by
Y Watanabe
Java Puzzlers JJUG CCC 2016
by
Yoshio Terada
渋谷java−あなたのプロジェクトで気軽にjavaをバージョンアップするために必要なこと
by
Y Watanabe
テンプレートエンジンにMixer2を使うとSeleniumでのテストもラクになるかもねという話
by
Y Watanabe
properties, yaml, and me
by
Y Watanabe
Seleniumと相性がいいテンプレートエンジンMixer2-第1回selenium勉強会ライトニングトーク
by
Y Watanabe
Java8移行から始めた技術的負債との戦い(jjug ccc 2015 fall)
by
sogdice
20140405 mavenセントラルリポジトリへの登録のコツ 第5回渋谷java
by
Y Watanabe
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
by
増田 亨
Similar to SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
PDF
ASP.NET MVC 2 ~新機能の紹介~
by
Yoshitaka Seo
PDF
[公開用]Netラボ2012年2月勉強会 asp.netmvc4 beta新機能の紹介
by
david9142
PDF
Mvc conf session_3_takehara
by
Hiroshi Okunushi
PDF
Mvc conf session_5_isami
by
Hiroshi Okunushi
PDF
現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについて
by
Nobukazu Hanada
PDF
2つの「Layout」プラグインでMovable Typeをパワーアップ
by
Hajime Fujimoto
PDF
Apache Tapestry
by
Akio Katayama
PDF
Concentrated HTML5 & Attractive HTML5
by
Sho Ito
PDF
jQuery/Html5/ASP.NET MVC 対応コンポーネントを用いたデバイス対応業務アプリケーション開発
by
Daizen Ikehara
PPT
Spring mvc
by
Ryo Asai
PDF
最新 ASP.NET Web 開発オーバービュー
by
Akira Inoue
PDF
Webデザイン入門2-HTML5 フォーム,映像再生,音声再生, CSS3, レスポンシブWebデザイン-
by
Yossy Taka
PDF
jQuery と MVC で実践する標準志向 Web 開発
by
Akira Inoue
PDF
Internet Explorer 9 の新機能「固定サイト」 (Pinned sites)
by
shigeya
PDF
Introduction to web development 1
by
hideaki honda
PDF
jQuery MobileとPhoneGapでスマートフォンアプリ楽々クッキング
by
Takashi Okamoto
PDF
Jqm20120804 publish
by
Takashi Okamoto
PPTX
Silverlightの今
by
信之 岩永
PDF
フロント作業の効率化
by
Yuto Yoshinari
PDF
Android0422
by
takahiko_takahashi
ASP.NET MVC 2 ~新機能の紹介~
by
Yoshitaka Seo
[公開用]Netラボ2012年2月勉強会 asp.netmvc4 beta新機能の紹介
by
david9142
Mvc conf session_3_takehara
by
Hiroshi Okunushi
Mvc conf session_5_isami
by
Hiroshi Okunushi
現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについて
by
Nobukazu Hanada
2つの「Layout」プラグインでMovable Typeをパワーアップ
by
Hajime Fujimoto
Apache Tapestry
by
Akio Katayama
Concentrated HTML5 & Attractive HTML5
by
Sho Ito
jQuery/Html5/ASP.NET MVC 対応コンポーネントを用いたデバイス対応業務アプリケーション開発
by
Daizen Ikehara
Spring mvc
by
Ryo Asai
最新 ASP.NET Web 開発オーバービュー
by
Akira Inoue
Webデザイン入門2-HTML5 フォーム,映像再生,音声再生, CSS3, レスポンシブWebデザイン-
by
Yossy Taka
jQuery と MVC で実践する標準志向 Web 開発
by
Akira Inoue
Internet Explorer 9 の新機能「固定サイト」 (Pinned sites)
by
shigeya
Introduction to web development 1
by
hideaki honda
jQuery MobileとPhoneGapでスマートフォンアプリ楽々クッキング
by
Takashi Okamoto
Jqm20120804 publish
by
Takashi Okamoto
Silverlightの今
by
信之 岩永
フロント作業の効率化
by
Yuto Yoshinari
Android0422
by
takahiko_takahashi
More from Y Watanabe
PDF
クラウド時代だからSpring-Retryフレームワーク
by
Y Watanabe
PDF
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
by
Y Watanabe
PDF
JavaでWebサービスを作り続けるための戦略と戦術 JJUG-CCC-2018-Spring-g1
by
Y Watanabe
PDF
サーバーサイドな人がフロントエンド技術と仲良くするはじめの一歩
by
Y Watanabe
PDF
Selenium再入門-W3C勧告とページオブジェクトパターンと私-201707webエンジニア勉強会#2神田
by
Y Watanabe
PDF
Webエンジニアがスタートダッシュをキメるためのローカル開発環境の勘所
by
Y Watanabe
クラウド時代だからSpring-Retryフレームワーク
by
Y Watanabe
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
by
Y Watanabe
JavaでWebサービスを作り続けるための戦略と戦術 JJUG-CCC-2018-Spring-g1
by
Y Watanabe
サーバーサイドな人がフロントエンド技術と仲良くするはじめの一歩
by
Y Watanabe
Selenium再入門-W3C勧告とページオブジェクトパターンと私-201707webエンジニア勉強会#2神田
by
Y Watanabe
Webエンジニアがスタートダッシュをキメるためのローカル開発環境の勘所
by
Y Watanabe
Recently uploaded
PDF
FY2025 IT Strategist Afternoon I Question-1 Balanced Scorecard
by
akipii ogaoga
PDF
Reiwa 7 IT Strategist Afternoon I Question-1 3C Analysis
by
akipii ogaoga
PDF
2025→2026宙畑ゆく年くる年レポート_100社を超える企業アンケート総まとめ!!_企業まとめ_1229_3版
by
sorabatake
PDF
PMBOK 7th Edition_Project Management Process_WF Type Development
by
akipii ogaoga
PDF
ST2024_PM1_2_Case_study_of_local_newspaper_company.pdf
by
akipii ogaoga
PDF
Reiwa 7 IT Strategist Afternoon I Question-1 Ansoff's Growth Vector
by
akipii ogaoga
PDF
自転車ユーザ参加型路面画像センシングによる点字ブロック検出における性能向上方法の模索 (20260123 SeMI研)
by
Yuto Matsuda
PDF
PMBOK 7th Edition Project Management Process Scrum
by
akipii ogaoga
PDF
第21回 Gen AI 勉強会「NotebookLMで60ページ超の スライドを作成してみた」
by
嶋 是一 (Yoshikazu SHIMA)
PDF
Starlink Direct-to-Cell (D2C) 技術の概要と将来の展望
by
CRI Japan, Inc.
PDF
PMBOK 7th Edition_Project Management Context Diagram
by
akipii ogaoga
PDF
100年後の知財業界-生成AIスライドアドリブプレゼン イーパテントYouTube配信
by
e-Patent Co., Ltd.
PDF
Team Topology Adaptive Organizational Design for Rapid Delivery of Valuable S...
by
akipii ogaoga
FY2025 IT Strategist Afternoon I Question-1 Balanced Scorecard
by
akipii ogaoga
Reiwa 7 IT Strategist Afternoon I Question-1 3C Analysis
by
akipii ogaoga
2025→2026宙畑ゆく年くる年レポート_100社を超える企業アンケート総まとめ!!_企業まとめ_1229_3版
by
sorabatake
PMBOK 7th Edition_Project Management Process_WF Type Development
by
akipii ogaoga
ST2024_PM1_2_Case_study_of_local_newspaper_company.pdf
by
akipii ogaoga
Reiwa 7 IT Strategist Afternoon I Question-1 Ansoff's Growth Vector
by
akipii ogaoga
自転車ユーザ参加型路面画像センシングによる点字ブロック検出における性能向上方法の模索 (20260123 SeMI研)
by
Yuto Matsuda
PMBOK 7th Edition Project Management Process Scrum
by
akipii ogaoga
第21回 Gen AI 勉強会「NotebookLMで60ページ超の スライドを作成してみた」
by
嶋 是一 (Yoshikazu SHIMA)
Starlink Direct-to-Cell (D2C) 技術の概要と将来の展望
by
CRI Japan, Inc.
PMBOK 7th Edition_Project Management Context Diagram
by
akipii ogaoga
100年後の知財業界-生成AIスライドアドリブプレゼン イーパテントYouTube配信
by
e-Patent Co., Ltd.
Team Topology Adaptive Organizational Design for Rapid Delivery of Valuable S...
by
akipii ogaoga
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
1.
SpringMVCとmixer2で作る
Webアプリのキホン Basic Web Application with SpringMVC & mixer2 Spring勉強会 by #JSUG at VMWare-Japan 2013-01-24
2.
プロローグ PROLOGUE
2
3.
クリスマスイブのとあるツイート
3
4.
MacBookじゃなくてスイマセン...
4
5.
なんかこのタイトルもダサく 思えてきた... SpringMVCとmixer2で作る
Webアプリのキホン
6.
とりあえずタイトル変えてみる!
7.
Webデザイナーさんと 仲良く仕事するための SpringMVCとmixer2
2013-01-24 Spring勉強会
8.
自己紹介
• わたなべ • SI屋の技術屋さん • @nabedge • nabedge@gmail.com • http://nabedge.blogspot.jp/ 8
9.
目次 1.
SpringMVC 2. テンプレートエンジン 3. Mixer2をHelloWorldで解説 4. Why mixer2 ? 5. SpringMVCとmixer2の組み合わせの勘所 6. コントローラとビューに対するテスト 7. Webアプリの分割開発 8. まとめ 9. FAQ 9
10.
1. Spring MVC
10
11.
SpringMVC • JavaでWebアプリをつくりためのMVCフレー
ムワーク。 • 生のサーブレット&JSPで作るより100倍作り やすい。 • 大昔のStrutsより10倍は学習しやすい • ライバルとしてはSeasarのSAStrutsとか。 • Spring3.Xになって以降はSAStrutsよりもさら に使いやすくなった! • 詳しくは「Spring3入門」を読みましょう。 11
12.
2. テンプレートエンジン
12
13.
テンプレートエンジン JSP:一番身近なテンプレートエンジン
こんにちは <% if (name == null) { %> ゲストさん <% } else { %> <%= name %>さん <% } %> 通常のJava言語、EL式、カスタムタグで書く 13
14.
テンプレートエンジン Velocity:Javaでは老舗のテンプレートエンジン
こんにちは #if (name == null) { ゲストさん #else ${name}さん #end VTL = Velocity Template Languageで書く 14
15.
テンプレートエンジン FreeMarker:最近人気のテンプレートエンジン
こんにちは <#if name?has_content> ${name}さん <#else> ゲストさん </#if> FTL = Freemarker Template Languageで書く 15
16.
テンプレートエンジン Mixer2:Webデザイナーと仲良く仕事するため のテンプレートエンジン テンプレートファイル(*.html)は純粋なXHTMLとCSS こんにちは
<span id=“name”>ななし</span>さん 値の埋め込みやロジックは普通のJavaで書く(*.java) String name = “ヤマダ”; Span span = html.getById(“name”, Span.class); span.getContent.clear(); span.getContent.add(name); // これで <span id=“name”>ヤマダ</span>さん // になる 16
17.
3. mixer2を HelloWorld(SpringMVC編)
で解説 http://mixer2.org/site/springmvcsample.html 17
18.
補足:タグとJava型 HTMLタグとJavaオブジェクトを相互マッピング <html>…</html> ⇔
org.mixer2.jaxb.xhtml.Html <div>…</div> ⇔ org.mixer2.jaxb.xhtml.Div (ほか全120種類くらいのタグすべてを実装済み) タグの属性はJavaオブジェクトのプロパティにマッピング。 setter/getterメソッドでアクセス <div id=“foo”>…</div> をテンプレートとしてロードすると String id = div.getId(); // これでidに”foo”が入る (html4/5のすべての属性を実装済み) 18
19.
補足:複数要素はListになる template.html
listの中身 <html> index 型 <body> 0 P <p>Hello World</p> foo 1 String <span>bar</span> </body> 2 Span </html> Html html = mixer2Engine java.util.List<Object> list .loadHtmlTemplate( = html.getBody() “template.html”); .getContent(); 19
20.
ちょっと一息
•水分補給 •時間を確認 10分か15分くらい? 20
21.
4. Why mixer2
? 21
22.
最大のメリット htmlモックアップを JSPに書き変えずに
そのまま使える 22
23.
デモ (フルーツショップサンプルアプリ編)
https://github.com/nabedge/mixer2- sample/tree/master/mixer2-fruitshop-springmvc 「github mixer2-fruitshop-springmvc」 でググるとすぐ見つかります。 23
24.
5. Mixer2とSpringMVCを 組み合わせる場合の勘所
24
25.
勘所 1. コントローラクラスの肥大化を防ぐ 2. aタグやimgタグの相対パスの書き換え 3.
<mvc:resources />で静的リソースを出 力 4. 上の2,3を生かすためのおススメディレ クトリ構造 25
26.
コントローラクラスの肥大化を防ぐ
26
27.
ふつうのコントローラとJSP 商品情報を表示するコントローラクラス @Controller
public class ItemController { @RequestMapping(value = "/item/{itemId}") public ModelAndView showItem(@PathVariable long itemId) { // DBから商品情報を取得 Item item = itemService.getItem(itemId); // modelAndViewにitemを詰めて返す retern new ModelAndView(“item.jsp”, “item”, item); } JSP <%@page pageEncoding="UTF-8"%> <html> <body> <span>商品名:${item.name}</span> </body> </html> 27
28.
コントローラの肥大化を防ぐ @RequestMapping(value = "/item/{itemId}") public
ModelAndView showItem(@PathVariable long itemId) { // DBから商品情報を取得 Item item = itemService.getItem(itemId); // テンプレートのロード String mainTemplate = "classpath:m2mockup/m2template/item.html" File file = ResourceUtils.getFile(mainTemplate); Html html = mixer2Engine.loadHtmlTemplate(file); このへんが肥大化 してしまう // 商品情報のdivタグ Div itemBox = html.getBody().getById("itemBox", Div.class); // 商品名を書き込む itemBox.getById("itemName", H1.class).getContent().clear(); itemBox.getById("itemName", H1.class).getContent().add(item.getName()); // 価格、説明、その他もろもろも... 28
29.
コントローラの肥大化を防ぐ @RequestMapping(value = "/item/{itemId}") public
ModelAndView showItem(@PathVariable long itemId) { // DBから商品情報を取得 Item item = itemService.getItem(itemId); // テンプレートのロード String mainTemplate = "classpath:m2mockup/m2template/item.html" File file = ResourceUtils.getFile(mainTemplate); Html html = mixer2Engine.loadHtmlTemplate(file); // 商品情報を埋め込む ItemHelper.replaceItemBox(html, item); …… ヘルパークラスに切り 出せば1行で済む 29
30.
コントローラの肥大化を防ぐ ヘルパーはごく単純なstaticメソッドでよい public class ItemHelper
{ テンプレのhtml DBから取得した商品情報 public static void replaceItemBox(Html html, Item item) { // 商品情報を入れるdivタグを取得 Div itemBox = html.getBody().getById("itemBox", Div.class); // divの中のH1やSpanの中にDBから取得した値を入れる itemBox.getById("itemName", H1.class).getContent().clear(); itemBox.getById("itemName", H1.class).getContent().add(item.getName()); itemBox.getById("itemPrice", Span.class).getContent().clear(); itemBox.getById("itemPrice", Span.class).getContent().add( item.getPrice().toString()); itemBox.getById("itemDescription", Div.class).getContent().clear(); itemBox.getById("itemDescription", Div.class).getContent().add( item.getDescription()); 30
31.
相対パスの書き換え 左上のロゴはトップページへ のリンク テンプレートファイルではこうなってるけど <a class=“topPageAnchor”
href="../m2template/index.html"> <img src="../m2static/img/fruitshop-logo.png" /> </a> 実際の出力ではこうしなきゃならない <a class=“topPageAnchor” href=“/[contextPath]/"> <img src="/[contextPath]/m2static/img/fruitshop-logo.png" /> </a> 31
32.
相対パスの書き換え “topPageAnchor”というclass属性を持つすべてのaタグのhref属 性を書き変える String ctx =
"xxx"; // コンテキストパスを取得しておく for (A a : html.getDescendants("topPageAnchor", A.class)) { a.setHref(ctx + "/"); } Mixer2ではすべてのタグ型が下記のメソッドを持っている • getDescendants()メソッド:該当するすべての子孫タグをList で取得 • getById()メソッド:id属性でタグを1個だけ取得 • 他にもreplace系とかremove系のメソッドもあります。 32
33.
相対パスの書き換え Imgタグのsrc属性、styleタグのhref属性なども同様 // <img src=""
/> for (Img img : tagObj.getDescendants(Img.class)) { if (img.isSetSrc()) { String src = img.getSrc(); img.setSrc(convertPath(src)); } } convertPathメソッドは、 ../m2static/ のような文字列を /[contextPath]/m2static/ に置換している 33
34.
<mvc:resources />で 静的リソースを出力
34
35.
Java/Webアプリでの静的ファイルの配置 http://localhost:8080/[contextPath]/foo/bar.png src
└─main 普通ならdocroot配下に置く。 ├─java さもないとブラウザからアク ├─resources セス不可能 └─webapp └─foo └─bar.png ※maven標準ディレクトリ構造です 35
36.
Java/Webアプリでの静的ファイルの配置 src └─main
├─java ├─resources │ │ applicationContext.xml │ │ │ └─m2mockup テンプレートhtmlと画像 │ ├─m2static │ │ └─img やCSSをまとめて │ │ logo.png resources配下に置く。 │ │ クラスパス上に置くほう │ └─m2template が、Javaコードから扱い │ index.html やすいから! │ item.html │ └─webapp 36
37.
DispatcherServletのstatic resource機能 •
Spring3.X以降、DispatcherServletは、http リクエストをコントローラクラスに中継する機 能だけでなく、静的リソースを直接レスポンス する機能がある 37
38.
Java/Webアプリでの静的ファイルの配置 src/main/resources/mvc-dispatcher-servlet.xml の抜粋
<mvc:resources mapping="/m2static/**" location="classpath:/m2mockup/m2static/" cache-period="60" /> 1. http://.../contextPath/m2static/** というURLへの アクセスに対して 2. クラスパスから /m2mockup/m2static/** というリ ソースを探してそれを返す 3. そのとき Cache-Control: max-age=60 のような httpレスポンスヘッダつきで返す 38
39.
ただし、注意しないと、、、! 1. こういうディレクトリ構造で
2. こういう設定をしてしまうと src <mvc:resources └─main mapping= ├─java ├─resources "/m2mockup/**" │ └─m2mockup location= │ ├─img "classpath:/m2mockup/"/> │ │ logo.png │ └─item.html └─webapp 3. 画像やCSSだけでなく、テンプレートhtmlにもそのままアクセス できてしまう!(もちろんまずい) http://…/[ContextPath]/m2mockup/img/logo.png http://…/[ContextPath]/m2mockup/item.html 39
40.
だから、これがオススメ構造 src └─main
├─java m2mockup配下にモック ├─resources アップhtmlを作る │ │ applicationContext.xml │ │ │ └─m2mockup 画像やCSSはm2static配下に │ ├─m2static 置いて、 <mvc:resources /> │ │ └─img │ │ logo.png の設定での出力対象にする │ │ │ └─m2template │ index.html │ item.html │ └─webapp htmlテンプレートは m2template配下に 40
41.
これでデザイナとプログラマが仲良く仕事できる!
プログラマとデザイナの取り決め事項 1. htmlモックアップは src/main/resources/m2mockup の下に作 ろうぜ。 2. ただし*.htmlはm2template,それ以外は m2staticの配下でたのむ。 3. 商品情報のdivタグはid=“itemBox”にしよう。 4. 商品名はspanタグでid=“itemName” 5. …..その他の情報も同様にclass属性やid属性を決 めておけばよい。 41
42.
もちろん 「htmlをjspに書き変える」 という退屈な作業は不要
42
43.
6. コントローラとビューに対するテスト
43
44.
ざっくりした流れ 1. JunitコードのランナーとしてSpringJUnit4ClassRunner を
使えば、DIコンテナが勝手にいい感じで起動してくれる。 2. HttpServletRequest, HttpServletResponseのモックをイン スタンス化する 3. モックのrequestにテスト対象のURIやパラメータをセット 4. そのrequestオブジェクトをリクエストハンドラに渡すと疑似 リクエストが発生し、コントローラクラスに渡される。 5. コントローラの該当メソッドが戻り値として返す ModelAndViewオブジェクトにhtmlStringが入っている。 6. このhtmlStringの中をMixer2Engineで再度Htmlオブジェク ト化する 7. Htmlオブジェクトの中をAssertすればよい。 44
45.
実際のテストコードで説明します https://github.com/nabedge/mixer2- sample/blob/master/mixer2-fruitshop-
springmvc/src/test/java/org/mixer2/samp le/web/controller/ItemControllerTest.java 45
46.
最後の給水
•水分補給 •時間を確認 40分くらい? 46
47.
Webアプリの分割開発
47
48.
普通のWebアプリプロジェクト(maven形式)
Javaクラス以外は src/main/webapp 静的ファイル このへん Javaクラスとか このへん JSPとか このへん 48
49.
普通のWebアプリを分割開発するときのカベ 1. Javaクラスや、その設定ファイル
(*.properties,*.xml,*.sql)は別プロジェクト化 してjar化してWebアプリ側から依存関係を つくればいい。 – つまり、Javaライブラリは分割開発可能 2. しかし、src/main/webapp 配下に置くような JSP,静的リソース、設定ファイル類(MVCで 言うとViewの周辺)は、プロジェクト分割& 別パッケージ化が難しい。 49
50.
Mixer2を使うと 1. Mixer2は、Viewを普通のjavaコードで取
扱う。 2. そのテンプレートもJavaコードから見ると ただのリソースファイルとして扱える。 3. よって、普通のJavaライブラリ同様に分割 が可能。 50
51.
デモ • デモでお見せします。 プロジェクト間依存関係はこんな感
じ m2flowershop-web(.war) m2flowershop-front(.jar) m2flowershop-cart(.jar) m2flowershop-resource(.jar) 51
52.
後日談 • ※結局、当日までにサンプルのコーディング
が間に合わなかったのでこのデモはやってま せん。(^^; 52
53.
7. まとめ
53
54.
まとめ • SpringMVCはシンプルで使いやすいフレームワーク • mixer2とSpringMVCは良いコンビ •
ディレクトリ構造を考えたうえでSpringMVCの静的リ ソース出力機能と組み合わせれば、htmlモックアップ をjspに書き変える作業は不要 • jspでは難しい、ビューに対するテストの自動化も可 能 • htmlテンプレートファイルと静的ファイル(ex.画像)と Javaクラスをjarパッケージ化できるので、Webアプリ の分割開発すら可能。 54
55.
FAQ • Q. モックアップHTMLはクラスパス上に置かなきゃダメですか?
– A. Mixer2EngineのloadHtmlTemplateメソッドはjava.io.File, String, StringBufferのいずれかでテンプレートhtmlを読めます。したがってOSのファイ ルシステム上でもDB上でもどこでもOKです。 – ※後日談:ver1.1.14 以降、InputStreamからも読めるようになりました。 • Q. WEB-INF/view/mixer2view.jsp を通じて結局jspを使っているのはダ サくないですか? – A. 実はその通りです。本来は、コントローラのメソッドの戻り値としてHtmlオブ ジェクトを返すだけで済むようなViewResolverを実装するべきです。誰か作っ て!(Pull Request熱烈歓迎!) • Q. mixer2を使う場合はJSPは完全に排除しなきゃだめですか?既存の taglibも使いたいのですが? – A. 可能です。たとえば、 *.htmlで用意したテンプレートを読み込んで、その一部 のタグだけを部分マーシャルし、jsp上に埋め込むことも可能です。 55
56.
ご静聴ありがとうございました
56
Download