新着記事

2004年10月22日

WebObjectsライブラリ Project Wonder サンプルズ#5 WOOgnl.framework

WebObjectsのオープンソースライブラリ Project Wonder のフレームワークの一つ、WOOgnl.framework。


WebObjectsのwodファイルに、「〜」に続けてOgnl式を書いておくと、そのOgnl式が評価されるようになります。



まずはサンプルを見てもらいます。

計算を行う。


wodファイルに下のように書くと、WOStringのvalueは、実行時に文字列 "7"に変換、表示されます。

String1: WOString {
value = "〜2 + 5";
}

"〜"の次に、評価して欲しいOgnl式を書きます。

文字列を結合する


例えば、ある人を表すデータがあるとします。
それぞれの人のデータは、姓と名を持っています。


ここで、その人のフルネームを表示する時にどうしますか?


姓と名の文字列を結合して返すメソッドを用意しますか?
もしくは、WOStringを2つ用意して並べますか?


そんな時に、このWOOgnl.frameworkを使うと、下のように書けば済んでしまいます。


/**
* 姓。文字列の結合用。
*/
public String familyName() {
return "姓";
}
/**
* 名。文字列の結合用。
*/
public String givenName() {
return "名";
}


String3: WOString {
value = "〜familyName() + ' ' + givenName()";
}

Ognl式で、メソッド、変数にアクセスすることができます。


person().name()

というように繋げることもできます。

staticメソッドの呼び出し


staticメソッドを(変数も)呼び出すことができます。

呼び出す時は、クラス名をフルネームで。

/**
* static メソッド。
*/
public static String statisMethodValue() {
return "this method is static method.";
}


String2: WOString {
value = "〜@WOOgnl.WOOgnlSample@statisMethodValue()";
}


引数を渡す。


メソッドに引数を渡すこともできれば、
引数付きのメソッドを呼び出して返り値を受け取ることもできます。


String6: WOString {
value = "〜setChangingValue(\"second value\")";
}
String4: WOString {
value = "〜alphs.objectAtIndex(alphIndex)";
}


「"」は\でエスケープします。


WOBuilderのInspectorからエスケープを入れようとすると、
下のように、勝手にエスケープされるので気をつけましょう。

String6: WOString {
value = "〜setChangingValue(\\"second value\\")";
}



上から順に評価される。


ファイルの上から順に、パース、評価されていくので、
下のようにすると、だんだん値が変わっていきます。

<WEBOBJECT NAME=String5></WEBOBJECT>
<WEBOBJECT NAME=String6></WEBOBJECT>
<WEBOBJECT NAME=String8></WEBOBJECT>
<WEBOBJECT NAME=String7></WEBOBJECT>
<WEBOBJECT NAME=String9></WEBOBJECT>


String5: WOString {
value = "〜getChangingValue()";
}

String6: WOString {
value = "〜setChangingValue(\"second valu\")";
}

String7: WOString {
value = "〜setChangingValue(\"third value\")";
}

String8: WOString {
value = "〜getChangingValue()";
}

String9: WOString {
value = "〜getChangingValue()";
}


private String changingValue = "first value";
public String getChangingValue() {
return this.changingValue;
}
public void setChangingValue(String v) {
this.changingValue = v;
}


条件式、ループ


他にも、条件式に、foreachループのようなこともできるのですが、
後は自分で調べていただきたい。





さて、この便利なWOOgnl.framework。使うにはどうしたら良いかというと。

WOOgnl.frameworkをプロジェクトに入れるだけ
です。


プロジェクトに加えると、それだけでWOOgnl.frameworkが使えるようになります。とってもお手軽ですね。





おまけ。その1。



「〜」が、Ognl式開始の目印になっているのだけど、

これが都合の悪い場合があるかもしれません。

もしくは、パース時に、パーミッションチェックだの、バリデーションだの

カスタムな処理を加えたい場合もあるかもしれません。


そんなときは、

ognl.webobjects.WOOgnlのsetFactory()メソッドの引数に、

カスタムな実装をしたWOOgnlの継承クラスを渡せば、

WOOgnl.frameworkの挙動を変更することができます。

(サンプルソースを後ろの方に用意しておきます。)

おまけ。その2。


環境変数"ognl.active"に"false"をセットすると、WOOgnl.framworkがパース処理を行わないようにすることができます。




以下、サンプルソースの一部。



WOOgnlSample.java


package WOOgnl;

import com.webobjects.foundation.*;
import com.webobjects.appserver.*;
import com.webobjects.eocontrol.*;
import com.webobjects.eoaccess.*;

/**
* WOOgnl.frameworkのサンプルソースです。
*/
public class WOOgnlSample extends WOComponent {

/**
* 本クラスを生成します。
*/
public WOOgnlSample(WOContext context) {
super(context);
}

/**
* static メソッド。
*/
public static String statisMethodValue() {
return "this method is static method.";
}

/**
* 姓。文字列の結合用。
*/
public String familyName() {
return "姓";
}
/**
* 名。文字列の結合用。
*/
public String givenName() {
return "名";
}

/**
* nullを返すだけのメソッド。
*/
public WOComponent nullAction() {
return null;
}

/**
* アルファベットのリスト。
*/
public NSArray alphs = new NSArray(new Object[]{
"A", "B", "C", "D", "E", "F", "G", "H", "I",
"J", "K", "L", "M", "N", "O", "P", "Q", "R",
"S", "T", "U", "V", "W", "X", "Y", "Z",
});
/**
* 引数つきメソッド呼び出し用。
*/
public int alphIndex;

/**
* 順番にパースされていく様子を示すためのメソッド。
*/
private String changingValue = "first value";
/**
* changingValueのgetメソッド。
*/
public String getChangingValue() {
return this.changingValue;
}
/**
* changingValueのgetメソッド。
*/
public void setChangingValue(String v) {
this.changingValue = v;
}
}



WOOgnlSample.wo/WOOgnlSample.wod

<HTML>
<HEAD>
<META NAME="generator" CONTENT="WebObjects 5.2">
<TITLE>WOOgnlサンプルソース</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<WEBOBJECT NAME=Form1>計算を行う。<BR>
"〜2 + 5"<BR>
<WEBOBJECT NAME=String1></WEBOBJECT><BR>
<BR>
<BR>
static メソッドの呼び出し。<BR>
"〜@WOOgnl.WOOgnlSample@statisMethodValue()"<BR>
<WEBOBJECT NAME=String2></WEBOBJECT><BR>
<BR>
<BR>
文字列の連結<BR>
"〜familyName() + ' ' + givenName()"<BR>
<WEBOBJECT NAME=String3></WEBOBJECT><BR>
<BR>
<BR>
引数付きのメソッド呼び出し。<BR>
入力した順番のアルファベットを表示する。<BR>
"〜alphs.objectAtIndex(alphIndex)"<BR>
<WEBOBJECT NAME=TextField1></WEBOBJECT>
[<WEBOBJECT NAME=String4></WEBOBJECT>]<BR>
<BR>
<BR>
<WEBOBJECT NAME=String5></WEBOBJECT><BR>
<WEBOBJECT NAME=String6></WEBOBJECT><BR>
<WEBOBJECT NAME=String8></WEBOBJECT><BR>
<WEBOBJECT NAME=String7></WEBOBJECT><BR>
<WEBOBJECT NAME=String9></WEBOBJECT><BR>
<BR>
<BR>
<WEBOBJECT NAME=SubmitButton1>
</WEBOBJECT></WEBOBJECT>
</BODY>
</HTML>



WOOgnlSample.wo/WOOgnlSample.wod

Form1: WOForm {
multipleSubmit = true;
}

String1: WOString {
value = "〜2 + 5";
}

String2: WOString {
value = "〜@WOOgnl.WOOgnlSample@statisMethodValue()";
}

String3: WOString {
value = "〜familyName() + ' ' + givenName()";
}

String4: WOString {
value = "〜alphs.objectAtIndex(alphIndex)";
}

String5: WOString {
value = "〜getChangingValue()";
}

String6: WOString {
value = "〜setChangingValue(\"second valu\")";
}

String7: WOString {
value = "〜setChangingValue(\"third value\")";
}

String8: WOString {
value = "〜getChangingValue()";
}

String9: WOString {
value = "〜getChangingValue()";
}

SubmitButton1: WOSubmitButton {
action = nullAction;
}

TextField1: WOTextField {
numberformat = "0";
value = alphIndex;
}





ここより、下は、WOOgnl.javaの挙動を変えるソースのサンプル。


Application.java


package Main;

import com.webobjects.foundation.*;
import com.webobjects.appserver.*;
import com.webobjects.eocontrol.*;
import er.extensions.*;
import ognl.webobjects.*;
import WOOgnl.*;

public class Application extends ERXApplication {
public static void main(String argv[]) {
ERXApplication.main(argv, Application.class);
}
public Application() {
super();
// カスタムな処理を行う場合は、
// 下のコメントアウトを外します。
WOOgnl.setFactory(new CustomWOOgnl());
}
}



CustomWOOgnl.java

package WOOgnl;

import com.webobjects.foundation.*;
import com.webobjects.appserver.*;
import com.webobjects.eocontrol.*;
import com.webobjects.eoaccess.*;
import ognl.webobjects.*;

/**
* WOOgnl.javaを継承して、WOOgnl.framworkの挙動を
* 変更します。
*/
public class CustomWOOgnl extends WOOgnl {
/**
* コンストラクタ。
*/
public CustomWOOgnl(){
super();
}
/**
* デフォルトの"〜"ではなく、"#"を代わりに使用する。
*/
public String ognlBindingFlag() {
return "#";
}
}





最後に、今回使ったサンプルを、置いておきます。

WOOgnl サンプルソース
posted by 小見 拓 at 05:01| Comment(0) | TrackBack(0) | Project Wonder | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。
この記事へのトラックバックURL
http://blog.seesaa.jp/tb/863684
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック
記事検索
 
カテゴリ
最近のコメント
QKCのインストール [3-4/18]
 ⇒ kova (05/23)
calendar.vimには日記をつける機能があったらしい。
 ⇒ とまと (03/07)
最近よく見るようになったvimスクリプトのコメントの書き方
 ⇒ 小見 拓 (02/13)
 ⇒ kana (02/11)
vimエディタ ヘルプのgrep
 ⇒ みかん (07/15)
指定したカラム位置にテキストを流し込む (vimエディタ)
 ⇒ こみ (03/20)
 ⇒ とおりすがり (03/19)
 ⇒ こみ (03/18)
 ⇒ takayama (03/18)
tempfile -- Generate temporary files (Mac OSX)
 ⇒ take3 (01/20)
 ⇒ こみ (01/19)
 ⇒ take3 (01/18)
 ⇒ こみ (01/17)
 ⇒ take3 (01/14)
WebObjectsのオープンソースプロジェクト Project Wonderってなんじゃろな。#2
 ⇒ (06/30)
 ⇒ Tetsuya Kuramochi (06/29)
 ⇒ Tetsuya Kuramochi (06/29)
WebObjectsのオープンソースプロジェクト Project Wonderってなんじゃろな。#1
 ⇒ (06/03)
 ⇒ Tetsuya Kuramochi (06/02)
最近のトラックバック
vimエディタで「文字コード、改行コードを変更して保存する。」
 ⇒ window.closed (04/25)
 ⇒ himesuke’s STEP-log (03/18)
 ⇒ PukiWiki/TrackBack 0.2 (05/07)
vimエディタの折りたたみ機能の話。その2 (foldmethod=syntax)
 ⇒ 俺の基地 (PukiWiki/TrackBack 0.3) (04/20)
ログファイルを監視して、特定のキーワードが見つかったら、何らかのコマンドを実行する。
 ⇒ Apple Fan (10/16)
ファイル保存ダイアログの初期ディレクトリについての話 (vimエディタ話)
 ⇒ ナレッジエース (07/23)
:e <C-x> (編集中のファイルと同じディレクトリにあるファイルを開く。)
 ⇒ ボクノス (02/07)
Opening many files using wildcards.
 ⇒ PukiWiki Plus! (PukiWiki/TrackBack 0.4) (10/28)
 ⇒ 川o・-・)<2nd life (07/18)
vimエディタで印刷自由自在 その8 -エディタからの直接の印刷の代わりに、2html.vimスクリプトを使用する-
 ⇒ Knoppix Temporary Directory (PukiWiki/TrackBack 0.3) (02/19)
検索でマッチした対象に対して、置換を行う。(vimエディタ話)
 ⇒ 123net :: 開発日記 (12/31)
ごみ箱にファイルを叩き込むスクリプト。(vimエディタ)
 ⇒ "OSX" .app's :Macのアプリを便利、感動、面白をベースにほぼ日刊で紹介。 (11/26)
パーセント、%、percent でのカーソル移動 (vimエディタ話)
 ⇒ プログラミング言語 (10/11)
過去ログ
Profile
小見 拓
mail@nanasi.jp
小見と申します。
神奈川でデベロッパーやってます。
名無しのVIM使い

RSS 1.0


×

この広告は1年以上新しい記事の投稿がないブログに表示されております。