「チュートリアル/ページ作成」で作成したページを前提に解説します。
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 の引数をグローバル変数として受け取ることに注意してください。