スクリプトレットについて

●ファイル名／格納先
| 1つのScriptletに対して、最低１つのスクリプトファイルを作成する必要があります。 作成するスクリプトレットは、以下の２ファイルです。
|  | 〜 | 処理を実行するスクリプトレット | 必須
|  | 〜_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>
●シーケンス管理
| サイトマップをXMLで記述する事により、ページ遷移を管理します。 サイトマップに定義されていないパス（スクリプト）、および定義されていない遷移へのアクセスはエラーとなります。
|  | ノード名 | 概要 | ノードタイプ | 必須
|  | site | ルートエレメントノード、必ずsiteノードで定義を開始する必要があります。 | エレメント | ◯
|  |  | url | ドキュメントルートのURLを定義します。 | アトリビュート |
|  |  | root_path | コンテキスト名（パス）を定義します。 | アトリビュート |
|  |  | version | 1.0を指定します。 | アトリビュート | ◯
|  |  | class | デフォルトのScriptletのクラスを定義します。 | アトリビュート | ◯
|  |  | page | 各ページ毎に定義します。 | エレメント | ◯
|  |  |  | path | ページのパスを定義します（コンテキスト名を含まず、かならず”/”で始まります） ※HttpServletRequest#getRequestURIの戻り値 | アトリビュート | ◯
|  |  |  | anyaccess | trueまたはfalseを定義します。 全てのページからのアクセスを許可します。コンテキストの最初のページには、必ずtrueを定義します ※未定義の場合はfalse | アトリビュート |
|  |  |  | backward | trueまたはfalseを定義します。 ページ遷移上の次ページからの戻りを許可する場合にtrueを定義します。 ※未定義の場合はfalse | アトリビュート |
|  |  |  | class | Scriptletのクラスを定義します。 | アトリビュート |
|  |  |  | page | 次ページを定義します。 次ページを子ノード、次々ページを孫ノード…として定義して行きます。 | エレメント |
| サイトマップXMLは、WEB-INF/sitemap.xmlに定義するかWEB-INF/config.xmlに任意のパスを定義する必要があります。 例： <entry key='sitemap'>/usr/local/foo/sitemap.xml</entry>
●スクリプレットの記述
| スクリプトレットの記述には、以下の仕様に従って、それぞれのファイルへ記述を行う必要があります。
|  | 〜 | サイトマップに定義されたページパスおよびsitemap.xmlに定義されたurl-patternと同一名でスクリプトファイルを定義します。サイトマップ定義とアクセス条件が適合しない場合、INVALID_ACCESSとなり、HTTPレスポンスコード403等（任意の設定が可能）が戻されます。
|  | 〜_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で提供される記述方式が実装可能です。後に記述する、LiveConnectや E4X(要Apache XMLBeans)等、強力な言語仕様です。 また、スクリプトレット用に、いくつかの特別なグローバルオブジェクトも 追加しました。
●予約グローバル・オブジェクト名（追加分のみ）
| 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）です。
| dbaccesser | DB汎用アクセスオブジェクト db_config.xml（デフォルト）に定義したDBアクセス設定、およびSQLをスクリプトレットより利用する事で、DBアプリケーションを簡単に構築可能です。 DB設定XMLは、WEB-INF/db_config.xmlに定義するかWEB-INF/config.xmlに任意のパスを定義する必要があります。 例： <entry key='dbconfig'>/usr/local/foo/db_config.xml</entry>
●オブジェクトの追加
| SecureServlet#getScriptNewProperties()を実装（オーバーライド）することにより、 独自のグルーバルオブジェクトを定義できます。 getScriptNewProperties()メソッドの戻り値Mapに key：グローバルオブジェクト名、value：提供したいインスタンスを設定することにより、 独自のグルーバルオブジェクトを追加できます。
●LiveConnect
| Rhinoの強力な機能です。 下記サンプルのように、クラスパスにある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); } }
●dbaccesserオブジェクトの利用
| dbaccesserオブジェクトはJDBCを利用したDBアクセス処理を、スクリプトレットより簡単に利用することを可能にする為のオブジェクトです。SQL定義ファイル（デフォルトは~/WEB-INF/db_config.xml）にJDBC接続情報およびスクリプトレットにて利用するSQLステートメントを定義します。
| 例１ <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>
| 例２ <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メソッドにて作成した、変数オブジェクトの配列を指定します。 戻り値：ありません。失敗した場合は例外が発生します。