【ハウツー】
今流行のスクリプト言語 on JavaをBSFで体験する
3 Hello Jakarta BSF!
2006/10/11
BSFの成果物に同梱されているサンプルを実行してみよう。たとえばsamples/scripteduiにスクリプト言語からJava GUIにアクセスするサンプルがある。実行に必要になるJakarta Commons Loggingと、たとえばJavaScriptを実行するならRhinoの成果物を用意したうえで、プロンプト3.1のように実行する。すると、図3.2のようなアプリケーションが起動する。JavaScriptから作成したJava GUIである。
プロンプト3.1 samples/scripteduiにおけるJavaScript UIの実行例 - クラスパスに必要になる成果物の追加を忘れずに
% cd /pathto/bsf-2.4.0/samples/scriptedui/
% java -cp /pathto/bsf.jar:/pathto/commons-logging-1.1.jar:/pathto/js.jar:. ScriptedUI ui.js
% java -cp /pathto/bsf.jar:/pathto/commons-logging-1.1.jar:/pathto/js.jar:. ScriptedUI ui.js
|
|
図3.2 JavaScriptからJava GUI APIを叩いて作成したGUIアプリケーション |
JavaScriptのスクリプトを実行するために用意されているJavaプログラムがリスト3.3だ。本質的には、BSFManagerインスタンスからexec()メソッドを使ってスクリプトを実行していることがわかる。ソースコードを見ればわかるように、実行するスクリプトの種類は自動的に判別される。
リスト3.3 ScriptedUI.java - BSFを使ってスクリプト言語を実行するためのソースコード
/* This example shows how a Java app can allow a script to customize
a UI */
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import org.apache.bsf.*;
import org.apache.bsf.util.*;
public class ScriptedUI {
BSFManager mgr = new BSFManager ();
public ScriptedUI (String fileName) {
Frame f = new Frame ("Application's Main Frame");
f.addWindowListener (new WindowAdapter () {
public void windowClosing (WindowEvent e) {
System.exit (0);
}
});
Panel p = new Panel ();
f.add ("Center", p);
f.add ("North", new Button ("North Button"));
f.add ("South", new Button ("South Button"));
mgr.registerBean ("centerPanel", p);
mgr.registerBean ("parentFrame", f); // --rgf, 2006-08-08: to allow Jacl to get to frame ...
// exec script engine code to do its thing for this
try {
String language = BSFManager.getLangFromFilename (fileName);
FileReader in = new FileReader (fileName);
String script = IOUtils.getStringFromReader (in);
mgr.exec (language, fileName, -1, -1, script);
} catch (BSFException e) {
System.err.println ("Ouch: " + e.getMessage ());
e.printStackTrace ();
} catch (IOException e) {
System.err.println ("Ouch: " + e.getMessage ());
e.printStackTrace ();
}
// now pack and show the frame
f.pack ();
// f.show(); // javac 1.5 warns to use f.show(), Apache build scripts abort as a result :(
f.setVisible(true); // available since Java 1.1
}
public static void main (String[] args) throws Exception {
if (args.length != 1) {
System.err.println ("Usage: java ScriptedUI filename");
System.err.println (" where filename is the name of the script");
System.exit (1);
}
new ScriptedUI (args[0]);
}
}
a UI */
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import org.apache.bsf.*;
import org.apache.bsf.util.*;
public class ScriptedUI {
BSFManager mgr = new BSFManager ();
public ScriptedUI (String fileName) {
Frame f = new Frame ("Application's Main Frame");
f.addWindowListener (new WindowAdapter () {
public void windowClosing (WindowEvent e) {
System.exit (0);
}
});
Panel p = new Panel ();
f.add ("Center", p);
f.add ("North", new Button ("North Button"));
f.add ("South", new Button ("South Button"));
mgr.registerBean ("centerPanel", p);
mgr.registerBean ("parentFrame", f); // --rgf, 2006-08-08: to allow Jacl to get to frame ...
// exec script engine code to do its thing for this
try {
String language = BSFManager.getLangFromFilename (fileName);
FileReader in = new FileReader (fileName);
String script = IOUtils.getStringFromReader (in);
mgr.exec (language, fileName, -1, -1, script);
} catch (BSFException e) {
System.err.println ("Ouch: " + e.getMessage ());
e.printStackTrace ();
} catch (IOException e) {
System.err.println ("Ouch: " + e.getMessage ());
e.printStackTrace ();
}
// now pack and show the frame
f.pack ();
// f.show(); // javac 1.5 warns to use f.show(), Apache build scripts abort as a result :(
f.setVisible(true); // available since Java 1.1
}
public static void main (String[] args) throws Exception {
if (args.length != 1) {
System.err.println ("Usage: java ScriptedUI filename");
System.err.println (" where filename is the name of the script");
System.exit (1);
}
new ScriptedUI (args[0]);
}
}
JavaScriptからJava GUI APIを使っているソースコードはリスト3.4のとおり。JavaScriptにおいてJavaクラスの生成が実行されていることがわかる。
リスト3.4 ui.js - JavaScriptからJava GUI APIを使っているソースコード
/* pick up the center panel bean */
p = bsf.lookupBean ("centerPanel");
/* set the layout manager to border */
p.setLayout (new java.awt.BorderLayout ());
/* add a few things */
p.add ("Center", new java.awt.Label ("Middle from JavaScript"));
p.add ("North", new java.awt.TextField ("north text from JavaScript"));
p.add ("South", new java.awt.TextField ("south text from JavaScript"));
p.add ("East", new java.awt.Button ("inner east from JavaScript"));
p.add ("West", new java.awt.Button ("inner west from JavaScript"));
/* configure p a bit */
p.setBackground (java.awt.Color.red);
/* configure the frame that p is in */
f = p.getParent ();
f.setTitle ("Hello from JavaScript (title reset from JavaScript)");
p = bsf.lookupBean ("centerPanel");
/* set the layout manager to border */
p.setLayout (new java.awt.BorderLayout ());
/* add a few things */
p.add ("Center", new java.awt.Label ("Middle from JavaScript"));
p.add ("North", new java.awt.TextField ("north text from JavaScript"));
p.add ("South", new java.awt.TextField ("south text from JavaScript"));
p.add ("East", new java.awt.Button ("inner east from JavaScript"));
p.add ("West", new java.awt.Button ("inner west from JavaScript"));
/* configure p a bit */
p.setBackground (java.awt.Color.red);
/* configure the frame that p is in */
f = p.getParent ();
f.setTitle ("Hello from JavaScript (title reset from JavaScript)");
ほかにもいくつかのスクリプト言語で作成したプログラムを実行するサンプルが用意されているので、興味がある言語について試してみるといいだろう。
ヘッドライン
- Active Directory誕生10周年記念セミナーが2月27日に開催[12:26 2/10]システム管理
- NEC、サイオスら、自動バックアップバック「TWIN NAS 2TB パック」発表[11:45 2/10]システム管理
- グレープシティ、"Excel機能"を提供する.NETコンポーネントの新版発表[11:22 2/10]プログラミング
- トレンドマイクロ、USBメモリ型ウイルス検索製品「Portable Security」発表[10:42 2/10]セキュリティ
- 【コラム】FileMaker×PHPで作る、簡単・便利なWebアプリ 第49回 結果セットの取扱いに特化したクラス、FileMaker_ResultSet(2)[10:18 2/10]プログラミング
- CSS/HTMLリファレンスマニュアル、最新ブラウザ互換情報[09:00 2/10]JavaScript / CSS / HTML
- 【レビュー】BOOK REVIEW - 現場に振り回されるだけのSE人生がイヤならチカラをつけよう[09:00 2/10]SE力
- 【レポート】暗号2010年問題に向け「いつまでに何をすべきか」 - ベリサインが説明[08:00 2/10]セキュリティ
- ルネサス、RXファミリ第3弾としてモータ制御向け「RX62T」を製品化[07:00 2/10]エレクトロニクス
- Rambus、次世代携帯機器向けメモリ「モバイルXDR」を発表[21:16 2/9]エレクトロニクス







