SlideShare une entreprise Scribd logo
1  sur  61
Télécharger pour lire hors ligne
Scala EE 7 Essentials 
@tnoda_ 
第1 回Scala 関西勉強会 
[2014-12-13 Sat]
Disclaimer 
このプレゼンテーションの内容は私自身の見解であり、必ずしも私 
の所属組織・所属団体の立場、戦略、意見を代表するものではあり 
ません。 
以下の事項は,Scala によるJava EE 7 開発の一般的な方向性に関 
する概要を説明するものです.また,情報提供を唯一の目的とする 
ものであり,いかなる契約にも組み込むことはできません.以下の 
事項は,マテリアルやコード,機能を提供するコミットメント(確 
約)するものではないため,購買決定を行う際の判断材料になさら 
ないで下さい. 
文中の社名,商品名は各社の商標または登録商標である場合があり 
ます.
Why Scala?
Why Scala? !"
Goodies 
• 型システム 
• イミュータブルな値・コレクション 
• 式 
• パターンマッチ 
• . . . 
間違いの少ないプログラムを比較的少ない労力で書ける.
[エンタープライズ開発] で検索 
(このスライドは削除されました)
Scala for Enterprise 
(このスライドは削除されました)
Java EE 7 Overview 
!"# 
$%&'(")*+ 
,-. 
/01 
/2$3/20345 
/16782 
/167!2 
/29: 
!"#3 
2;<="* 
2"%>?"*+ 
,-. 
4@*")+A;)+ 
.)*"%<"B*;%+C 
/D1 
,;((;)3 
1));*&*A;)+ 
,;)<E%%")<F3 
G*A?A*A"+ 
H&)&'"I3J"&)+ 4)*"%B%A+"3/&>&J"&)+ 
/H2 /,1 J&*<K 
!"#$ 
%#&'(#')*$
WildFly
想定出席者
想定出席者 
Scala 中・上級者 
Scala アプリケーションを開発できる.
想定出席者 
Scala 中・上級者 
Scala アプリケーションを開発できる. 
Java EE 7 開発者 
Java でJava EE 7 アプリケーションを開発できる.
想定出席者 
Scala 中・上級者 
Scala アプリケーションを開発できる. 
Java EE 7 開発者 
Java でJava EE 7 アプリケーションを開発できる. 
勇者 
上のどちらにもあてはまらない人
想定出席者 
Scala 中・上級者 
Scala アプリケーションを開発できる. 
Java EE 7 開発者 
Java でJava EE 7 アプリケーションを開発できる. 
勇者 
上のどちらにもあてはまらない人 
目標 
Java EE 7 アプリ開発のお仕事を,ついうっかりScala で書ける 
ようになる.
Outline 
本日お話ししたいこと 
• Build tools 
• Servlet 
• JAX-RS + JAXB 
本日お話ししないこと 
• CDI + JPA 
• JMS, JSF, and other specs. 
• javax.enterprise.cuncurrent 
• Testing (Arquillian)
Build tools 
SBT 
• .war ファイルにやさしくない 
Gradle 
• .war ファイルにやさしい(公式war プラグイン) 
• SBT とソースコードのディレクトリ構成は共通 
$ gradle war #=> .war
build.gradle 
plugins { 
id ’scala ’ 
id ’war ’ 
} 
war. dependsOn compileScala 
repositories { 
mavenCentral () 
} 
// Incremental compilation using Zinc 
tasks . withType ( ScalaCompile ) { 
scalaCompileOptions . useAnt = false 
} 
dependencies { 
compile ’org.scala - lang :scala - library :2.11.4 ’ 
providedCompile ’javax :javaee - api :7.0 ’ 
}
Plugins - build.gradle 
Example (plugins) 
plugins { 
id 'scala' 
id 'war' 
} 
追加されるタスク 
• scala . . . compileScala など 
• war . . . war など
Maven Central - build.gradle 
Example (repositories) 
repositories { 
mavenCentral() 
}
Incremental Build - build.gradle 
Example (ScalaCompile) 
tasks.withType(ScalaCompile) { 
scalaCompileOptions.useAnt = false 
} 
useAnt = false 
SBT と同じくZinc によるインクリメンタルなコンパイル
Dependencies - build.gradle 
Example (dependencies) 
dependencies { 
compile 'org.scala-lang:scala-library:2.11.4' 
providedCompile 'javax:javaee-api:7.0' 
} 
providedCompile 
作成される.war ファイルには含まれない.
SBT 
Example (build.sbt) 
libraryDependencies += "javax" % "javaee-api" % "7.0"
(再)build.gradle 
plugins { 
id ’scala ’ 
id ’war ’ 
} 
war. dependsOn compileScala 
repositories { 
mavenCentral () 
} 
tasks . withType ( ScalaCompile ) { 
scalaCompileOptions . useAnt = false 
} 
dependencies { 
compile ’org.scala - lang :scala - library :2.11.4 ’ 
providedCompile ’javax :javaee - api :7.0 ’ 
}
Checkpoint 1
Checkpoint 1 
Scala の勉強会に来てJava EE 7 の話を聞きに来ていた 
と思ったらGradle の話を聞いていた.
Checkpoint 1 
Scala の勉強会に来てJava EE 7 の話を聞きに来ていた 
と思ったらGradle の話を聞いていた. 
Gradle 
• プラグインの利用 
• scala, war 
• 依存関係の解決 
• task . . . dependsOn 
• library . . . providedCompile
Checkpoint 1 
Scala の勉強会に来てJava EE 7 の話を聞きに来ていた 
と思ったらGradle の話を聞いていた. 
Gradle 
• プラグインの利用 
• scala, war 
• 依存関係の解決 
• task . . . dependsOn 
• library . . . providedCompile 
SBT 
libraryDependencies += "javax" % "javaee-api" % "7.0"
Servlet とは 
上級者向けの説明
Servlet とは 
上級者向けの説明 
JSR 340 (Servlet 3.1)
Servlet とは 
上級者向けの説明 
JSR 340 (Servlet 3.1) 
j.s.h.HttpServlet を継承したクラス 
• コントローラのような何か 
• doXXX (XXX = Get, Post, . . . ) をオーバーライド
Servlet とは 
上級者向けの説明 
JSR 340 (Servlet 3.1) 
j.s.h.HttpServlet を継承したクラス 
• コントローラのような何か 
• doXXX (XXX = Get, Post, . . . ) をオーバーライド 
ルーティングなどの設定 
• XML (web.xml) 
• アノテーション 
• 動的(ServletContext.addServlet)
HelloWorldServlet.scala 
package com. example 
import javax . servlet . annotation ._ 
import javax . servlet . http ._ 
@ WebServlet ( name = " HelloWorldServlet ", 
urlPatterns = Array ("/ plain "), 
initParams = Array ( new WebInitParam ( name = " 
type ", value = " checking " ))) 
class HelloWorldServlet extends HttpServlet { 
override def doGet ( req: HttpServletRequest , res: 
HttpServletResponse ): Unit = { 
res. setContentType (" text / plain ") 
val out = res. getWriter 
out. println (" Hello␣Scala␣KB␣#1") 
} 
}
@WebServlet 
Scala 
@ WebServlet ( name = " HelloWorldServlet ", 
urlPatterns = Array ("/ plain "), 
initParams = Array ( new WebInitParam ( name = " 
type ", value = " checking "))) 
Java
@WebServlet 
Scala 
@ WebServlet ( name = " HelloWorldServlet ", 
urlPatterns = Array ("/ plain "), 
initParams = Array ( new WebInitParam ( name = " 
type ", value = " checking "))) 
Java 
@WebServlet ( name =" HelloWorldServlet ", 
urlPatterns = {"/ plain "}, 
initParams = { @WebInitParam ( name = " type ", 
value = " checking ")})
Java アノテーションの書き方 
基本形 
@Example 
パラメータ(elements) 
@Example("FOO") 
@Example(foo = "FOO", bar = "Bar") 
配列 
@Example(name = {"John", "Smith"}) 
これは,String の配列を指定しているのと同じ
Scala アノテーションの注意点(1/2) 
配列を要求する場合 
Java 
@Example(name = {"John", "Smith"}) 
この書き方はScala ではエラーになる. 
Scala
Scala アノテーションの注意点(1/2) 
配列を要求する場合 
Java 
@Example(name = {"John", "Smith"}) 
この書き方はScala ではエラーになる. 
Scala 
@Example(name = Array("John", "Smith"))
Scala アノテーションの注意点(2/2) 
ネストしたアノテーション 
Java 
@Outer(@Inner("valid")) 
この書き方はScala ではエラーになる. 
Scala 
ネストした内側のアノテーションは@ で書けない.
Scala アノテーションの注意点(2/2) 
ネストしたアノテーション 
Java 
@Outer(@Inner("valid")) 
この書き方はScala ではエラーになる. 
Scala 
ネストした内側のアノテーションは@ で書けない. 
@Outer(new Inner("valid")) 
アノテーションがJVM のクラスであることを思い出す.
HelloWorldServlet ふたたび 
package com. example 
import javax . servlet . annotation ._ 
import javax . servlet . http ._ 
@ WebServlet ( name = " HelloWorldServlet ", 
urlPatterns = Array ("/ plain "), 
initParams = Array ( new WebInitParam ( name = " 
type ", value = " checking " ))) 
class HelloWorldServlet extends HttpServlet { 
override def doGet ( req: HttpServletRequest , res: 
HttpServletResponse ): Unit = { 
res. setContentType (" text / plain ") 
val out = res. getWriter 
out. println (" Hello␣Scala␣KB␣#1") 
} 
}
Servlet 周辺 
• フィルタ(@WebFilter) 
• イベントリスナ(@WebListener) 
• 非同期(@WebServlet(asyncSupported=true)) 
• セキュリティ(@ServletSecurity) 
• マルチパートリクエスト(@MultipartConfig) 
これまでに説明したアノテーションで書ける.
Servlet のライフサイクル 
!" 
!"!#$% 
&'()!*'$% 
+'&#(,-$% 
# 
+,.'#$% 
+,/,&#$% 
+,/0#$%
Servlet の初期化 
Example (Java) 
MyState state = null 
@Override 
public void init ( ServletConfig config ) throws 
ServletException { 
state = doTimeConsumingInitProcess ( config ); 
// ... 
}
init() とScala との相性の悪さ 
サーブレットのinit() は状態を変更する.
init() とScala との相性の悪さ 
サーブレットのinit() は状態を変更する. 
var フィールド 
Scalastyle に怒られる.
init() とScala との相性の悪さ 
サーブレットのinit() は状態を変更する. 
var フィールド 
Scalastyle に怒られる. 
lazy val + mutable なオブジェクト 
Immutable ではないが,比較的軽微.
init() サンプルコード 
var 
class MutableServlet extends HttpServlet { 
var state : MyState = null 
override def init ( config : ServletConfig ): Unit = { 
state = MyState . doTimeConsumingInitProcess ( config ) 
// ... 
} 
} 
lazy val 
class ImmutableServlet extends HttpServlet { 
lazy val state = new MyState () 
override def init ( config : ServletConfig ): Unit = { 
state . doTimeConsumingInitProcess ( config ) 
// ... 
} 
}
Checkpoint 2
Checkpoint 2 
サーブレットの話を聞いていたと思っていたら,いつの 
まにかアノテーションの話を聞いていた.
Checkpoint 2 
サーブレットの話を聞いていたと思っていたら,いつの 
まにかアノテーションの話を聞いていた. 
アノテーション 
• 配列{ ... } 記法に注意 
• ネストしたアノテーションに注意
Checkpoint 2 
サーブレットの話を聞いていたと思っていたら,いつの 
まにかアノテーションの話を聞いていた. 
アノテーション 
• 配列{ ... } 記法に注意 
• ネストしたアノテーションに注意 
init() 問題 
• lazy val + ミュータブルなオブジェクトで対処
JAX-RS とは 
(中略)
おわりに 
Scala でJava EE 7 開発をする際のテクニック
おわりに 
Scala でJava EE 7 開発をする際のテクニック 
Gradle 
• scala, war プラグイン
おわりに 
Scala でJava EE 7 開発をする際のテクニック 
Gradle 
• scala, war プラグイン 
アノテーション 
• 配列記法, ネストしたアノテーション
おわりに 
Scala でJava EE 7 開発をする際のテクニック 
Gradle 
• scala, war プラグイン 
アノテーション 
• 配列記法, ネストしたアノテーション 
引数なしコンストラクタ 
• def this() { . . . }
おわりに 
Scala でJava EE 7 開発をする際のテクニック 
Gradle 
• scala, war プラグイン 
アノテーション 
• 配列記法, ネストしたアノテーション 
引数なしコンストラクタ 
• def this() { . . . } 
@BeanProperty 
• getFoo, setFoo(x)
結論 
Scala でJava EE 7 を書ける?
結論 
Scala でJava EE 7 を書ける? 
Scala を書ければJava EE 7 を書ける.
結論 
Scala でJava EE 7 を書ける? 
Scala を書ければJava EE 7 を書ける. 
利点
結論 
Scala でJava EE 7 を書ける? 
Scala を書ければJava EE 7 を書ける. 
利点 
ビジネスロジック(Scala) とサービスマッピング(Java 
Annotations) との分離

Contenu connexe

Tendances

Ruby on Rails 4.0 勉強会資料
Ruby on Rails 4.0 勉強会資料Ruby on Rails 4.0 勉強会資料
Ruby on Rails 4.0 勉強会資料techscore
 
MySQL57 Update@OSC Fukuoka 20151003
MySQL57 Update@OSC Fukuoka 20151003MySQL57 Update@OSC Fukuoka 20151003
MySQL57 Update@OSC Fukuoka 20151003Shinya Sugiyama
 
ActionScriptを使わないFlash勉強会 #1(前日版)
ActionScriptを使わないFlash勉強会 #1(前日版)ActionScriptを使わないFlash勉強会 #1(前日版)
ActionScriptを使わないFlash勉強会 #1(前日版)libpanda
 
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
Java8 コーディングベストプラクティス and NetBeansのメモリログから...Java8 コーディングベストプラクティス and NetBeansのメモリログから...
Java8 コーディングベストプラクティス and NetBeansのメモリログから...なおき きしだ
 
JDK 13 New Features [MeetUp with Java Experts! @Gaienmae/Dojima 2019]
JDK 13 New Features [MeetUp with Java Experts! @Gaienmae/Dojima 2019]JDK 13 New Features [MeetUp with Java Experts! @Gaienmae/Dojima 2019]
JDK 13 New Features [MeetUp with Java Experts! @Gaienmae/Dojima 2019]David Buck
 
Sns suite presentation
Sns suite presentationSns suite presentation
Sns suite presentationJason Namkung
 
ジェネリクスの基礎と クラス設計への応用
ジェネリクスの基礎とクラス設計への応用ジェネリクスの基礎とクラス設計への応用
ジェネリクスの基礎と クラス設計への応用nagise
 
DoActionからJava VMバイトコードに変換する話
DoActionからJava VMバイトコードに変換する話DoActionからJava VMバイトコードに変換する話
DoActionからJava VMバイトコードに変換する話emorins
 
はまる!JPA(初学者向けライト版)
はまる!JPA(初学者向けライト版)はまる!JPA(初学者向けライト版)
はまる!JPA(初学者向けライト版)Masatoshi Tada
 
20140518 JJUG MySQL Clsuter as NoSQL
20140518 JJUG MySQL Clsuter as NoSQL20140518 JJUG MySQL Clsuter as NoSQL
20140518 JJUG MySQL Clsuter as NoSQLRyusuke Kajiyama
 
社内Java8勉強会 ラムダ式とストリームAPI
社内Java8勉強会 ラムダ式とストリームAPI社内Java8勉強会 ラムダ式とストリームAPI
社内Java8勉強会 ラムダ式とストリームAPIAkihiro Ikezoe
 
10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!bitter_fox
 
はじめてのJPA
はじめてのJPAはじめてのJPA
はじめてのJPAkawaba
 
初心者エンジニアの システム構築 失敗談
初心者エンジニアの システム構築 失敗談初心者エンジニアの システム構築 失敗談
初心者エンジニアの システム構築 失敗談Makoto Haruyama
 
20130611 java concurrencyinpracticech7
20130611 java concurrencyinpracticech720130611 java concurrencyinpracticech7
20130611 java concurrencyinpracticech7Toshiaki Toyama
 
My sql casual_in_fukuoka_vol1
My sql casual_in_fukuoka_vol1My sql casual_in_fukuoka_vol1
My sql casual_in_fukuoka_vol1Makoto Haruyama
 
初心者エンジニアのシステム構築失敗談
初心者エンジニアのシステム構築失敗談初心者エンジニアのシステム構築失敗談
初心者エンジニアのシステム構築失敗談Makoto Haruyama
 
SQLQL とは!?
SQLQL とは!?SQLQL とは!?
SQLQL とは!?yancya
 
Laravel勉強会(データベーステスト編)
Laravel勉強会(データベーステスト編)Laravel勉強会(データベーステスト編)
Laravel勉強会(データベーステスト編)AyakaNishiyama
 

Tendances (20)

Java EE8 Report
Java EE8 ReportJava EE8 Report
Java EE8 Report
 
Ruby on Rails 4.0 勉強会資料
Ruby on Rails 4.0 勉強会資料Ruby on Rails 4.0 勉強会資料
Ruby on Rails 4.0 勉強会資料
 
MySQL57 Update@OSC Fukuoka 20151003
MySQL57 Update@OSC Fukuoka 20151003MySQL57 Update@OSC Fukuoka 20151003
MySQL57 Update@OSC Fukuoka 20151003
 
ActionScriptを使わないFlash勉強会 #1(前日版)
ActionScriptを使わないFlash勉強会 #1(前日版)ActionScriptを使わないFlash勉強会 #1(前日版)
ActionScriptを使わないFlash勉強会 #1(前日版)
 
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
Java8 コーディングベストプラクティス and NetBeansのメモリログから...Java8 コーディングベストプラクティス and NetBeansのメモリログから...
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
 
JDK 13 New Features [MeetUp with Java Experts! @Gaienmae/Dojima 2019]
JDK 13 New Features [MeetUp with Java Experts! @Gaienmae/Dojima 2019]JDK 13 New Features [MeetUp with Java Experts! @Gaienmae/Dojima 2019]
JDK 13 New Features [MeetUp with Java Experts! @Gaienmae/Dojima 2019]
 
Sns suite presentation
Sns suite presentationSns suite presentation
Sns suite presentation
 
ジェネリクスの基礎と クラス設計への応用
ジェネリクスの基礎とクラス設計への応用ジェネリクスの基礎とクラス設計への応用
ジェネリクスの基礎と クラス設計への応用
 
DoActionからJava VMバイトコードに変換する話
DoActionからJava VMバイトコードに変換する話DoActionからJava VMバイトコードに変換する話
DoActionからJava VMバイトコードに変換する話
 
はまる!JPA(初学者向けライト版)
はまる!JPA(初学者向けライト版)はまる!JPA(初学者向けライト版)
はまる!JPA(初学者向けライト版)
 
20140518 JJUG MySQL Clsuter as NoSQL
20140518 JJUG MySQL Clsuter as NoSQL20140518 JJUG MySQL Clsuter as NoSQL
20140518 JJUG MySQL Clsuter as NoSQL
 
社内Java8勉強会 ラムダ式とストリームAPI
社内Java8勉強会 ラムダ式とストリームAPI社内Java8勉強会 ラムダ式とストリームAPI
社内Java8勉強会 ラムダ式とストリームAPI
 
10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!
 
はじめてのJPA
はじめてのJPAはじめてのJPA
はじめてのJPA
 
初心者エンジニアの システム構築 失敗談
初心者エンジニアの システム構築 失敗談初心者エンジニアの システム構築 失敗談
初心者エンジニアの システム構築 失敗談
 
20130611 java concurrencyinpracticech7
20130611 java concurrencyinpracticech720130611 java concurrencyinpracticech7
20130611 java concurrencyinpracticech7
 
My sql casual_in_fukuoka_vol1
My sql casual_in_fukuoka_vol1My sql casual_in_fukuoka_vol1
My sql casual_in_fukuoka_vol1
 
初心者エンジニアのシステム構築失敗談
初心者エンジニアのシステム構築失敗談初心者エンジニアのシステム構築失敗談
初心者エンジニアのシステム構築失敗談
 
SQLQL とは!?
SQLQL とは!?SQLQL とは!?
SQLQL とは!?
 
Laravel勉強会(データベーステスト編)
Laravel勉強会(データベーステスト編)Laravel勉強会(データベーステスト編)
Laravel勉強会(データベーステスト編)
 

En vedette

Enterprise APIs With Ease - Scala Developers of Barcelona
Enterprise APIs With Ease - Scala Developers of BarcelonaEnterprise APIs With Ease - Scala Developers of Barcelona
Enterprise APIs With Ease - Scala Developers of BarcelonaJason Swartz
 
Netflix Meetup in Kyoto 参加報告
Netflix Meetup in Kyoto 参加報告Netflix Meetup in Kyoto 参加報告
Netflix Meetup in Kyoto 参加報告tnoda
 
The effective use of blogs in economics education
The effective use of blogs in economics educationThe effective use of blogs in economics education
The effective use of blogs in economics educationcfbloke
 
Exposição dos trabalhos
Exposição dos trabalhosExposição dos trabalhos
Exposição dos trabalhosNancihorta
 
Image and Music: Processing plus Pure Data with libpd library
Image and Music: Processing plus Pure Data with libpd libraryImage and Music: Processing plus Pure Data with libpd library
Image and Music: Processing plus Pure Data with libpd libraryPETER KIRN
 
Social Media for Education
Social Media for EducationSocial Media for Education
Social Media for Educationcfbloke
 
Gentileza gera gentileza
Gentileza  gera  gentilezaGentileza  gera  gentileza
Gentileza gera gentilezaNancihorta
 
Your Mom Has an iPad
Your Mom Has an iPadYour Mom Has an iPad
Your Mom Has an iPadEffectiveUI
 
Condições da terra que permitem a existência da vida
Condições da terra que permitem a existência da vidaCondições da terra que permitem a existência da vida
Condições da terra que permitem a existência da vidacn2012
 
A célula
A célulaA célula
A célulaCatir
 
Fluxo de energia
Fluxo de energiaFluxo de energia
Fluxo de energiaCatir
 
Factores Abióticos - Temperatura
Factores Abióticos - TemperaturaFactores Abióticos - Temperatura
Factores Abióticos - TemperaturaCatir
 
4 ecossistemas
4 ecossistemas4 ecossistemas
4 ecossistemasCatir
 
Factores Abióticos - Luz
Factores Abióticos - LuzFactores Abióticos - Luz
Factores Abióticos - LuzCatir
 
Factores Abióticos - Água
Factores Abióticos - ÁguaFactores Abióticos - Água
Factores Abióticos - ÁguaCatir
 
A terra como um sistema
A terra como um sistemaA terra como um sistema
A terra como um sistemahugo dias
 
Ecossistemas - fatores abióticos
Ecossistemas - fatores abióticosEcossistemas - fatores abióticos
Ecossistemas - fatores abióticosmariacarmoteixeira
 
Factores Bióticos
Factores BióticosFactores Bióticos
Factores BióticosCatir
 

En vedette (20)

Enterprise APIs With Ease - Scala Developers of Barcelona
Enterprise APIs With Ease - Scala Developers of BarcelonaEnterprise APIs With Ease - Scala Developers of Barcelona
Enterprise APIs With Ease - Scala Developers of Barcelona
 
Netflix Meetup in Kyoto 参加報告
Netflix Meetup in Kyoto 参加報告Netflix Meetup in Kyoto 参加報告
Netflix Meetup in Kyoto 参加報告
 
The effective use of blogs in economics education
The effective use of blogs in economics educationThe effective use of blogs in economics education
The effective use of blogs in economics education
 
Exposição dos trabalhos
Exposição dos trabalhosExposição dos trabalhos
Exposição dos trabalhos
 
Image and Music: Processing plus Pure Data with libpd library
Image and Music: Processing plus Pure Data with libpd libraryImage and Music: Processing plus Pure Data with libpd library
Image and Music: Processing plus Pure Data with libpd library
 
Poses dinamicas
Poses dinamicasPoses dinamicas
Poses dinamicas
 
Social Media for Education
Social Media for EducationSocial Media for Education
Social Media for Education
 
Gentileza gera gentileza
Gentileza  gera  gentilezaGentileza  gera  gentileza
Gentileza gera gentileza
 
Your Mom Has an iPad
Your Mom Has an iPadYour Mom Has an iPad
Your Mom Has an iPad
 
Condições da terra que permitem a existência da vida
Condições da terra que permitem a existência da vidaCondições da terra que permitem a existência da vida
Condições da terra que permitem a existência da vida
 
A célula
A célulaA célula
A célula
 
Fluxo de energia
Fluxo de energiaFluxo de energia
Fluxo de energia
 
Factores Abióticos - Temperatura
Factores Abióticos - TemperaturaFactores Abióticos - Temperatura
Factores Abióticos - Temperatura
 
4 ecossistemas
4 ecossistemas4 ecossistemas
4 ecossistemas
 
Factores Abióticos - Luz
Factores Abióticos - LuzFactores Abióticos - Luz
Factores Abióticos - Luz
 
Factores Abióticos - Água
Factores Abióticos - ÁguaFactores Abióticos - Água
Factores Abióticos - Água
 
A terra como um sistema
A terra como um sistemaA terra como um sistema
A terra como um sistema
 
Ecossistemas - fatores abióticos
Ecossistemas - fatores abióticosEcossistemas - fatores abióticos
Ecossistemas - fatores abióticos
 
Factores Bióticos
Factores BióticosFactores Bióticos
Factores Bióticos
 
A célula
A célulaA célula
A célula
 

Similaire à Scala EE 7 Essentials

イマドキの現場で使えるJavaライブラリ事情
イマドキの現場で使えるJavaライブラリ事情イマドキの現場で使えるJavaライブラリ事情
イマドキの現場で使えるJavaライブラリ事情takezoe
 
Java8から17へ
Java8から17へJava8から17へ
Java8から17へonozaty
 
Play framework 2.0のちょっとした紹介
Play framework 2.0のちょっとした紹介Play framework 2.0のちょっとした紹介
Play framework 2.0のちょっとした紹介Ryo RKTM
 
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜JustSystems Corporation
 
Java ee6 with scala
Java ee6 with scalaJava ee6 with scala
Java ee6 with scalaSatoshi Kubo
 
R5 3 type annotation
R5 3 type annotationR5 3 type annotation
R5 3 type annotationEIICHI KIMURA
 
JavaOne2015報告会 Java EE アップデート #j1jp
JavaOne2015報告会 Java EE アップデート #j1jpJavaOne2015報告会 Java EE アップデート #j1jp
JavaOne2015報告会 Java EE アップデート #j1jpNorito Agetsuma
 
[Japanese] Skinny Framework で始める Scala #jjug_ccc #ccc_r24
[Japanese] Skinny Framework で始める Scala #jjug_ccc #ccc_r24[Japanese] Skinny Framework で始める Scala #jjug_ccc #ccc_r24
[Japanese] Skinny Framework で始める Scala #jjug_ccc #ccc_r24Kazuhiro Sera
 
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」yoshiaki iwanaga
 
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansaiJavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansaiTomohiro Kumagai
 
形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta
形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta
形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfestay_taka_23
 
Beginners Scala in FAN 20121009
Beginners Scala in FAN 20121009Beginners Scala in FAN 20121009
Beginners Scala in FAN 20121009Taisuke Shiratori
 

Similaire à Scala EE 7 Essentials (20)

Scala2.8への移行
Scala2.8への移行Scala2.8への移行
Scala2.8への移行
 
イマドキの現場で使えるJavaライブラリ事情
イマドキの現場で使えるJavaライブラリ事情イマドキの現場で使えるJavaライブラリ事情
イマドキの現場で使えるJavaライブラリ事情
 
ATN No.2 Scala事始め
ATN No.2 Scala事始めATN No.2 Scala事始め
ATN No.2 Scala事始め
 
Trait in scala
Trait in scalaTrait in scala
Trait in scala
 
MoteMote Compiler Plugin
MoteMote Compiler PluginMoteMote Compiler Plugin
MoteMote Compiler Plugin
 
Java8から17へ
Java8から17へJava8から17へ
Java8から17へ
 
Rpscala2011 0601
Rpscala2011 0601Rpscala2011 0601
Rpscala2011 0601
 
scala-kaigi1-sbt
scala-kaigi1-sbtscala-kaigi1-sbt
scala-kaigi1-sbt
 
Play framework 2.0のちょっとした紹介
Play framework 2.0のちょっとした紹介Play framework 2.0のちょっとした紹介
Play framework 2.0のちょっとした紹介
 
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
 
Scala東北紹介
Scala東北紹介Scala東北紹介
Scala東北紹介
 
Java ee6 with scala
Java ee6 with scalaJava ee6 with scala
Java ee6 with scala
 
R5 3 type annotation
R5 3 type annotationR5 3 type annotation
R5 3 type annotation
 
JavaOne2015報告会 Java EE アップデート #j1jp
JavaOne2015報告会 Java EE アップデート #j1jpJavaOne2015報告会 Java EE アップデート #j1jp
JavaOne2015報告会 Java EE アップデート #j1jp
 
[Japanese] Skinny Framework で始める Scala #jjug_ccc #ccc_r24
[Japanese] Skinny Framework で始める Scala #jjug_ccc #ccc_r24[Japanese] Skinny Framework で始める Scala #jjug_ccc #ccc_r24
[Japanese] Skinny Framework で始める Scala #jjug_ccc #ccc_r24
 
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」
 
Scala on Hadoop
Scala on HadoopScala on Hadoop
Scala on Hadoop
 
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansaiJavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
 
形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta
形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta
形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta
 
Beginners Scala in FAN 20121009
Beginners Scala in FAN 20121009Beginners Scala in FAN 20121009
Beginners Scala in FAN 20121009
 

Scala EE 7 Essentials

  • 1. Scala EE 7 Essentials @tnoda_ 第1 回Scala 関西勉強会 [2014-12-13 Sat]
  • 2. Disclaimer このプレゼンテーションの内容は私自身の見解であり、必ずしも私 の所属組織・所属団体の立場、戦略、意見を代表するものではあり ません。 以下の事項は,Scala によるJava EE 7 開発の一般的な方向性に関 する概要を説明するものです.また,情報提供を唯一の目的とする ものであり,いかなる契約にも組み込むことはできません.以下の 事項は,マテリアルやコード,機能を提供するコミットメント(確 約)するものではないため,購買決定を行う際の判断材料になさら ないで下さい. 文中の社名,商品名は各社の商標または登録商標である場合があり ます.
  • 5. Goodies • 型システム • イミュータブルな値・コレクション • 式 • パターンマッチ • . . . 間違いの少ないプログラムを比較的少ない労力で書ける.
  • 7. Scala for Enterprise (このスライドは削除されました)
  • 8. Java EE 7 Overview !"# $%&'(")*+ ,-. /01 /2$3/20345 /16782 /167!2 /29: !"#3 2;<="* 2"%>?"*+ ,-. 4@*")+A;)+ .)*"%<"B*;%+C /D1 ,;((;)3 1));*&*A;)+ ,;)<E%%")<F3 G*A?A*A"+ H&)&'"I3J"&)+ 4)*"%B%A+"3/&>&J"&)+ /H2 /,1 J&*<K !"#$ %#&'(#')*$
  • 11. 想定出席者 Scala 中・上級者 Scala アプリケーションを開発できる.
  • 12. 想定出席者 Scala 中・上級者 Scala アプリケーションを開発できる. Java EE 7 開発者 Java でJava EE 7 アプリケーションを開発できる.
  • 13. 想定出席者 Scala 中・上級者 Scala アプリケーションを開発できる. Java EE 7 開発者 Java でJava EE 7 アプリケーションを開発できる. 勇者 上のどちらにもあてはまらない人
  • 14. 想定出席者 Scala 中・上級者 Scala アプリケーションを開発できる. Java EE 7 開発者 Java でJava EE 7 アプリケーションを開発できる. 勇者 上のどちらにもあてはまらない人 目標 Java EE 7 アプリ開発のお仕事を,ついうっかりScala で書ける ようになる.
  • 15. Outline 本日お話ししたいこと • Build tools • Servlet • JAX-RS + JAXB 本日お話ししないこと • CDI + JPA • JMS, JSF, and other specs. • javax.enterprise.cuncurrent • Testing (Arquillian)
  • 16. Build tools SBT • .war ファイルにやさしくない Gradle • .war ファイルにやさしい(公式war プラグイン) • SBT とソースコードのディレクトリ構成は共通 $ gradle war #=> .war
  • 17. build.gradle plugins { id ’scala ’ id ’war ’ } war. dependsOn compileScala repositories { mavenCentral () } // Incremental compilation using Zinc tasks . withType ( ScalaCompile ) { scalaCompileOptions . useAnt = false } dependencies { compile ’org.scala - lang :scala - library :2.11.4 ’ providedCompile ’javax :javaee - api :7.0 ’ }
  • 18. Plugins - build.gradle Example (plugins) plugins { id 'scala' id 'war' } 追加されるタスク • scala . . . compileScala など • war . . . war など
  • 19. Maven Central - build.gradle Example (repositories) repositories { mavenCentral() }
  • 20. Incremental Build - build.gradle Example (ScalaCompile) tasks.withType(ScalaCompile) { scalaCompileOptions.useAnt = false } useAnt = false SBT と同じくZinc によるインクリメンタルなコンパイル
  • 21. Dependencies - build.gradle Example (dependencies) dependencies { compile 'org.scala-lang:scala-library:2.11.4' providedCompile 'javax:javaee-api:7.0' } providedCompile 作成される.war ファイルには含まれない.
  • 22. SBT Example (build.sbt) libraryDependencies += "javax" % "javaee-api" % "7.0"
  • 23. (再)build.gradle plugins { id ’scala ’ id ’war ’ } war. dependsOn compileScala repositories { mavenCentral () } tasks . withType ( ScalaCompile ) { scalaCompileOptions . useAnt = false } dependencies { compile ’org.scala - lang :scala - library :2.11.4 ’ providedCompile ’javax :javaee - api :7.0 ’ }
  • 25. Checkpoint 1 Scala の勉強会に来てJava EE 7 の話を聞きに来ていた と思ったらGradle の話を聞いていた.
  • 26. Checkpoint 1 Scala の勉強会に来てJava EE 7 の話を聞きに来ていた と思ったらGradle の話を聞いていた. Gradle • プラグインの利用 • scala, war • 依存関係の解決 • task . . . dependsOn • library . . . providedCompile
  • 27. Checkpoint 1 Scala の勉強会に来てJava EE 7 の話を聞きに来ていた と思ったらGradle の話を聞いていた. Gradle • プラグインの利用 • scala, war • 依存関係の解決 • task . . . dependsOn • library . . . providedCompile SBT libraryDependencies += "javax" % "javaee-api" % "7.0"
  • 30. Servlet とは 上級者向けの説明 JSR 340 (Servlet 3.1) j.s.h.HttpServlet を継承したクラス • コントローラのような何か • doXXX (XXX = Get, Post, . . . ) をオーバーライド
  • 31. Servlet とは 上級者向けの説明 JSR 340 (Servlet 3.1) j.s.h.HttpServlet を継承したクラス • コントローラのような何か • doXXX (XXX = Get, Post, . . . ) をオーバーライド ルーティングなどの設定 • XML (web.xml) • アノテーション • 動的(ServletContext.addServlet)
  • 32. HelloWorldServlet.scala package com. example import javax . servlet . annotation ._ import javax . servlet . http ._ @ WebServlet ( name = " HelloWorldServlet ", urlPatterns = Array ("/ plain "), initParams = Array ( new WebInitParam ( name = " type ", value = " checking " ))) class HelloWorldServlet extends HttpServlet { override def doGet ( req: HttpServletRequest , res: HttpServletResponse ): Unit = { res. setContentType (" text / plain ") val out = res. getWriter out. println (" Hello␣Scala␣KB␣#1") } }
  • 33. @WebServlet Scala @ WebServlet ( name = " HelloWorldServlet ", urlPatterns = Array ("/ plain "), initParams = Array ( new WebInitParam ( name = " type ", value = " checking "))) Java
  • 34. @WebServlet Scala @ WebServlet ( name = " HelloWorldServlet ", urlPatterns = Array ("/ plain "), initParams = Array ( new WebInitParam ( name = " type ", value = " checking "))) Java @WebServlet ( name =" HelloWorldServlet ", urlPatterns = {"/ plain "}, initParams = { @WebInitParam ( name = " type ", value = " checking ")})
  • 35. Java アノテーションの書き方 基本形 @Example パラメータ(elements) @Example("FOO") @Example(foo = "FOO", bar = "Bar") 配列 @Example(name = {"John", "Smith"}) これは,String の配列を指定しているのと同じ
  • 36. Scala アノテーションの注意点(1/2) 配列を要求する場合 Java @Example(name = {"John", "Smith"}) この書き方はScala ではエラーになる. Scala
  • 37. Scala アノテーションの注意点(1/2) 配列を要求する場合 Java @Example(name = {"John", "Smith"}) この書き方はScala ではエラーになる. Scala @Example(name = Array("John", "Smith"))
  • 38. Scala アノテーションの注意点(2/2) ネストしたアノテーション Java @Outer(@Inner("valid")) この書き方はScala ではエラーになる. Scala ネストした内側のアノテーションは@ で書けない.
  • 39. Scala アノテーションの注意点(2/2) ネストしたアノテーション Java @Outer(@Inner("valid")) この書き方はScala ではエラーになる. Scala ネストした内側のアノテーションは@ で書けない. @Outer(new Inner("valid")) アノテーションがJVM のクラスであることを思い出す.
  • 40. HelloWorldServlet ふたたび package com. example import javax . servlet . annotation ._ import javax . servlet . http ._ @ WebServlet ( name = " HelloWorldServlet ", urlPatterns = Array ("/ plain "), initParams = Array ( new WebInitParam ( name = " type ", value = " checking " ))) class HelloWorldServlet extends HttpServlet { override def doGet ( req: HttpServletRequest , res: HttpServletResponse ): Unit = { res. setContentType (" text / plain ") val out = res. getWriter out. println (" Hello␣Scala␣KB␣#1") } }
  • 41. Servlet 周辺 • フィルタ(@WebFilter) • イベントリスナ(@WebListener) • 非同期(@WebServlet(asyncSupported=true)) • セキュリティ(@ServletSecurity) • マルチパートリクエスト(@MultipartConfig) これまでに説明したアノテーションで書ける.
  • 42. Servlet のライフサイクル !" !"!#$% &'()!*'$% +'&#(,-$% # +,.'#$% +,/,&#$% +,/0#$%
  • 43. Servlet の初期化 Example (Java) MyState state = null @Override public void init ( ServletConfig config ) throws ServletException { state = doTimeConsumingInitProcess ( config ); // ... }
  • 44. init() とScala との相性の悪さ サーブレットのinit() は状態を変更する.
  • 45. init() とScala との相性の悪さ サーブレットのinit() は状態を変更する. var フィールド Scalastyle に怒られる.
  • 46. init() とScala との相性の悪さ サーブレットのinit() は状態を変更する. var フィールド Scalastyle に怒られる. lazy val + mutable なオブジェクト Immutable ではないが,比較的軽微.
  • 47. init() サンプルコード var class MutableServlet extends HttpServlet { var state : MyState = null override def init ( config : ServletConfig ): Unit = { state = MyState . doTimeConsumingInitProcess ( config ) // ... } } lazy val class ImmutableServlet extends HttpServlet { lazy val state = new MyState () override def init ( config : ServletConfig ): Unit = { state . doTimeConsumingInitProcess ( config ) // ... } }
  • 49. Checkpoint 2 サーブレットの話を聞いていたと思っていたら,いつの まにかアノテーションの話を聞いていた.
  • 50. Checkpoint 2 サーブレットの話を聞いていたと思っていたら,いつの まにかアノテーションの話を聞いていた. アノテーション • 配列{ ... } 記法に注意 • ネストしたアノテーションに注意
  • 51. Checkpoint 2 サーブレットの話を聞いていたと思っていたら,いつの まにかアノテーションの話を聞いていた. アノテーション • 配列{ ... } 記法に注意 • ネストしたアノテーションに注意 init() 問題 • lazy val + ミュータブルなオブジェクトで対処
  • 53. おわりに Scala でJava EE 7 開発をする際のテクニック
  • 54. おわりに Scala でJava EE 7 開発をする際のテクニック Gradle • scala, war プラグイン
  • 55. おわりに Scala でJava EE 7 開発をする際のテクニック Gradle • scala, war プラグイン アノテーション • 配列記法, ネストしたアノテーション
  • 56. おわりに Scala でJava EE 7 開発をする際のテクニック Gradle • scala, war プラグイン アノテーション • 配列記法, ネストしたアノテーション 引数なしコンストラクタ • def this() { . . . }
  • 57. おわりに Scala でJava EE 7 開発をする際のテクニック Gradle • scala, war プラグイン アノテーション • 配列記法, ネストしたアノテーション 引数なしコンストラクタ • def this() { . . . } @BeanProperty • getFoo, setFoo(x)
  • 58. 結論 Scala でJava EE 7 を書ける?
  • 59. 結論 Scala でJava EE 7 を書ける? Scala を書ければJava EE 7 を書ける.
  • 60. 結論 Scala でJava EE 7 を書ける? Scala を書ければJava EE 7 を書ける. 利点
  • 61. 結論 Scala でJava EE 7 を書ける? Scala を書ければJava EE 7 を書ける. 利点 ビジネスロジック(Scala) とサービスマッピング(Java Annotations) との分離