• 検索結果がありません。

Javaで体験するスクリプト言語の威力

N/A
N/A
Protected

Academic year: 2021

シェア "Javaで体験するスクリプト言語の威力"

Copied!
29
0
0

読み込み中.... (全文を見る)

全文

(1)

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。 ITアーキテクト 鈴木雄介 ブログ:アークランプ(http://www.arclamp.jp) 第3回 ボーランド デベロッパー キャンプ

アジェンダ

ƒ

Javaにおけるスクリプト言語

ƒ

Scripting API(JSR223)

ƒ

スクリプト言語の威力

ƒ

JavaScript(ECMAScript)

ƒ

Groovy

(2)

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

第3回 ボーランド デベロッパー キャンプ

Scripting API(JSR223):概要 1/3

ƒ

JavaVM内でJava言語とスクリプト言語をつなぐための標準仕様

ƒ

JCP(Java Community Process)で策定

ƒ

JSR 223: Scripting for the Java

TM

Platform

ƒ

http://jcp.org/en/jsr/detail?id=223

ƒ

2006年11月6日に最終承認完了(2003年から検討してました)

ƒ

JavaSE6(Mustang)で採用

ƒ

Scripting API (javax.script)

ƒ

http://java.sun.com/javase/6/docs/technotes/guides/scrip

ting/index.html

(3)

5 本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

ƒ

できること

ƒ

Java言語から「スクリプト言語のファイル」を呼び出し

ƒ

スクリプト言語側で

Javaオブジェクトを操作

ƒ

Java言語からインターフェースを通じてスクリプトを操作

ƒ

などなど

ƒ

言語には非依存

ƒ

Apache Jakarta Bean Scripting Framework(BSF)と同じアイデア

ƒ

http://jakarta.apache.org/bsf/

ƒ

JDBCみたいなもの

第3回 ボーランド デベロッパー キャンプ

Scripting API(JSR223):概要 3/3

ƒ

ようは、

Java言語からスクリプト言語が呼べる。逆もOK。

pulic void hoge() { invokeFunction(‘hoge’)

pulic void hoge() { invokeFunction(‘hoge’)

var hoge = function() { println(‘hoge’);

var hoge = function() { println(‘hoge’);

(4)

7 本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

ƒ

javax.script.ScriptEngine

ƒ

javax.script.ScriptEngineManager

ƒ

javax.script.Invocable

ƒ

javax.script.ScriptContext

ƒ

javax.script.Bindings

第3回 ボーランド デベロッパー キャンプ

Scripting API(JSR223):サンプル

ƒ

サンプル

ƒ

1.直接、スクリプトを実行する

ƒ

2.スクリプトファイルを実行する

ƒ

3.スクリプトファイルの関数を呼び出す

ƒ

4.スクリプトファイルにパラメタを渡す

ƒ

5.スクリプトファイルからJavaオブジェクト生成する

ƒ

6.スクリプトの関数をインターフェースを通じて呼び出す

※すべてのコードは、講演後に

http://www.arclamp.jp

からダウンロー

ド可能にします

(5)

9 本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

ƒ

1.直接、スクリプトを実行する

ƒ

src/java

ƒ

Hello1.java

第3回 ボーランド デベロッパー キャンプ

Scripting API(JSR223):サンプル1

ƒ

Hello1.java

import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; public class Hello1 {

public static void main(String[] args) throws Exception { ScriptEngineManager manager = new ScriptEngineManager();

(6)

11 本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

ƒ

2.スクリプトファイルを実行処理する

ƒ

src/java

ƒ

Hello2.js

ƒ

Hello2.java

第3回 ボーランド デベロッパー キャンプ

Scripting API(JSR223):サンプル2

ƒ

Hello2.js

//標準出力 println('Hello World');

(7)

13 本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

ƒ

Hello2.java

public class Hello2 {

public static void main(String[] args) throws Exception { engine = … engine.eval(new InputStreamReader(Hello2.class .getResourceAsStream("hello2.js"), "UTF-8")); } } 第3回 ボーランド デベロッパー キャンプ

Scripting API(JSR223):サンプル3

ƒ

3.スクリプトファイルの関数を呼び出す

ƒ

src/java

ƒ

Hello3.js

ƒ

Hello3.java

(8)

15 本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

ƒ

Hello3.js

println('init');

var hello = function() { println('Hello World'); }

var helloMessage = function(p) { println('Hello ' + p); } 第3回 ボーランド デベロッパー キャンプ

Scripting API(JSR223):サンプル3

ƒ

Hello3.java import javax.script.Invocable;

public class Hello3 {

public static void main(String[] args) throws Exception { ScriptEngine engine = …

engine.eval(new InputStreamReader(Hello2.class .getResourceAsStream("hello3.js"), "UTF-8")); Invocable invocable = (Invocable)engine;

invocable.invoke("hello", null); invocable.invoke("helloMessage",

new Object[]{"Message"}); }

(9)

17 本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

ƒ

4.スクリプトファイルにパラメタを渡す

ƒ

src/java

ƒ

Hello4.js

ƒ

Hello4.java

第3回 ボーランド デベロッパー キャンプ

Scripting API(JSR223):サンプル4

ƒ

Hello4.js

println(helloMessage + d.time);

(10)

19 本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

ƒ

Hello4.java

public class Hello4 {

public static void main(String[] args) throws Exception { ScriptEngine engine = …

engine.put("helloMessage", "time="); engine.put("d", new Date());

engine.eval(new InputStreamReader(Hello2.class .getResourceAsStream("hello4.js"), "UTF-8")); } } 第3回 ボーランド デベロッパー キャンプ

Scripting API(JSR223):サンプル5

ƒ

5.スクリプトファイルからJavaオブジェクト生成する

ƒ

src/java

ƒ

Hello5.java

ƒ

Hello5.js

(11)

21 本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

ƒ

Hello5.java

public class Hello5 {

public static void main(String[] args) throws Exception { ScriptEngine engine = …

engine.eval(new InputStreamReader(Hello2.class .getResourceAsStream("hello5.js"), "UTF-8")); }

public String getValue() { return "1"; } public void helloMessage(String p) {

System.out.println("hello " + p); } } 第3回 ボーランド デベロッパー キャンプ

Scripting API(JSR223):サンプル5

ƒ

Hello5.js

var s = new ();

var d = new Packages.java.util.Date(); var o = new Packages.Hello5();

println(d.time);

(12)

23 本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

ƒ

6.スクリプトの関数をインターフェースを通じて呼び出す

ƒ

src/java

ƒ

MyInterface.java

ƒ

Hello6.js

ƒ

Hello6.java

第3回 ボーランド デベロッパー キャンプ

Scripting API(JSR223):サンプル6

ƒ

MyInterface.java

public interface MyInterface { void exec(String p);

(13)

25 本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

ƒ

Hello6.js

var exec = function(p) { println('Hello ' + p); } 第3回 ボーランド デベロッパー キャンプ

Scripting API(JSR223):サンプル6

ƒ

Hello6.java

public class Hello6 {

public static void main(String[] args) throws Exception { ScriptEngine engine = …

(14)

27 本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

ƒ

jrunscript

ƒ

JavaSE6に付属しているスクリプト実行シェル

ƒ

言語は切替可能

ƒ

JAVA_HOME¥binにあります

第3回 ボーランド デベロッパー キャンプ

Scripting API(JSR223):jrunscript 2/2

ƒ

コマンドラインから実行

C:>jrunscript js> println('hello world'); hello world js>exit();

ƒ

ファイルを読み込み実行

c:>jrunscript -f src/java/Hello2.js Hello World

(15)

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。 第3回 ボーランド デベロッパー キャンプ

スクリプトの威力

ƒ

スクリプトの有利な点

ƒ

型決定が動的、変数スコープが柔軟

ƒ

シンプルで直感的な記述

ƒ

頭を柔らかくして

”感じる”べし

(16)

31 本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

ƒ

ネットスケープ

2.0より提供。当時はLiveScript

ƒ

Javaとは確かに似ているけど、なんの互換性もない

ƒ

1997年よりECMA(ヨーロッパ電子計算機工業会)にてECMAScript

として標準化

ƒ

http://www.ecma-international.org/publications/standards/Ecma-262.htm

ƒ

現在は

Asynchronous JavaScript + XMLで有名

ƒ

参照:

http://ja.wikipedia.org/wiki/JavaScript

第3回 ボーランド デベロッパー キャンプ

Groovy

ƒ

Javaで記述されたスクリプト言語

ƒ

James Strachan, Bob McWhirterによって 2003年8月から

Codehausにて開発

ƒ

http://groovy.codehaus.org/

ƒ

Ruby, Python, and Smalltalk™にインスパイアされている

ƒ

JSR241 : The Groovy Programming Language として標準化

作業中

ƒ

http://jcp.org/en/jsr/detail?id=241

ƒ

使える

(17)

33 本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

ƒ

1.MapとList

ƒ

2.関数を引数や返り値に

ƒ

3.Closureとレキシカルスコープ

第3回 ボーランド デベロッパー キャンプ

スクリプトの威力:サンプル

1

ƒ

1.MapとList

ƒ

src/javascript/maplist.js

ƒ

src/groovy/maplist.groovy

ƒ

src/java/MapList.java

(18)

35 本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

ƒ

MapList.js

var l = ['a','b','c']; println(l[1]); var m = {a:'A', b:'B', c:'C'}; println(m.b); var lm = ['a', {b:'B', c:[1,2,3]} ]; println(lm[1].c[2]); 第3回 ボーランド デベロッパー キャンプ

スクリプトの威力:サンプル

1

ƒ

MapList.groovy

def l = ['a','b','c'] println l[1] def m = ['a':'A', 'b':'B', 'c':'C'] println m.b def lm = ['a', [b:'B', c:[1,2,3]] ] println lm[1].c[2]

(19)

37 本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

ƒ

MapList.java

import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class MapList {

public static void main(String[] args) throws Exception { List<String> l = new ArrayList<String>();

l.add("a"); l.add("b"); l.add("b");

System.out.println(l.get(1));

HashMap<String, String> m = new HashMap<String, String>(); m.put("a", "A");

m.put("b", "B"); m.put("c", "C");

System.out.println(m.get("b"));

List<Object> lm = new ArrayList<Object>(); lm.add("a");

Map<String, Object> b = new HashMap<String, Object>(); b.put("b", "B");

List<Integer> c = new ArrayList<Integer>(); c.add(1);

c.add(2); c.add(3); b.put("c", c); lm.add(b);

System.out.println(((List) ((Map) lm.get(1)).get("c")) .get(2)); } } 右上へ続く 第3回 ボーランド デベロッパー キャンプ

スクリプトの威力:サンプル

2

ƒ

2.関数を引数や返り値に

ƒ

src/javascript/functions.js

ƒ

src/groovy/function.groovy

ƒ

処理

(20)

39 本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

ƒ

functions.js 1 println('a'); //関数を呼び出し 2 println('[' + println + ']'); //関数そのものを表示 3

4 var runFunction = function(f) { 5 f(‘Hello’); //引数の関数を実行 6 }

7 runFunction( println ); //関数そのものを引数に 8

9 var returnFunction = function() { 10 return println; //関数そのものを返り値に 11 } 12 var f = returnFunction(); 13 f('Hello2'); 14 returnFunction()('Hello3'); //返り値の関数をそのまま呼び出す 第3回 ボーランド デベロッパー キャンプ

スクリプトの威力:サンプル

3

ƒ

functions.groovy 1 println('a') 2 println 'a' //()は空白1文字に省略可能

3 println {return println} //{}を関数として解釈 4

5 def sample1(p) { println(p)} 6 sample1('Hello1');

7 def sample2 = { p -> println(p) } //->で引数をしめす 8 sample2('Hello2')

9

10 def runFunction(f) { f('Hello3') } 11 runFunction( sample2 )

12

(21)

41 本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

ƒ

3.Closure

ƒ

src/javascript/closure.js

ƒ

src/groovy/closure.groovy

ƒ

src/java/Closure.java

ƒ

クロージャー

ƒ

内側の関数が、実行位置ブロックの外側にある変数にアクセスできる

(レキシカル・スコープ)

ƒ

Javaでは実装できない(でもJavaSE7で導入されるかも)

ƒ

http://blogs.sun.com/ahe/resource/closures.pdf

第3回 ボーランド デベロッパー キャンプ

スクリプトの威力:サンプル

3

ƒ

処理

ƒ

「リスト内の数字をすべて足し算する」

ƒ

まず処理を分離

ƒ

リスト内の数字にアクセスする

ƒ

足し算する

4.計算結果を保持

この変数が

レキシカルスコープ

(22)

43 本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

ƒ

Closure by JavaScript

var forEach = function(l, f) {

for ( i=0;i<l.length;i++ ) { f(l[i]); } } var list = [1,2,3,4,5]; var total=0; forEach(list, function(v){total+=v}); println(total); 第3回 ボーランド デベロッパー キャンプ

スクリプトの威力:サンプル

3

ƒ

Closure by Groovy

def list = [1,2,3,4,5] def total = 0 list.each {i -> total += i} println total

ƒ

GroovyではライブラリとしてClosure対応機能を用意

ƒ

http://groovy.codehaus.org/Closures

(23)

45 本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

ƒ Closure by Java

public class Closure {

public static void main(String[] args) { int[] list = new int[] { 1, 2, 3, 4, 5 }; int total = 0;

forEach(list, new Function() {

public void exec(int i) { total += i; } // ここでコンパイルエラー!

});

System.out.println(total); }

public static void forEach(int[] l, Function f) { for (int i : l) { f.exec(i); }

}

public interface Function { void exec(int i); } }

(24)

47 本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

ƒ

Scripting APIを利用したWeb層アプリケーション

ƒ

Project GlassFishの一部としてSUNメンバーが実装

ƒ

https://phobos.dev.java.net/

ƒ

MVCモデルを採用(Strutsのような)

ƒ

モデルは、スクリプトの

Mapを利用

ƒ

ビューは、JSPシンタックス(<%%>)でJavaScriptを実行するejs形式を

サポート

ƒ

コントローラーは、

URLに対応するスクリプトファイルの関数を実行

第3回 ボーランド デベロッパー キャンプ

Project Phobos 2/4

ƒ

サンプルを実行

ƒ

AJAXList

ƒ

WEBサイトのドキュメント -> samples – 2007/07/24

ƒ

WARをダウンロードして、ServletコンテナにデプロイでOK

ƒ

構造

ƒ

WEB-INF/applicationがアプリケーションコード

ƒ

controller : list.js

ƒ

script : index.js(/でアクセスされたときに実行される)

ƒ

view : list.ejs

ƒ

startup.js

ƒ

WEB-INF/その他はフレームワークのコード

(25)

49 本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

ƒ

処理概要

ƒ

ルートのURLにアクセス

ƒ index.jsが実行 ƒ “/list/show“にリダイレクト

ƒ

/list/showにアクセス

ƒ controller/list.jsの関数showを実行 ƒ view/list.ejsをレンダリング

ƒ

“Add to List”を押す

ƒ クライアントの関数submitData()が実行 ƒ “/list/compute”に値とコマンドとしてaddを送信

ƒ

/list/computeにアクセス

ƒ controller/list.jsの関数computeを実行 ƒ リストの一覧をしめすXMLを返却 第3回 ボーランド デベロッパー キャンプ

Project Phobos 4/4

ƒ

まだ、使うのは危険

ƒ

実験的要素が散見される

ƒ

そもそもフレームワーク全体をスクリプトで記述する意味があるのか不明

Java言語でいいのでは…)

ƒ

細かいユーティリティが全然なくて、ものすごく開発しにくい

(26)

51 本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

ƒ

“D”HTMLテンプレートエンジン

ƒ

読み:さるごー じぇいえす

ƒ

オープンソースで開発(CCの帰属2.1日本ライセンス)

ƒ

http://www.sarugau.org/js/

ƒ

Ajaxで使われているDHTMLを、そのままサーバサイドで

ƒ

そもそものコンセプトはデザイナとエンジニアの分業の実現

ƒ

DHTMLならHTMLコーダーでも使えるのでは

ƒ

JavaScriptのグローバル変数を呼ぶ感じで、Javaオブジェクト使えればい

いのでは

ƒ

Ajax用ライブラリも利用可能

ƒ

ex. prototype.js, Mochikit

第3回 ボーランド デベロッパー キャンプ

Sarugau JS 2/3

ƒ

構造概要

ƒ

DHTML処理 on サーバー

ƒ

リクエストされたURLに対応し

たHTMLをDOM化

ƒ

対応したスクリプトで処理

ƒ

結果のDOMを書き出す

ƒ

ブラウザの動きを再現

ƒ

document変数など

ƒ

MapやListへのアクセスを

JavaScriptっぽく

ƒ

JavaScript内からDIコンテナに

簡単アクセス

DBマガジン 2006年6月号より

(27)

53 本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

ƒ

効果

ƒ

ビジネスロジック・エンジニアとUIエンジニアの分業が実現。サービスレイ

ヤーを

DIコンテナで実現

ƒ

JavaScriptやDOMは使いにくいが、Ajaxライブラリが強い

ƒ

テストはそんなにたいへんではない

ƒ

というか、テストがすごくたいへんになる複雑なコードをスクリプト言語で書

いてはいけない

ƒ

課題

ƒ

Javaとスクリプト言語(とXML)の使い分け箇所

ƒ

サービス層のAPI設計(どこまでUI側に自由にさせるの?)

まとめ

(28)

55 本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

ƒ

JavaVMにおけるマルチ言語化の流れ

ƒ

Javaはビジネスロジックの記述に最適

ƒ

静的型宣言。コンパイラ、IDE…

ƒ

たくさんのエンジニアが同時に実装しても安心

ƒ

スクリプト言語はシンプルで直感的

ƒ

動的型付け。美しい構文

ƒ

IDEは時間の問題

ƒ

ともかく作って、ばりばり変える

ƒ

スクリプト言語がJavaに置き換わるわけではない

ƒ

どちらも使える

第3回 ボーランド デベロッパー キャンプ

まとめ

2/2

ƒ

どちらも使っていくべき?

ƒ

YES

ƒ

アプリケーション部位(レイヤー、コンポーネントなど)に応じて使い分

ける

ƒ

開発者の分業が大前提。分業すると道具の専門性が強くなる

ƒ

すでに

JSPがある

ƒ

スクリプト言語のよさは

JSTLで体験済み

ƒ

XMLは構造に向くが条件分岐ができない

ƒ

設定ファイルの代替としてスクリプト言語が使えるかも

(29)

57 本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

スクリプトの威力を体験できた?

参照

関連したドキュメント

REC DATA MASTER L to SD CARD REC DATA MASTER R to SD CARD VOLUME SOUND

(a) 主催者は、以下を行う、または試みるすべての個人を失格とし、その参加を禁じる権利を留保しま す。(i)

パソコン本体の電源を入れます。 ワイヤレス受信機(FMV-K600 シリーズは、パソコン本体背面)のコネク

Jabra Talk 15 SE の操作は簡単です。ボタンを押す時間の長さ により、ヘッドセットの [ 応答 / 終了 ] ボタンはさまざまな機

の知的財産権について、本書により、明示、黙示、禁反言、またはその他によるかを問わず、いかな るライセンスも付与されないものとします。Samsung は、当該製品に関する

編﹁新しき命﹂の最後の一節である︒この作品は弥生子が次男︵茂吉

操作は前章と同じです。但し中継子機の ACSH は、親機では無く中継器が送信する電波を受信します。本機を 前章①の操作で

AC100Vの供給開始/供給停止を行います。 動作の緊急停止を行います。