作成 2002/9/7
BSF(Bean Scripting Framework)は、Javaから他のスクリプト言語にアクセスするためのAPIです。Javascript、Python、Tclその他の言語をサポートしています。利用例としては、例えば、JSPページのJava以外の実装言語として、またはAntのScriptタスクなどでも利用されます(簡単な例をあとで紹介します)。BSFはもともと1999年にIBMのT.J. Watson研究所というところで生まれたそうです。そして、IBM Alphaworks、DeveloperWorksで開発が続けれ、その後Apacheに寄贈され、現在はApache BSFプロジェクトで開発が続けられています。
ここでは、JSP上でBSFを実行してみます。JSP上での実行には、以下の方法があります。
ここで利用したライブラリは以下です。
Taglibs BSFはリリース、マイルストンビルドが(今日この瞬間には)見当たらなかったので、ナイトリービルドを利用しました。Rhinoは、1.5R4.1だとうまく動かなかったので、1.5R3を利用しました。
その他の環境は、WindowsXP SP1、JDK1.4.2、Tomcat4.1.24です。
上でダウンロードしたアーカイブを解凍し、中から、xxx.jarをそれぞれ、WEB-INF/libの下にコピーします。BSFのタグライブラリもコピーしておきます。
myapp/ +-- WEB-INF/ | +-- lib/ | | +-- bsf.jar | | +-- js.jar | | +-- taglibs-bsf.jar | +-- taglibs-bsf.tld +-- hoge.jsp
次がJSPの例です。ここでは、暗黙オブジェクトのrequestから文字列を取得し、JavaSctiptの正規表現メソッドで文字列を置換し、requestに結果を入れています。タグライブラリはWEB-INF/taglibs-bsf.tldを直接しています。
リスト hoge.jsp
<%@ taglib uri="WEB-INF/taglibs-bsf.tld" prefix="bsf" %> <html> <body> <h2>BSF TEST</h2> <% request.setAttribute("msg", "hello"); %> <bsf:scriptlet language="javascript"> var msg = request.getAttribute("msg"); msg = msg.replace("l","h"); request.setAttribute("msg", msg); </bsf:scriptlet> <%=request.getAttribute("msg")%> </body> </html>
helloがJavaScriptを利用してhehooに変換されています。。。
実行結果
AntのScriptタグの利用はAntを拡張する一つの方法です。BSFを使って、scriptタグの中に他のスクリプト言語のプログラムを記述することができます。
ここで利用したライブラリは以下です。
BSFは最新版2.3では動作しないのでDevelper Worksからダウンロードします(これは、Antのscriptタスクが利用しているBSFクラスがそもそも違うため?)。ダウンロード先は上のリンクのとおりですが、Antマニュアルに書いています。Rhinoはさっきと同じものです。
その他の環境は、WindowsXP SP1、JDK1.4.2、Ant1.5.3-1です。
先に、bsf.jarとjs.jarを%ANT_HOME%/libにコピーしておきます。build.xmlの例は以下のようになります。
リスト build.xml
<project name="bsf1" default="bsf1"> <target name="bsf1"> <script language="javascript"> <![CDATA[ self.log("written by javascript"); var v = "hello"; project.setNewProperty("val1",v); ]]> </script> <echo message="${val1}"/> </target> </project>
実行結果
C:\test\antbsf>ant Buildfile: build.xml bsf1: [script] written by javascript [echo] hello BUILD SUCCESSFUL Total time: 0 seconds
script内で利用できる暗黙オブジェクトがイマイチなぞですが、とりあえずはこんな感じ。
本家
http://jakarta.apache.org/bsf/
Jakartaの杜 BSF (翻訳ドキュメント)
http://jakarta.terra-intl.com/bsf/index.html
RADKRAFT (BSFを使ってみた人のページ)
http://kamakura.cool.ne.jp/oppama/jaco/bsf.html
http://kamakura.cool.ne.jp/oppama/ssja/taglibs-bsf.html
Using JavaScript with Ant
http://www.sitepen.com/ant/javascript.html
Ant Manual (Scriptタスクとlibrarydependencies)
http://ant.apache.org/manual/OptionalTasks/script.html
http://ant.apache.org/manual/install.html#librarydependencies
Java環境の中で他のスクリプト言語が動くのが不思議な感覚です。どんな場面で使うのか、というのが、今現在、ちょっとしっくりきていませんが、まあ、いろいろ使い道もあるんでしょう。
また、BSFに限ったことではありませんが、ブリッジとなるAPIが多いと(例えば、JSPページにJavaScriptを表示させる場合、JSPコンテナ→Taglibs(BSF)→BSF→Rhino)、各APIのバージョンによってうまく動作しない場合があるのが困りものかも。