Struts Scripting

Struts Scriptingは、 Strutsの付属ライブラリの1つで、 StrutsのActionをスクリプト言語で記述できるようにするものです。 基盤技術としてBSF(Bean Scripting Framework)を利用しており、 これをサポートしているJava VM上の言語処理系であればどれでも使えます。
Struts Scriptingは、Struts自身と同じコミュニティで開発、配布されており、 単独での最新(おそらく最終)バージョンは1.0.1で、 その後はStruts本体と同じ場所で配布、同じバージョン(1.3.10など)を名乗るようになりました。
Struts Scriptingを使うと、

  1. 記述が少なく、早く作れる
  2. クラスのコンパイルが不要(Eclipse等を起動する必要がない)
  3. Webアプリケーションも再起動の必要がない
等の利点があります。ただし、レコードBean(いわゆるValue Object) やアクションForm Bean、バリデータなどはスクリプト言語では書けないので、 これらは引き続きJavaで書く必要があります。

設定手順はUser Guide で説明されている通りです。

  1. Strutsのダウンロードページから、 「Library」をダウンロードします。 (既にフレームワークとしてのStrutsを利用中ならば、入手時の配布物を見ましょう)
    中に入っている、struts-scripting-1.3.*.jar と、bsf-2.3.0.jar を入手します。
    またはBSFの実装は、 Jakarta BSFのホームページからも入手できます。 私はバージョン2.3.0と2.4.0で動作を確認できました。
  2. 適当に自分の好きなJava VM上の言語処理系のJARファイルを入手します。 例えば、Java上で動くPythonことJythonや、 新興のスクリプト言語Groovyなんかがお勧めですが、 こいつらのJARファイルは大体3〜4MBあります。
    Actionをスクリプト言語で手軽に記述する、という目的に最もかなう言語処理系の最右翼は BeanShellです。 BeanShellは必要最小限のインタープリタ機能しか持っていませんが、 JARファイルのサイズは140KB台と、手軽に導入して試すことができます。
  3. 設定元のStruts Webアプリケーションはもう大体できていると仮定して、 その/WEB-INF/libに、上記で入手した「struts-scripting-1.3.*.jar」「bsf-2.*.jar」 及び、言語処理系のJARファイルを配置します。
    Groovyの場合は、groovy-all-1.6-RC-3.jarのような名前のファイルです。
    Jythonの場合は、その名もjython.jarです。
    BeanShellの場合は、本体 bsh-core-2.0b4.jar と、別に bsh-bsf-2.0b4.jar の2ファイルが必要です。
  4. (オプション:Groovyの場合)
    User Guide に、BSFでサポートされている各言語と、それらの標準のファイル拡張子が載っています。 言語処理系が載っていない場合(Groovyは載ってません)、 及びスクリプトのファイル拡張子を標準以外のものにしたい場合は、 「struts-scripting.properties」というファイルを書いて/WEB-INF/classesに配置します。 例えば

    struts-scripting.engine.groovy.class=org.codehaus.groovy.bsf.GroovyEngine
    struts-scripting.engine.groovy.extensions=gv,groovy
    

    それでどの言語を選ぶか、は20数種類もある現状では個人の好みでどれでもいい、 というのはその通りなんですが、 通常はスクリプト言語で書いたActionを検証したら、 実運用版はJavaで書き直すことになると思います。 したがって個人的な思い入れは別にして、 Javaに似たスクリプト言語を使うのが適切といえましょう。 つまり、BeanShell、Groovy、Jythonがやはり扱いやすくていいと思います。
  5. スクリプトファイルを書き、適当なディレクトリを作ってそこに配置します。 例えば「/WEB-INF/scripts」などという専用の置き場を用意します。 Groovy、BeanShellは多分一番簡単です。Jythonの場合は、最初の1回だけ、 BSFなどのjarファイルの場所を処理系に伝えるため、スクリプト冒頭に次の記述が必ず必要なようです。

    import sys
    sys.add_extdir("/{Webアプリケーションのディレクトリ}/WEB-INF/lib")
    

    Groovyで最も簡単に動作確認するには、次のような/WEB-INF/scripts/test.gvを作ると良いでしょう。

    request.setAttribute("result", "こんにちは。");
    struts.setForwardName("success");
    

    対応するJSPはtest.jspと名づけて

    <p>メッセージ:${result}</p>
    

    こんなもん(htmlタグ等は除く)でokです。
  6. struts-config.xmlにActionの定義を追加します。
    typeにScriptActionを、parameterにスクリプトのパスを設定します。

    <action path="/test"
        type="org.apache.struts.scripting.ScriptAction"
        parameter="/WEB-INF/scripts/test.gv">
        <forward name="success" path="/test.jsp" />
    </action>
    

    これで「http://localhost:8080/sampleapp/test.gv」 にアクセスして、動作が確認できます。(「メッセージ:こんにちは。」と出ればok)
    実際に使うときは以下のように、nameやinputも必要になりましょう。

    <action path="/SelectShopItem" name="SelectShopItemForm" input="/SelectShopItem.jsp"
        type="org.apache.struts.scripting.ScriptAction"
        parameter="/WEB-INF/scripts/SelectShopItem.gv">
        <forward name="success" path="/SelectShopItem.jsp" />
    </action>
    

    スクリプト自体にパラメータを変数の形で渡したい場合には、parameterの部分を 「parameter="/WEB-INF/scripts/SelectShopItem.gv?name=masao&home=kyoto"」 のように、CGIに渡すパラメータのノリで「名前=値」の組を書けばokです。 (User Guideの記述はタイプミスかな?今度自分でも試して見ます)
    またはStruts 1.3では、1.3からサポートされた <set-property key="key1" value="val1">を使うとokです。


一般的なスクリプトのテンプレート

import mylib.mypack.*

form = struts.form
name = form.name
address = form.address

// ...

session.setAttribute("result", recordList);
struts.setForwardName("success");

言語がスクリプティヴャになったところで、Actionの役割は変わりません。
もっともありふれた処理は、
  1. フォームから入力値を受け取り
  2. それを元に何かの処理をして
  3. 結果を保存して
  4. successにフォワードする。
となります。 上のスクリプトはGroovyの例です。 この範囲内ではBeanShellもほとんど同じですが、 BeanShellはGroovyと異なり文末のセミコロンを省略できません!!のでそこだけ注意が必要です。
なお当然のことですが、StrutsのActionとしての機能を支援するために、 上にも一部見られるように組み込み(暗黙に定義されている)変数がいくつかあります。
request、response、session、application、log の5つはJSPやJSTLにも出てくるので説明の必要はないでしょう。
これ以外に、Strutsの枠内の変数で頭にstruts.をつけるものもあります。 struts.action、struts.form、struts.mapping、struts.messages、struts.forward の5つです。 これら10個の変数を使うことで、とても簡単にActionのすべき処理を記述することができます。 (簡単に、というのは通常複雑な業務ロジックはJavaかデータベース内に記述し、 スクリプト言語ではそれを順序だてて呼び出すという処理を記述するためです)

Server Side Java Index Top

(first uploaded 2007/01/02 last updated 2009/02/11, URANO398)

テレワークならECナビ Yahoo 楽天 LINEがデータ消費ゼロで月額500円〜!
無料ホームページ 無料のクレジットカード 海外格安航空券 海外旅行保険が無料! 海外ホテル