scala ee 7 essentials

61
Scala EE 7 Essentials @tnoda_ 1 Scala 関西勉強会 [2014-12-13 Sat]

Upload: tnoda

Post on 12-Jul-2015

496 views

Category:

Software


5 download

TRANSCRIPT

Page 1: Scala EE 7 Essentials

Scala EE 7 Essentials

@tnoda_

第 1 回 Scala 関西勉強会

[2014-12-13 Sat]

Page 2: Scala EE 7 Essentials

Disclaimer

このプレゼンテーションの内容は私自身の見解であり、必ずしも私の所属組織・所属団体の立場、戦略、意見を代表するものではありません。

以下の事項は,Scala による Java EE 7 開発の一般的な方向性に関する概要を説明するものです.また,情報提供を唯一の目的とするものであり,いかなる契約にも組み込むことはできません.以下の事項は,マテリアルやコード,機能を提供するコミットメント(確約)するものではないため,購買決定を行う際の判断材料になさらないで下さい.

文中の社名,商品名は各社の商標または登録商標である場合があります.

Page 3: Scala EE 7 Essentials

Why Scala?

硬い

Page 4: Scala EE 7 Essentials

Why Scala?

硬い

Page 5: Scala EE 7 Essentials

Goodies

• 型システム• イミュータブルな値・コレクション• 式• パターンマッチ• . . .

間違いの少ないプログラムを比較的少ない労力で書ける.

Page 6: Scala EE 7 Essentials

[エンタープライズ 開発] で検索

(このスライドは削除されました)

Page 7: Scala EE 7 Essentials

Scala for Enterprise

(このスライドは削除されました)

Page 8: Scala EE 7 Essentials

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

!"#$

%#&'(#')*$

Page 9: Scala EE 7 Essentials

WildFly

Page 10: Scala EE 7 Essentials

想定出席者

Scala 中・上級者Scala アプリケーションを開発できる.

Java EE 7 開発者Java で Java EE 7 アプリケーションを開発できる.

勇者上のどちらにもあてはまらない人

目標Java EE 7 アプリ開発のお仕事を,ついうっかり Scala で書けるようになる.

Page 11: Scala EE 7 Essentials

想定出席者

Scala 中・上級者Scala アプリケーションを開発できる.

Java EE 7 開発者Java で Java EE 7 アプリケーションを開発できる.

勇者上のどちらにもあてはまらない人

目標Java EE 7 アプリ開発のお仕事を,ついうっかり Scala で書けるようになる.

Page 12: Scala EE 7 Essentials

想定出席者

Scala 中・上級者Scala アプリケーションを開発できる.

Java EE 7 開発者Java で Java EE 7 アプリケーションを開発できる.

勇者上のどちらにもあてはまらない人

目標Java EE 7 アプリ開発のお仕事を,ついうっかり Scala で書けるようになる.

Page 13: Scala EE 7 Essentials

想定出席者

Scala 中・上級者Scala アプリケーションを開発できる.

Java EE 7 開発者Java で Java EE 7 アプリケーションを開発できる.

勇者上のどちらにもあてはまらない人

目標Java EE 7 アプリ開発のお仕事を,ついうっかり Scala で書けるようになる.

Page 14: Scala EE 7 Essentials

想定出席者

Scala 中・上級者Scala アプリケーションを開発できる.

Java EE 7 開発者Java で Java EE 7 アプリケーションを開発できる.

勇者上のどちらにもあてはまらない人

目標Java EE 7 アプリ開発のお仕事を,ついうっかり Scala で書けるようになる.

Page 15: Scala EE 7 Essentials

Outline

本日お話ししたいこと

• Build tools• Servlet• JAX-RS + JAXB

本日お話ししないこと

• CDI + JPA• JMS, JSF, and other specs.• javax.enterprise.cuncurrent• Testing (Arquillian)

Page 16: Scala EE 7 Essentials

Build tools

SBT

• .war ファイルにやさしくない

Gradle

• .war ファイルにやさしい (公式 war プラグイン)• SBT とソースコードのディレクトリ構成は共通

$ gradle war #=> .war

Page 17: Scala EE 7 Essentials

build.gradleplugins {

id ’scala’id ’war’

}

war.dependsOn compileScala

repositories {mavenCentral ()

}

// Incremental compilation using Zinctasks.withType(ScalaCompile) {

scalaCompileOptions.useAnt = false}

dependencies {compile ’org.scala -lang:scala -library :2.11.4 ’providedCompile ’javax:javaee -api :7.0’

}

Page 18: Scala EE 7 Essentials

Plugins - build.gradle

Example (plugins)

plugins {id 'scala'id 'war'

}

追加されるタスク

• scala . . . compileScala など• war . . . war など

Page 19: Scala EE 7 Essentials

Maven Central - build.gradle

Example (repositories)

repositories {mavenCentral()

}

Page 20: Scala EE 7 Essentials

Incremental Build - build.gradle

Example (ScalaCompile)

tasks.withType(ScalaCompile) {scalaCompileOptions.useAnt = false

}

useAnt = falseSBT と同じく Zinc によるインクリメンタルなコンパイル

Page 21: Scala EE 7 Essentials

Dependencies - build.gradle

Example (dependencies)

dependencies {compile 'org.scala-lang:scala-library:2.11.4'providedCompile 'javax:javaee-api:7.0'

}

providedCompile作成される .war ファイルには含まれない.

Page 22: Scala EE 7 Essentials

SBT

Example (build.sbt)

libraryDependencies += "javax" % "javaee-api" % "7.0"

Page 23: Scala EE 7 Essentials

(再)build.gradleplugins {

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’

}

Page 24: Scala EE 7 Essentials

Checkpoint 1

Scala の勉強会に来て Java EE 7 の話を聞きに来ていたと思ったら Gradle の話を聞いていた.

Gradle

• プラグインの利用• scala, war

• 依存関係の解決• task . . . dependsOn• library . . . providedCompile

SBT

libraryDependencies += "javax" % "javaee-api" % "7.0"

Page 25: Scala EE 7 Essentials

Checkpoint 1

Scala の勉強会に来て Java EE 7 の話を聞きに来ていたと思ったら Gradle の話を聞いていた.

Gradle

• プラグインの利用• scala, war

• 依存関係の解決• task . . . dependsOn• library . . . providedCompile

SBT

libraryDependencies += "javax" % "javaee-api" % "7.0"

Page 26: Scala EE 7 Essentials

Checkpoint 1

Scala の勉強会に来て Java EE 7 の話を聞きに来ていたと思ったら Gradle の話を聞いていた.

Gradle

• プラグインの利用• scala, war

• 依存関係の解決• task . . . dependsOn• library . . . providedCompile

SBT

libraryDependencies += "javax" % "javaee-api" % "7.0"

Page 27: Scala EE 7 Essentials

Checkpoint 1

Scala の勉強会に来て Java EE 7 の話を聞きに来ていたと思ったら Gradle の話を聞いていた.

Gradle

• プラグインの利用• scala, war

• 依存関係の解決• task . . . dependsOn• library . . . providedCompile

SBT

libraryDependencies += "javax" % "javaee-api" % "7.0"

Page 28: Scala EE 7 Essentials

Servlet とは

上級者向けの説明

JSR 340 (Servlet 3.1)

j.s.h.HttpServlet を継承したクラス

• コントローラのような何か• doXXX (XXX = Get, Post, . . . ) をオーバーライド

ルーティングなどの設定

• XML (web.xml)• アノテーション• 動的 (ServletContext.addServlet)

Page 29: Scala EE 7 Essentials

Servlet とは

上級者向けの説明JSR 340 (Servlet 3.1)

j.s.h.HttpServlet を継承したクラス

• コントローラのような何か• doXXX (XXX = Get, Post, . . . ) をオーバーライド

ルーティングなどの設定

• XML (web.xml)• アノテーション• 動的 (ServletContext.addServlet)

Page 30: Scala EE 7 Essentials

Servlet とは

上級者向けの説明JSR 340 (Servlet 3.1)

j.s.h.HttpServlet を継承したクラス

• コントローラのような何か• doXXX (XXX = Get, Post, . . . ) をオーバーライド

ルーティングなどの設定

• XML (web.xml)• アノテーション• 動的 (ServletContext.addServlet)

Page 31: Scala EE 7 Essentials

Servlet とは

上級者向けの説明JSR 340 (Servlet 3.1)

j.s.h.HttpServlet を継承したクラス

• コントローラのような何か• doXXX (XXX = Get, Post, . . . ) をオーバーライド

ルーティングなどの設定

• XML (web.xml)• アノテーション• 動的 (ServletContext.addServlet)

Page 32: Scala EE 7 Essentials

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.getWriterout.println("Hello␣Scala␣KB␣#1")

}}

Page 33: Scala EE 7 Essentials

@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")})

Page 34: Scala EE 7 Essentials

@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")})

Page 35: Scala EE 7 Essentials

Java アノテーションの書き方基本形

@Example

パラメータ (elements)

@Example("FOO")@Example(foo = "FOO", bar = "Bar")

配列

@Example(name = {"John", "Smith"})

これは,String の配列を指定しているのと同じ

Page 36: Scala EE 7 Essentials

Scala アノテーションの注意点 (1/2)

配列を要求する場合Java

@Example(name = {"John", "Smith"})

この書き方は Scala ではエラーになる.

Scala

@Example(name = Array("John", "Smith"))

Page 37: Scala EE 7 Essentials

Scala アノテーションの注意点 (1/2)

配列を要求する場合Java

@Example(name = {"John", "Smith"})

この書き方は Scala ではエラーになる.

Scala

@Example(name = Array("John", "Smith"))

Page 38: Scala EE 7 Essentials

Scala アノテーションの注意点 (2/2)

ネストしたアノテーションJava

@Outer(@Inner("valid"))

この書き方は Scala ではエラーになる.

Scalaネストした内側のアノテーションは @ で書けない.

@Outer(new Inner("valid"))

アノテーションが JVM のクラスであることを思い出す.

Page 39: Scala EE 7 Essentials

Scala アノテーションの注意点 (2/2)

ネストしたアノテーションJava

@Outer(@Inner("valid"))

この書き方は Scala ではエラーになる.

Scalaネストした内側のアノテーションは @ で書けない.

@Outer(new Inner("valid"))

アノテーションが JVM のクラスであることを思い出す.

Page 40: Scala EE 7 Essentials

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.getWriterout.println("Hello␣Scala␣KB␣#1")

}}

Page 41: Scala EE 7 Essentials

Servlet 周辺

• フィルタ (@WebFilter)• イベントリスナ (@WebListener)• 非同期 (@WebServlet(asyncSupported=true))• セキュリティ (@ServletSecurity)• マルチパートリクエスト (@MultipartConfig)

これまでに説明したアノテーションで書ける.

Page 42: Scala EE 7 Essentials

Servlet のライフサイクル

誕生

!"!#$%

&'()!*'$%

+'&#(,-$%

+,.'#$%

+,/,&#$%

+,/0#$%

Page 43: Scala EE 7 Essentials

Servlet の初期化

Example (Java)

MyState state = null

@Overridepublic void init(ServletConfig config) throws

ServletException {state = doTimeConsumingInitProcess(config );//...

}

Page 44: Scala EE 7 Essentials

init() と Scala との相性の悪さ

サーブレットの init() は 状態 を変更する.

var フィールドScalastyle に怒られる.

lazy val + mutable なオブジェクトImmutable ではないが,比較的軽微.

Page 45: Scala EE 7 Essentials

init() と Scala との相性の悪さ

サーブレットの init() は 状態 を変更する.

var フィールドScalastyle に怒られる.

lazy val + mutable なオブジェクトImmutable ではないが,比較的軽微.

Page 46: Scala EE 7 Essentials

init() と Scala との相性の悪さ

サーブレットの init() は 状態 を変更する.

var フィールドScalastyle に怒られる.

lazy val + mutable なオブジェクトImmutable ではないが,比較的軽微.

Page 47: Scala EE 7 Essentials

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)//...

}}

Page 48: Scala EE 7 Essentials

Checkpoint 2

サーブレットの話を聞いていたと思っていたら,いつのまにかアノテーションの話を聞いていた.

アノテーション

• 配列 { ... } 記法に注意• ネストしたアノテーションに注意

init() 問題

• lazy val + ミュータブルなオブジェクトで対処

Page 49: Scala EE 7 Essentials

Checkpoint 2

サーブレットの話を聞いていたと思っていたら,いつのまにかアノテーションの話を聞いていた.

アノテーション

• 配列 { ... } 記法に注意• ネストしたアノテーションに注意

init() 問題

• lazy val + ミュータブルなオブジェクトで対処

Page 50: Scala EE 7 Essentials

Checkpoint 2

サーブレットの話を聞いていたと思っていたら,いつのまにかアノテーションの話を聞いていた.

アノテーション

• 配列 { ... } 記法に注意• ネストしたアノテーションに注意

init() 問題

• lazy val + ミュータブルなオブジェクトで対処

Page 51: Scala EE 7 Essentials

Checkpoint 2

サーブレットの話を聞いていたと思っていたら,いつのまにかアノテーションの話を聞いていた.

アノテーション

• 配列 { ... } 記法に注意• ネストしたアノテーションに注意

init() 問題

• lazy val + ミュータブルなオブジェクトで対処

Page 52: Scala EE 7 Essentials

JAX-RS とは

(中略)

Page 53: Scala EE 7 Essentials

おわりにScala で Java EE 7 開発をする際のテクニック

Gradle

• scala, war プラグイン

アノテーション

• 配列記法, ネストしたアノテーション

引数なしコンストラクタ

• def this() { . . . }

@BeanProperty

• getFoo, setFoo(x)

Page 54: Scala EE 7 Essentials

おわりにScala で Java EE 7 開発をする際のテクニックGradle

• scala, war プラグイン

アノテーション

• 配列記法, ネストしたアノテーション

引数なしコンストラクタ

• def this() { . . . }

@BeanProperty

• getFoo, setFoo(x)

Page 55: Scala EE 7 Essentials

おわりにScala で Java EE 7 開発をする際のテクニックGradle

• scala, war プラグイン

アノテーション

• 配列記法, ネストしたアノテーション

引数なしコンストラクタ

• def this() { . . . }

@BeanProperty

• getFoo, setFoo(x)

Page 56: Scala EE 7 Essentials

おわりにScala で Java EE 7 開発をする際のテクニックGradle

• scala, war プラグイン

アノテーション

• 配列記法, ネストしたアノテーション

引数なしコンストラクタ

• def this() { . . . }

@BeanProperty

• getFoo, setFoo(x)

Page 57: Scala EE 7 Essentials

おわりにScala で Java EE 7 開発をする際のテクニックGradle

• scala, war プラグイン

アノテーション

• 配列記法, ネストしたアノテーション

引数なしコンストラクタ

• def this() { . . . }

@BeanProperty

• getFoo, setFoo(x)

Page 58: Scala EE 7 Essentials

結論

Scala で Java EE 7 を書ける?

Scala を書ければ Java EE 7 を書ける.

利点ビジネスロジック (Scala) とサービスマッピング (JavaAnnotations) との分離

Page 59: Scala EE 7 Essentials

結論

Scala で Java EE 7 を書ける?Scala を書ければ Java EE 7 を書ける.

利点ビジネスロジック (Scala) とサービスマッピング (JavaAnnotations) との分離

Page 60: Scala EE 7 Essentials

結論

Scala で Java EE 7 を書ける?Scala を書ければ Java EE 7 を書ける.

利点

ビジネスロジック (Scala) とサービスマッピング (JavaAnnotations) との分離

Page 61: Scala EE 7 Essentials

結論

Scala で Java EE 7 を書ける?Scala を書ければ Java EE 7 を書ける.

利点ビジネスロジック (Scala) とサービスマッピング (JavaAnnotations) との分離