Java体験言语威力_第1页
Java体験言语威力_第2页
Java体験言语威力_第3页
Java体験言语威力_第4页
Java体験言语威力_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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

ITアーキテクト鈴木雄介ブログ:アークランプ(http://www.arclamp.jp)アジェンダJavaにおけるスクリプト言語ScriptingAPI(JSR223)スクリプト言語の威力JavaScript(ECMAScript)GroovyJ2EEでスクリプティングProjectPhobosSarugauJSまとめ2Javaにおけるスクリプト言語ScriptingAPI(JSR223):概要

1/3JavaVM内でJava言語とスクリプト言語をつなぐための標準仕様JCP(JavaCommunityProcess)で策定JSR223:ScriptingfortheJavaTMPlatform/en/jsr/detail?id=2232006年11月6日に最終承認完了(2003年から検討してました)JavaSE6(Mustang)で採用ScriptingAPI(javax.script)/javase/6/docs/technotes/guides/scripting/index.htmlSUNのJavaSE6βにJavaScript(ECMAScript)が同梱済み4ScriptingAPI(JSR223):概要

2/3できることJava言語から「スクリプト言語のファイル」を呼び出しスクリプト言語側でJavaオブジェクトを操作Java言語からインターフェースを通じてスクリプトを操作などなど言語には非依存ApacheJakartaBeanScriptingFramework(BSF)と同じアイデア/bsf/JDBCみたいなもの5ScriptingAPI(JSR223):概要

3/3ようは、Java言語からスクリプト言語が呼べる。逆もOK。pulicvoidhoge(){

invokeFunction(‘hoge’)}var

hoge=function(){

println(‘hoge’);}var

hoge=function(){

varo=newFoo()

o.bar();}PublicclassFoo{publicvoidbar(){}}Javaスクリプト6ScriptingAPI(JSR223):APIjavax.script.ScriptEnginejavax.script.ScriptEngineManagerjavax.script.Invocablejavax.script.ScriptContextjavax.script.Bindings7ScriptingAPI(JSR223):サンプルサンプル1.直接、スクリプトを実行する2.スクリプトファイルを実行する3.スクリプトファイルの関数を呼び出す4.スクリプトファイルにパラメタを渡す5.スクリプトファイルからJavaオブジェクト生成する6.スクリプトの関数をインターフェースを通じて呼び出す※すべてのコードは、講演後にhttp://www.arclamp.jpからダウンロード可能にします8ScriptingAPI(JSR223):サンプル11.直接、スクリプトを実行するsrc/javaHello1.java9ScriptingAPI(JSR223):サンプル1Hello1.javaimportjavax.script.ScriptEngine;importjavax.script.ScriptEngineManager;publicclassHello1{publicstaticvoidmain(String[]args)throwsException{

ScriptEngineManagermanager=newScriptEngineManager();

ScriptEngineengine=manager.getEngineByName("JavaScript");//直接スクリプトを実行するパターン

engine.eval("println(‘HelloWorld')");}}10ScriptingAPI(JSR223):サンプル22.スクリプトファイルを実行処理するsrc/javaHello2.jsHello2.java

11ScriptingAPI(JSR223):サンプル2Hello2.js//標準出力println('HelloWorld');12ScriptingAPI(JSR223):サンプル2Hello2.java…publicclassHello2{publicstaticvoidmain(String[]args)throwsException{engine=…

engine.eval(newInputStreamReader(Hello2.class.getResourceAsStream("hello2.js"),"UTF-8"));}}13ScriptingAPI(JSR223):サンプル33.スクリプトファイルの関数を呼び出すsrc/javaHello3.jsHello3.java

14ScriptingAPI(JSR223):サンプル3Hello3.jsprintln('init');varhello=function(){

println('HelloWorld');}var

helloMessage=function(p){

println('Hello'+p);}15ScriptingAPI(JSR223):サンプル3Hello3.javaimportjavax.script.Invocable;…publicclassHello3{publicstaticvoidmain(String[]args)throwsException{

ScriptEngineengine=…

engine.eval(newInputStreamReader(Hello2.class.getResourceAsStream("hello3.js"),"UTF-8"));

Invocable

invocable=(Invocable)engine;

invocable.invoke("hello",null);

invocable.invoke("helloMessage",newObject[]{"Message"});}}16ScriptingAPI(JSR223):サンプル44.スクリプトファイルにパラメタを渡すsrc/javaHello4.jsHello4.java

17ScriptingAPI(JSR223):サンプル4Hello4.jsprintln(helloMessage+d.time);18ScriptingAPI(JSR223):サンプル4Hello4.java…publicclassHello4{publicstaticvoidmain(String[]args)throwsException{

ScriptEngineengine=…

engine.put("helloMessage","time=");

engine.put("d",newDate());

engine.eval(newInputStreamReader(Hello2.class.getResourceAsStream("hello4.js"),"UTF-8"));}}19ScriptingAPI(JSR223):サンプル55.スクリプトファイルからJavaオブジェクト生成するsrc/javaHello5.javaHello5.js

20ScriptingAPI(JSR223):サンプル5Hello5.java…publicclassHello5{publicstaticvoidmain(String[]args)throwsException{

ScriptEngineengine=…

engine.eval(newInputStreamReader(Hello2.class.getResourceAsStream("hello5.js"),"UTF-8"));}publicStringgetValue(){return"1";}publicvoidhelloMessage(Stringp){

System.out.println("hello"+p);}}21ScriptingAPI(JSR223):サンプル5Hello5.jsvars=new();vard=newPackages.java.util.Date();varo=newPackages.Hello5();println(d.time);o.helloMessage('Message'+o.value);22ScriptingAPI(JSR223):サンプル66.スクリプトの関数をインターフェースを通じて呼び出すsrc/javaMyInterface.javaHello6.jsHello6.java

23ScriptingAPI(JSR223):サンプル6MyInterface.javapublicinterfaceMyInterface{voidexec(Stringp);}24ScriptingAPI(JSR223):サンプル6Hello6.jsvarexec=function(p){

println('Hello'+p);}25ScriptingAPI(JSR223):サンプル6Hello6.java…publicclassHello6{publicstaticvoidmain(String[]args)throwsException{

ScriptEngineengine=…

engine.eval(newInputStreamReader(Hello2.class.getResourceAsStream("hello6.js"),"UTF-8"));

Invocableinv=(Invocable)engine;

MyInterfacei=inv.getInterface(MyInterface.class);

i.exec("Message");}}26ScriptingAPI(JSR223):jrunscript1/2jrunscriptJavaSE6に付属しているスクリプト実行シェル言語は切替可能JAVA_HOME\binにあります27ScriptingAPI(JSR223):jrunscript2/2コマンドラインから実行C:>jrunscriptjs>println('helloworld');helloworldjs>exit();ファイルを読み込み実行c:>jrunscript-fsrc/java/Hello2.jsHelloWorld28スクリプト言語の威力スクリプトの威力スクリプトの有利な点型決定が動的、変数スコープが柔軟シンプルで直感的な記述頭を柔らかくして”感じる”べしスクリプトの不利な点コンパイラによる型チェックはできないJavaの有利な点30JavaScript(ECMAScript)ネットスケープ2.0より提供。当時はLiveScriptJavaとは確かに似ているけど、なんの互換性もない1997年よりECMA(ヨーロッパ電子計算機工業会)にてECMAScriptとして標準化/publications/standards/Ecma-262.htm

現在はAsynchronous

JavaScript+XMLで有名参照:/wiki/JavaScript31GroovyJavaで記述されたスクリプト言語JamesStrachan,BobMcWhirterによって2003年8月からCodehausにて開発/

Ruby,Python,andSmalltalk™にインスパイアされているJSR241:TheGroovyProgrammingLanguageとして標準化作業中/en/jsr/detail?id=241使えるテンプレートエンジン、コード生成、XML操作など、充実したライブラリが存在32スクリプトの威力:サンプル1.MapとList2.関数を引数や返り値に3.Closureとレキシカルスコープ33スクリプトの威力:サンプル11.MapとListsrc/javascript/maplist.jssrc/groovy/maplist.groovysrc/java/MapList.java処理a,b,cのリストを作るキーa値A、キーb値B、キーc値Cのマップマップとリストの複雑な組み合わせ34スクリプトの威力:サンプル1MapList.jsvarl=['a','b','c'];println(l[1]);varm={a:'A',b:'B',c:'C'};println(m.b);varlm=['a',{b:'B',c:[1,2,3]}];println(lm[1].c[2]);35スクリプトの威力:サンプル1MapList.groovydefl=['a','b','c']printlnl[1]defm=['a':'A','b':'B','c':'C']println

m.bdeflm=['a',[b:'B',c:[1,2,3]]]printlnlm[1].c[2]36スクリプトの威力:サンプル1MapList.javaimportjava.util.ArrayList;importjava.util.HashMap;importjava.util.List;importjava.util.Map;publicclassMapList{publicstaticvoidmain(String[]args)throwsException{List<String>l=newArrayList<String>();

l.add("a");

l.add("b");

l.add("b");System.out.println(l.get(1));

HashMap<String,String>m=newHashMap<String,String>();

m.put("a","A");

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

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

System.out.println(m.get("b"));List<Object>lm=newArrayList<Object>();

lm.add("a");Map<String,Object>b=newHashMap<String,Object>();

b.put("b","B");List<Integer>c=newArrayList<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));}}右上へ続く37スクリプトの威力:サンプル22.関数を引数や返り値にsrc/javascript/functions.jssrc/groovy/function.groovy処理関数を引数に、返り値に()をつけると関数が呼び出せる()をつけない場合は関数そのものGroovyの場合は、いろいろ省略できる高階関数であれば、引数の関数を呼び出せる38スクリプトの威力:サンプル2functions.js1println('a');//関数を呼び出し2println('['+println+']');//関数そのものを表示34var

runFunction=function(f){5f(‘Hello’);//引数の関数を実行6}7runFunction(println);//関数そのものを引数に89var

returnFunction=function(){10returnprintln;//関数そのものを返り値に11}12varf=returnFunction();13f('Hello2');14returnFunction()('Hello3');//返り値の関数をそのまま呼び出す39スクリプトの威力:サンプル3functions.groovy1println('a')2println'a'//()は空白1文字に省略可能3println{returnprintln}//{}を関数として解釈45defsample1(p){println(p)}6sample1('Hello1');7defsample2={p->println(p)}//->で引数をしめす8sample2('Hello2')910defrunFunction(f){f('Hello3')}11runFunction(sample2)1213defreturnFunction={returnsample2}14returnFunction()('Hello4')40スクリプトの威力:サンプル33.Closuresrc/javascript/closure.jssrc/groovy/closure.groovysrc/java/Closure.javaクロージャー内側の関数が、実行位置ブロックの外側にある変数にアクセスできる(レキシカル・スコープ)Javaでは実装できない(でもJavaSE7で導入されるかも)http:///ahe/resource/closures.pdf41スクリプトの威力:サンプル3処理「リスト内の数字をすべて足し算する」まず処理を分離リスト内の数字にアクセスする足し算する12345リストにアクセスする関数足し算をする関数合計を保持する変数1.引数として設定3.アクセスした値を関数に渡す4.計算結果を保持2.リストの値にアクセス以下、2,3,4を繰り返しこの変数がレキシカルスコープ42スクリプトの威力:サンプル3ClosurebyJavaScriptvar

forEach=function(l,f){for(i=0;i<l.length;i++){

f(l[i]);}}varlist=[1,2,3,4,5];vartotal=0;forEach(list,function(v){total+=v});println(total);43スクリプトの威力:サンプル3ClosurebyGroovydeflist=[1,2,3,4,5]deftotal=0list.each{i->total+=i}printlntotalGroovyではライブラリとしてClosure対応機能を用意http:///Closures44スクリプトの威力:サンプル3ClosurebyJavapublicclassClosure{publicstaticvoidmain(String[]args){

int[]list=newint[]{1,2,3,4,5};

inttotal=0;

forEach(list,newFunction(){publicvoidexec(inti){total+=i;}//ここでコンパイルエラー!});

System.out.println(total);}publicstaticvoidforEach(int[]l,Functionf){for(inti:l){f.exec(i);}}publicinterfaceFunction{voidexec(inti);}}45J2EEでスクリプティングProjectPhobos1/4ScriptingAPIを利用したWeb層アプリケーションProjectGlassFishの一部としてSUNメンバーが実装/MVCモデルを採用(Strutsのような)モデルは、スクリプトのMapを利用ビューは、JSPシンタックス(<%%>)でJavaScriptを実行するejs形式をサポートコントローラーは、URLに対応するスクリプトファイルの関数を実行47ProjectPhobos2/4サンプルを実行AJAXListWEBサイトのドキュメント

->samples–2007/07/24WARをダウンロードして、ServletコンテナにデプロイでOK構造WEB-INF/applicationがアプリケーションコードcontroller:list.jsscript:index.js(/でアクセスされたときに実行される)view:list.ejsstartup.jsWEB-INF/その他はフレームワークのコード48ProjectPhobos3/4処理概要ルートのURLにアクセスindex.jsが実行“/list/show“にリダイレクト/list/showにアクセスcontroller/list.jsの関数showを実行view/list.ejsをレンダリング“AddtoList”を押すクライアントの関数submitData()が実行“/list/compute”に値とコマンドとしてaddを送信/list/computeにアクセスcontroller/list.jsの関数computeを実行リストの一覧をしめすXMLを返却49ProjectPhobos4/4まだ、使うのは危険実験的要素が散見されるそもそもフレームワーク全体をスクリプトで記述する意味があるのか不明(Java言語でいいのでは…)細かいユーティリティが全然なくて、ものすごく開発しにくい未来への期待JSR223対応なのでマルチ言語。JRuby対応の後が見える考え方はJSF。ManagedBeanもスクリプトでいいかも?確かにStrutsよりもコード量は少ない(半分ぐらいになるはず)クラス

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论