チュートリアル/プログラムコールの利用

「チュートリアル/ページ作成」で作成したページを前提に解説します。

Javaでプログラムを書く

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( "呼び出されました" );
    }
}
    
p100にTest.javaを配置

これをリロードすると、また例外になります。これは何故かというと、このファイルにはパッケージが指定されていないためです。パッケージは、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>
    

リロードすると、プロパティがキーと値の列に分けられた内容が表示されます。

BeanShellでプログラムを書く

これを使うには、quickreflector-demo.warだけでは足りません。BeanShellのライブラリモジュールをを別途用意し、WEB-INF/libに置いてから実行してください。

上記のJavaで書いたプログラムは以下のようになります。

invoke() {
  System.out.println( "呼び出されました。" );
  CONTEXT.put( "sys-props", System.getProperties().entrySet() );
}
    

Javaを除き、各スクリプト言語ではCONTEXT, META の引数をグローバル変数として受け取ることに注意してください。

Pnutsでプログラムを書く

これを使うには、quickreflector-demo.warだけでは足りません。pnutsのライブラリモジュールをを別途用意し、WEB-INF/libに置いてから実行してください。

上記のJavaで書いたプログラムは以下のようになります。

function invoke() {
  println( "呼び出されました。" )
  CONTEXT[ "sys-props" ] = class System::getProperties().entrySet();
}