BSFメモ

作成 2002/9/7

BSFって何

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上でBSFを実行してみます。JSP上での実行には、以下の方法があります。

ページ言語を指定する方法は、JSPコンテナが対応している必要があり、現在Tomcatはパッチが必要だとかマニュアルに書いていて、パッチがすぐ発見できなかったので、やめました。ここでは、BSF用のタグライブラリを利用します。また、言語はjavascriptを利用しようと思うので、Rhino(JavaScriptをJavaであれこれするエンジン)を別途ダウンロードします。

ここで利用したライブラリは以下です。

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でのBSFの利用

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のバージョンによってうまく動作しない場合があるのが困りものかも。


もどる