スクリプトレットについて
ファイル名/格納先
 
1つのScriptletに対して、処理スクリプトと、例外発生時のエラースクリプトの2ファイルで構成されます。
エラースクリプトは省略する事が可能です。
   
処理を実行するスクリプトレット
必須
   
〜_error
エラー処理時に実行するスクリプトレット
exceptionグローバルオブジェクトが利用可能となります。
任意
   
”〜”にはScriptlet名となります
例:sitemap.xmlにfooSriptletというサーブレットをDefaultScriptetや独自のScriptletを利用して
指定した場合、fooSriptletおよびfooSriptlet_errorを作成します。
 
スクリプトレットは、WEB-INF/scriptletフォルダに格納するかWEB-INF/config.xmlに定義した任意のパスに格納する必要があります。
例:<entry key='scriptlet_path'>/usr/local/foo/scriptlet</entry>
 
エラースクリプトを省略した際の共通エラースクリプトのファイル名をWEB-INF/config.xmlに設定して、スクリプトレットフォルダに格納する必要があります。
例:<entry key='common_error'>common_error.es</entry>
ページ管理
 
サイトマップをXMLで記述する事により、ページ(画面)を管理します。

全てのパスを定義しなくてもスクリプト(ファイル)が存在すれば該当のスクリプトが実行されます。省略された場合は、site要素のclass属性に定義されたScriptlet実装クラスを利用します。

   
ノード名
概要
ノードタイプ
必須
   
site
ルートエレメントノード、必ずsiteノードで定義を開始する必要があります。
要素
     
version
1.0を指定します。
属性
     
class
デフォルトのScriptletのクラスを定義します。
属性
     
page
各ページ毎に定義します。
要素
       
path
ページのパスを定義します(コンテキスト名を含まず、かならず”/”で始まります)
HttpServletRequest#getRequestURIの戻り値
属性
       
class
Scriptletのクラスを定義します。
属性
 
 
サイトマップXMLは、WEB-INF/sitemap.xmlに定義するかWEB-INF/config.xmlに任意のパスを定義する必要があります。
例: <entry key='sitemap'>/usr/local/foo/sitemap.xml</entry>
スクリプレットの記述
 
スクリプトレットの記述には、以下の仕様に従って、それぞれのファイルへ記述を行う必要があります。
   
フォルダ名はコンテキスト名を含まないフォルダ構成を指定します。
グローバルオブジェクトはsite要素のclass属性に定義されたクラスまたはpage要素ののclass属性に定義されたクラスに依存します。
   
〜_error
必須ではありません。
exceptionグローバルオブジェクトは、発生した例外をスクリプト’から
アクセス可能にする為に定義されています。
任意のエラー処理を実装したい場合に作成します。
 
servervalidation要素
要求パラメータの検証ルールを記述する要素です。
記述フォーマットは次の通りです。
   
パラメータ名
要求パラメータ(INPUT要素のNAME属性値)を指定します。
   
=
必ず”=”を記述します。
   
ルール
正規表現(Java)でルールを記述します。例を記述します。
数字3桁:\d{3}
漢字とひらがな4文字:
[\p{InCJKUnifiedIdeographs}\p{InHiragana}]{4}
カタカナ1文字以上、3文字以内:
[\p{InKatakana}\p{InHalfwidthAndFullwidthForms}]{1,3}
   
,
必須パラメータとしたい場合は、必ず”,”を記述します。
   
必須フラグ
trueと記述した場合のみ必須パラメータとなります。
その他の値、または”,”以降を記述しなかった場合は、
任意パラメータとなります。
 
serverscript要素
スクリプト記述要素です。
Rhinoで提供される記述方式が実装可能です。
また、スクリプトレット用に、いくつかの特別なグローバルオブジェクトも
追加しました。
 
予約語
@import
外部スクリプトを取込みます。外部スクリプトは拡張子に関わらず、serverscriptlet要素内の命令を処理します。
予約グローバル・オブジェクト名(追加分のみ)
 
request
javax.servlet.http.HttpServletRequestクラスのインスタンス
 
response
javax.servlet.http.HttpServletResponseクラスのインスタンス
 
session
javax.servlet.http.HttpSessionクラスのインスタンス
HttpServletRequest#getSession()の戻り値
 
serverout
java.io.PrintWriterクラスのインスタンス
HttpServletResponse#getWrite()の戻り値
 
sysout
標準出力(System.out)です。
 
syserr
エラー出力(System.err)です。
 
helper
info.dragonlady.scriptlet.ESCylinder.ESHelperクラスのインスタンス
文字コード操作用の関数を提供します。
 
exception
info.dragonlady.scriptlet.ESExceptionクラスのインスタンス
スクリプレット実行時に発生した例外オブジェクトです。
 
document
HTMLのbody要素にonloadserver属性を定義し、呼出された関数内でのみ参照可能なグローバルオブジェクト。
HTMLドキュメント自体を示す、ドキュメントオブジェクト(DOM)です。
 
mongodb
MongoDBアクセスオブジェクト
mongodb.xml(デフォルト)に定義したMongoDBに接続条件を設定して、collectionの作成/アクセスを行なうことができます。
MongoDB設定XMLは、WEB-INF/mongodb.xmlに定義するか、WEB-INF/config.xmlに任意のパスを定義する必要があります。
例)
<entry key='mongodbject'>true</entry>
<entry key='mongodbconfig'>/Users/Shared/work_folder/DEVELOPPING/ServerEScript/ses/WEB-INF/mongodb.xml</entry>
 
mongodbjson
MongoDB簡易アクセスオブジェクト
JSONを引数にmongoDBへのアクセスを行うオブジェクト
例:
var removeData = "{'regist_ts':{'$lte':"+before15min+"}}"; mongodbjson.removeDB(mongodb, 'chat_message_col', removeData);
例:
mongodbjson.insertDB(mongodb, 'chat_message_col', JSON.stringify(jsonData));
 
dbaccesser
RDB汎用アクセスオブジェクト
db_config.xml(デフォルト)に定義したRDBアクセス設定、およびSQLをスクリプトレットより利用する事で、DBアプリケーションを簡単に構築可能です。
DB設定XMLは、WEB-INF/db_config.xmlに定義するかWEB-INF/config.xmlに任意のパスを定義する必要があります。
例: <entry key='dbconfig'>/usr/local/foo/db_config.xml</entry>
 
sqldbjson
RDB汎用簡易アクセスオブジェクト
JSONを引数にDBへのアクセスを行うオブジェクト
例:
var params = [];
var tel = '{"type":"STRING", "value":"'+gps.tel+'"}';
var imsi = '{"type":"STRING", "value":"'+gps.imsi+'"}';
var gps_latitude = '{"type":"STRING", "value":"'+gps.gps_latitude+'"}';
var gps_longitude = '{"type":"STRING", "value":"'+gps.gps_longitude+'"}';
var gps_time = '{"type":"STRING", "value":"'+gps.gps_time+'"}';
var gps_accuracy = '{"type":"STRING", "value":"'+gps.gps_accuracy+'"}';
var net_latitude = '{"type":"STRING", "value":"'+gps.net_latitude+'"}';
var net_longitude = '{"type":"STRING", "value":"'+gps.net_longitude+'"}';
var net_time = '{"type":"STRING", "value":"'+gps.net_time+'"}';
var net_accuracy = '{"type":"STRING", "value":"'+gps.net_accuracy+'"}';
var charge = '{"type":"STRING", "value":"'+gps.charge+'"}';
var network = '{"type":"STRING", "value":"'+gps.network+'"}'; params.push(tel);
params.push(imsi);
params.push(gps_latitude);
params.push(gps_longitude);
params.push(gps_time);
params.push(gps_accuracy);
params.push(net_latitude);
params.push(net_longitude);
params.push(net_time);
params.push(net_accuracy);
params.push(charge);
params.push(network);
var result = sqldbjson.execUpdateSQL(dbaccesser, 'insertgps', params);
例:
var params = [];
var tel = '{"type":"STRING", "value":"'+gps.tel+'"}'; params.push(tel);
var result = sqldbjson.execSelectSQL(dbaccesser, 'selectgps', params);
var resultJson = JSON.parse(result);
オブジェクトの追加
 
SecureServlet#getScriptNewProperties()を実装(オーバーライド)することにより、
独自のグルーバルオブジェクトを定義できます。 getScriptNewProperties()メソッドの戻り値Mapに
key:グローバルオブジェクト名、value:提供したいインスタンスを設定することにより、
独自のグルーバルオブジェクトを追加できます。
LiveConnect
 
下記サンプルのように、クラスパスにあるJavaクラスのインスタンスをスクリプト内より
直接生成できます。
 
<serverscript>
var url = request.getParameter("remoteurl");
var net = new java.net.URL(url);
var con = net.openConnection();
var reader = new java.io.BufferedReader(new java.io.InputStreamReader(con.getInputStream()));
var readData = reader.readLine();
while(readData){
  serverout.write(readData);
  serverout.write("\n");
  readData = reader.readLine();
}
</serverscript>
E4X
 
RhinoとApache XMLBeansの組合わせで提供されるXML解析/操作機能です。
下記のサンプルのように、XML操作が直感的に行えます。
詳細については、Rhinoのサイトを参照してください。
 
var rssxml = new XML(xmlData);
for(var temp1 in rssxml..item.title) {
  serverout.write(rssxml..item.title[temp1]);
  serverout.write("<br>\n");
}
●documentオブジェクトの利用
 
onloadserver属性に指定した関数では、documentオブジェクトへの参照が可能になります。
この場合、完全に解析されたHTMLがオブジェクトとして参照できるため、埋込み型のスクリプトレットにて動的に生成された箇所への参照も可能となります。
ただし、HTMLは完全なXMLドキュメントとする必要があります。
 
・基本スクリプトレット
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=shift-jis"/>
<title>test</title>
<serverscript language="JavaScript" type="text/javascript" src="DocumentTest.js"/>
</head>
<body onload="init()" onloadserver="getValue()">
Document test<br/>
<br/>
<serverscript>
serverout.write("<div id='doctest'>Documentをサポートしました</div>");
serverout.write("<br/>");
</serverscript>
<a href='./DocumentTest'>戻る</a>
</body>
</html>
 
・外部スクリプトレット
function getValue() {
    var targetNode = document.getElementsByTagName("div").item(0);
    if(targetNode){
        var testValue = targetNode.getFirstChild().getNodeValue();
        targetNode.appendChild(document.createElement("br"));
 
        if(document.getCookie("start")) {
            targetNode.appendChild(document.createTextNode(document.getCookie("start").getValue()));
        }else{
            targetNode.appendChild(document.createTextNode("No Cookie"));
        }
 
        var d = new Date();
        var value = d.getHours() + ":" + d.getMinutes() + " :" + d.getSeconds();
        document.setCookie("end", value, -1);
    }
}
●mongodbオブジェクトの利用
 
mongodbオブジェクトはMongoDB Java DriverをRhinoでラップしたオブジェクトです。MongoDBで公開しているRhino版JavaScriptとはクラス構成が異なっています。MongoDB定義ファイル(デフォルトは~/WEB-INF/mongodb.xml)にMongoDB接続情報を定義します。
 

関数名

概要

戻り値
mongodb.getCollection(String "コレクション名")

任意のコレクションを応答します。
指定したコレクションが存在しない場合はnullを応答します。

com.mongodb.DBCollection
mongodb.createCollection(String "コレクション名") 指定した名称で空のコレクションを作成し、
生成したコレクションを応答します。
com.mongodb.DBCollection
mongodb.createDBObject() コレクションに格納するオブジェクトを生成します。 com.mongodb.BasicDBObject
mongodb.createDBQuery() コレクションを操作するためのクエリオブジェクトを生成します。com.mongodb.BasicDBObject
mongodb.encodeObject(BSONObject BSONオブジェクト) 指定されたオブジェクトをシリアライズするための
書込みオブジェクトを応答します。
org.bson.io.OutputBuffer
mongodb.decodeObject(OutputBuffer エンコードされたオブジェクト) 指定された書込みオブジェクトより、シリアライズされた
オブジェクトを生成(デコード)します。
com.mongodb.BasicDBObject
mongodb.close() MongoDBとの接続セッションを閉じます。 
mongodb.getMongo() 接続中のMongoDBを示す、オブジェクトを応答します。 com.mongodb.Mongo
例)
<html>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<body>
<serverscript>
 var col1 = mongodb.getCollection("test1");
 serverout.write("test1<br/>");
 serverout.write(col1.findOne());
 serverout.write("<hr/>");

 var col2 = mongodb.getCollection("test2");
 serverout.write("test2<br/>");
 var docRemove = mongodb.createDBObject();
 docRemove.put("b",66);
 col2.remove(docRemove);
 docRemove = mongodb.createDBObject();
 docRemove.put("b",77);
 col2.remove(docRemove);
 docRemove = mongodb.createDBObject();
 docRemove.put("b",88);
 col2.remove(docRemove);

 var cur = col2.find();
 while(cur.hasNext()) {
  serverout.write(cur.next());
  serverout.write("<br/>");
 }
 var doc = mongodb.createDBObject();
 doc.put("b",66);
 col2.insert(doc);
 doc = mongodb.createDBObject();
 doc.put("b",77);
 col2.insert(doc);
 doc = mongodb.createDBObject();
 doc.put("b",88);
 col2.insert(doc);

 serverout.write("--------insert--------<br/>");
 var query = mongodb.createDBQuery();
 query.put("b", 77);
 var cur = col2.find(query);
 while(cur.hasNext()) {
  serverout.write(cur.next());
  serverout.write("<br/>");
 }
</serverscript>
<br/>
<a href='.'>戻る</a>
</body>
</html>
●dbaccesserオブジェクトの利用
 
dbaccesserオブジェクトはJDBCを利用したDBアクセス処理を、スクリプトレットより簡単に利用することを可能にする為のオブジェクトです。SQL定義ファイル(デフォルトは~/WEB-INF/db_config.xml)にJDBC接続情報およびスクリプトレットにて利用するSQLステートメントを定義します。
 
例1
<html>
<head>
<META http-equiv="Content-Type" content="text/html; charset=Shift-jis">
<title>DB List</title>
</head>
<body>
<table border='1'>
<tr><td>no</td><td>name</td><td> </td></tr>
<serverscript>
var con = dbaccesser.getConnection();
var resultList = dbaccesser.selectQuery("listsql", con, null);
var i=0;
for(i=0;i<resultList.size();i++) {
    serverout.write("<tr>\n");
    serverout.write("<form action='./DBDelete' method='post'>\n");
    var record = resultList.get(i);
    var keys = record.keySet().toArray();
    for(var j=0;j<keys.length;j++) {
        var key = keys[j];
        serverout.write("<td>"+helper.HTMLEncode(record.get(key))+"</td>\n");
        serverout.write("<input type='hidden' name='"+helper.HTMLEncode(key)+"' value='"+record.get(key)+"' />\n");
    }
    serverout.write("<td><input type='submit' name='submit' value='delete' /></td>\n");
    serverout.write("</form>\n");
    serverout.write("</tr>");
}
con.rollback();
con.close();
</serverscript>
</table>
<br><br>
<br/>
<a href='./DBTest'>戻る</a>
</body>
</html>
 
例2
<html>
<head>
<META http-equiv="Content-Type" content="text/html; charset=Shift-jis">
<title>DB Delete Result</title>
</head>
<body>
<servervalidation>
no=\d{1,5},true
name=.*,true
</servervalidation>
下記を追加しました。<br/>
<serverscript>
var no = request.getParameter("no");
var name = request.getParameter("name");
var paramNo = dbaccesser.createIntDBParam(new Number(no));
var paramName = dbaccesser.createStringDBParam(name);
var params = new Array();
params[0] = paramNo;
params[1] = paramName;
var con = dbaccesser.getConnection();
dbaccesser.updateQuery("insertsql", con, params);
con.commit();
con.close();
serverout.write("no:"+no+"<br/>\n");
serverout.write("name:"+name+"<br/>\n");
</serverscript>
<br><br>
<br/>
<a href='./DBTest'>戻る</a>
</body>
</html>
 
・getConnectionメソッド
 DBコネクションを確立し、コネクションオブジェクトを返します。
 SQL処理を実行した後、トランザクションの結果反映(commitかrollback)およびクローズ(close)
 を実施してください。
・createIntDBParamメソッド
・createStringDBParamメソッド
・createBooleanDBParamメソッド
・createLongDBParamメソッド
・createFloatDBParamメソッド
・createDoubleDBParamメソッド
・createDateDBParamメソッド
・createTimestampDBParamメソッド
・createBlodDBParamメソッド
 create***DBParamメソッドは、準備型ステートメントオブジェクトの変数”?”に指定する値を作成する
 関数群です。それぞれのフィールド型に合わせて、適切な関数を使用します。
 ステートメント実行時には、変数の順番通りに作成した変数オブジェクトが格納される配列を引数に渡
 します。
・selectQueryメソッド
 SELECTステートメントを実行する際に利用する関数です。
 第一引数:SQL定義ファイルの任意のSQLステートメントのキー名を指定します。
 第二引数:getConnectionメソッドで取得したコネクションオブジェクトを指定します。
 第三引数:create***DBParamメソッドにて作成した、変数オブジェクトの配列を指定します。
 戻り値:ステートメント実行結果の配列を応答します。
     配列内の各レコードはjava.util.Mapクラスで構成され、フィールド名がキーに格納されます。
・updateQueryメソッド
 更新系ステートメント(UPDATE、INSERT、DELETE等)を実行する際に利用する関数です。
 第一引数:SQL定義ファイルの任意のSQLステートメントのキー名を指定します。
 第二引数:getConnectionメソッドで取得したコネクションオブジェクトを指定します。
 第三引数:create***DBParamメソッドにて作成した、変数オブジェクトの配列を指定します。
 戻り値:ありません。失敗した場合は例外が発生します。