「チュートリアル/ページ作成」で作成したページを前提に解説します。
p100の下に作ったtest.htmlに対し、プログラムで何か変化をつけたいということで、test.htmlに以下のように変更を加えてください。
<?xml version="1.0" encoding="Windows-31J"?> <html> <head><title>100</title></head> <link rel="stylesheet" href="${contextpath}/standard.css" type="text/css"/> <body> <span ext:use="true" ext:include="../common/backtoindexpage.html" /> テスト <hr/> <span ext:loop="3,i"> ${i}<span ext:include="explanation.html"/> <br/> </span> <span ext:use="false" ext:language="java" ext:target="Test.java"/> </body> </html>
さてページをリロードしてみると、何も変化がありません。これはext:useがfalseになっているためで、これをtrueにしてからリロードをすると…今度は例外のページが表示されてしまいます。
これはTest.javaファイルがないためで、これを加えてみることにします。場所はp100の下で、内容を以下のようにしてください。
import java.util.Map; import quickreflector.silvergear.scriptdriver.java.JavaFunctionMarker; public class Test implements JavaFunctionMarker { public void invoke( Map context, Map meta ) throws Exception { System.out.println( "呼び出されました" ); } }
これをリロードすると、また例外になります。これは何故かというと、このファイルにはパッケージが指定されていないためです。パッケージは、page、func、sharedの直下をルートとする相対指定にする必要があるため、ここではpackage p100; とする必要があります。変更は以下のとおり。
package p100; import java.util.Map; import quickreflector.silvergear.scriptdriver.java.JavaFunctionMarker; public class Test implements JavaFunctionMarker { public void invoke( Map context, Map meta ) throws Exception { System.out.println( "呼び出されました" ); } }
リロードすると、サーバのコマンドラインに「呼び出されました」と表示されます。
次に、ページに対して何か値を返してみます。引数がcontext、metaとありますがcontextはページで参照できるもの、metaはその他リクエストの途中で必要となるものを保持しています。ここでcontextにSystem.getProperties()を指定してみます。
package p100; import java.util.Map; import quickreflector.silvergear.scriptdriver.java.JavaFunctionMarker; public class Test implements JavaFunctionMarker { public void invoke( Map context, Map meta ) throws Exception { System.out.println( "呼び出されました" ); context.put( "sys-props", System.getProperties() ); } }
さらにp100/test.htmlに"${sys-props}"を追加します。
<?xml version="1.0" encoding="Windows-31J"?> <html> <head><title>100</title></head> <link rel="stylesheet" href="${contextpath}/standard.css" type="text/css"/> <body> <span ext:use="true" ext:include="../common/backtoindexpage.html" /> テスト <hr/> <span ext:loop="3,i"> ${i}<span ext:include="explanation.html"/> <br/> </span> <span ext:use="false" ext:language="java" ext:target="Test.java"/> ${sys-props} </body> </html>
リロードすると、システムプロパティが一挙に表示されます。
このままでは見にくいので、ちょっと表にしてみます。表にするにはext:loopを使います。ext:loopには固定の数値のほか、配列またはコレクションを指定することができますので、次のようにソースに変更を加えます。
package p100; import java.util.Map; import quickreflector.silvergear.scriptdriver.java.JavaFunctionMarker; public class Test implements JavaFunctionMarker { public void invoke( Map context, Map meta ) throws Exception { System.out.println( "呼び出されました" ); context.put( "sys-props", System.getProperties().entrySet() ); } }
p100/test.htmlには以下のように変更を加えます。
<?xml version="1.0" encoding="Windows-31J"?> <html> <head><title>100</title></head> <link rel="stylesheet" href="${contextpath}/standard.css" type="text/css"/> <body> <span ext:use="true" ext:include="../common/backtoindexpage.html" /> テスト <hr/> <span ext:loop="3,i"> ${i}<span ext:include="explanation.html"/> <br/> </span> <span ext:use="false" ext:language="java" ext:target="Test.java"/> <table class="demotable"> <tr ext:loop="sys-props,element"> <td>${element}</td> </tr> </table> ${sys-props} </body> </html>
リロードすると、プロパティごとに行を区切った内容が表示されます。
さらに、キーと値を分離します。p100/test.htmlの変更を次のように行います。
<?xml version="1.0" encoding="Windows-31J"?> <html> <head><title>100</title></head> <link rel="stylesheet" href="${contextpath}/standard.css" type="text/css"/> <body> <span ext:use="true" ext:include="../common/backtoindexpage.html" /> テスト <hr/> <span ext:loop="3,i"> ${i}<span ext:include="explanation.html"/> <br/> </span> <span ext:use="false" ext:language="java" ext:target="Test.java"/> <table class="demotable"> <tr ext:loop="sys-props,element"> <td>${element.key}</td><td>${element.value}</td> </tr> </table> ${sys-props} </body> </html>
リロードすると、プロパティがキーと値の列に分けられた内容が表示されます。
これを使うには、quickreflector-demo.warだけでは足りません。BeanShellのライブラリモジュールをを別途用意し、WEB-INF/libに置いてから実行してください。
上記のJavaで書いたプログラムは以下のようになります。
invoke() { System.out.println( "呼び出されました。" ); CONTEXT.put( "sys-props", System.getProperties().entrySet() ); }
Javaを除き、各スクリプト言語ではCONTEXT, META の引数をグローバル変数として受け取ることに注意してください。