新着記事

2004年12月06日

WebObjectsライブラリ Project Wonder サンプルズ#6 ERXFrameworkPrincipal

WebObjectsのオープンソースフレームワークProject Wonder
ERExtensions.frameworkに含まれる
er.extensions.ERXFrameworkPrincipalクラスを使うと、
アプリケーションのソースを変更する事無く、
フレームワーク固有の処理をアプリケーション実行時に行えるようになります。


使い方は、

アプリケーションで使用するフレームワークにer.extensions.ERXFrameworkPrincipalクラスを継承したクラスを用意する。
ERXFrameworkPrincipalクラスのfinishInitialization()メソッドが抽象メソッドとして宣言されているので、このメソッドを実装する必要があります。

次に、このERXFrameworkPrincipalクラスを継承したクラスを
アプリケーションで使用するフレームワークのInfo.plistのNSPrincipalClassに指定します。

WebObjects ERXFrameworkPrincipal Info.plistエントリ
xcodeの場合は、このようにInfo.plistに、NSPrincipalClassのエントリを追加します。
クラス名はフレームワーク名と同じにする事が多いそうな。


これで、アプリケーションの起動時に指定したERXFrameworkPrincipalクラスのサブクラスのfinishInitialization()メソッドが呼び出されるようになります。




以下、サンプルソースです。


package ERXFrameworkPrincipal;
import er.extensions.*;

/**
* er.extensions.ERXFrameworkPrincipalクラスのサンプルコードです。
*/
public class ERXFrameworkPrincipalSample
extends ERXFrameworkPrincipal {

/**
* 本クラスを生成します。
*/
public ERXFrameworkPrincipalSample() {
super();
// finishInitialization()メソッドとは呼ばれるタイミングが
// かなり違うことに注意してください。
System.out.println("generate ERXFrameworkPrincipalSample instance");
}

// 下のコードが無いとfinishInitialization()メソッドが
// 呼び出されません。
static {
setUpFrameworkPrincipalClass(ERXFrameworkPrincipalSample.class);
}

/**
* このメソッドがアプリケーション実行時に
* 呼び出されます。
* このメソッドにフレームワーク特有の処理を記述します。
*/
public void finishInitialization() {
System.out.println("call ERXFrameworkPrincipalSample " +
"finishInitialization()");
// Put your framework initialization code here
}
}





短いですが、今回は以上です。

今回使用したサンプルのソース。
ERXFrameworkPrincipalSample.tar.bz2



posted by 小見 拓 at 00:35| Comment(0) | TrackBack(0) | Project Wonder | このブログの読者になる | 更新情報をチェックする

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 | このブログの読者になる | 更新情報をチェックする

2004年08月27日

WebObjectsライブラリ Project Wonder サンプルズ#4 ERXBrowser

多くのWebアプリ用ライブラリと同じく、WebObjectsのライブラリ Project Wonderにも、やはりクライアントのブラウザ判定用の処理が用意されています。


それがer.extensions.ERXBrowserです。


このクラスのインスタンスは、er.extensions.ERXSessionのbrowser()メソッドで取得できます。


ERXSessionは、Project Wonderのインストール手順だと、Session.javaの親クラスになっているはずなので、


WebObjectsのKeyValueCodingを利用して、例えば、


session.browser.isIE

というように、ERXBrowserクラスのインスタンスのブラウザ判定処理を呼び出すことができます。


ちなみに現状のバージョンでは、このブラウザ処理判定の結果はキャッシュされて、もう一度WebObjectsでレスポンス生成するまで、使いまわされます。


ブラウザのURLをコピーして、違うブラウザで表示しようとすると、一見ブラウザの判定に失敗したように見えるということです。


違うページに移動したり、ページをリロードするメソッドを呼び出せば、再び正しくブラウザの判定を行うようになります。


また、このERXBrowserは抽象クラスになっていて、このクラスを継承して、新規のブラウザなどにも対応できるようになっています。




以下、サンプルソースからの一部抜き出し。


ERXBrowserSample.html

<HTML>
<HEAD><TITLE>ERXBrowserSample</TITLE></HEAD>
<BODY BGCOLOR="#FFFFFF">
<WEBOBJECT NAME=Conditional1>
Browser is safari
</WEBOBJECT>
<WEBOBJECT NAME=Conditional2>
Browser is Netscape
</WEBOBJECT>
<WEBOBJECT NAME=Conditional3>
Browser is IE
</WEBOBJECT>
</BODY>
</HTML>


ERXBrowserSample.wod

Conditional1: WOConditional {
condition = session.browser.isSafari;
}
Conditional2: WOConditional {
condition = session.browser.isNetscape;
}
Conditional3: WOConditional {
condition = session.browser.isIE;
}





本日は以上です。詳しくはAPIを見れば分かるクラスです。


今回のサンプル。
ERXBrowser.tar.bz2
posted by 小見 拓 at 07:19| Comment(0) | TrackBack(0) | Project Wonder | このブログの読者になる | 更新情報をチェックする

2004年08月16日

WebObjectsライブラリ Project Wonder サンプルズ#3 ERXLocalizer

WebObjectsのライブラリ Project Wonder

今回のサンプルは、er.extensions.ERXLocalizerです。


このクラスは、クライアントのロケールを特定し、そのロケール用のメッセージ、プロパティを取得、利用するためのクラスです。


適切に設定を行えば、ERXSession.java のlocalizer変数にクライアントのロケール用の情報を格納したERXLocalizerのインスタンスが格納されるので、
(Project Wonder用の設定をするば、ERXSession.java はSession.javaの親クラスになっているはずです。)

session.localizer.hoge.hoge

といった具合に、KeyValueCodingで指定のプロパティに容易にアクセスすることができるようになります。



このクラスを使用するには、プロジェクトのPropertiesファイルにローカライズ用の設定を加える必要があります。


以下はPropertiesファイルの設定サンプル(一部)です。

#er.extensions.ERXLocalizer.pluralFormClassName =
er.extensions.ERXLocalizer (実際には1行で書く)
#er.extensions.ERXLocalizer.nonPluralFormClassName =
er.extensions.ERXNonPluralFormLocalizer (実際には1行で書く)
er.extensions.ERXLocalizer.defaultLanguage = Japanese
er.extensions.ERXLocalizer.availableLanguages =
(English,German,Japanese) (実際には1行で書く)
er.extensions.ERXLocalizer.frameworkSearchPath =
(app,ERExtensions,HogeBusinessLogic) (実際には1行で書く)
er.extensions.ERXLocalizer.fileNamesToWatch=
("ERXLocalizerLocalize.string",
"ERXLocalizerLocalize2.string") (実際には1行で書く)


それでは、サンプルの設定を順番に見ていきます。


サンプル中ではコメントアウトしてある以下の指定は、カスタムなクラスでERXLocalizerを置き換えたい時に使用します。
キーの値としては、クラス名を指定します。
er.extensions.ERXLocaler.pluralFormClassName
er.extensions.ERXLocalizer.nonPluralFormClassName



er.extensions.ERXLocalizer.defaultLanguage
er.extensions.ERXLocalizer.availableLanguages
この2つの指定は、キーの名前だけで、なんとなく意味が分かるでしょう。
ERXLocalizerのデフォルトのロケールの言語と、使用可能とする言語の種類を、このプロパティのキーで指定します。
er.extensions.ERXLocalizer.availableLanguages はリスト型の値で指定します。




注意するべきは、残りの2つの指定です。
これらを適切に指定しないと、ERXLocalizerはプロパティファイルを読み込んでくれません。
er.extensions.ERXLocalizer.frameworkSearchPath
er.extensions.ERXLocalizer.fileNamesToWatch



er.extensions.ERXLocalizer.frameworkSearchPath
プロパティファイルの入っているフレームワーク名をリスト型の値で指定します。
実行アプリのプロジェクトにプロパティファイルが入れられている時は、サンプルのように"app"を指定します。
フレームワークの指定の順番は気にしなくても大丈夫です。
Project Wonderを使用するのでERExtensionsフレームワークは必ず入れておきましょう。



er.extensions.ERXLocalizer.fileNamesToWatch
読み込むプロパティファイルの名前をリスト型で指定します。
このプロパティで指定しないプロパティファイルは、ERXLocalizerによって読み込みません。




説明は終わりです。
これで、ERXLocalizerは使えるものと思います。



最後に、簡単なERXLocalizerのサンプルコード(一部)をお見せします。

File: ERXLocalizerSample.java

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

public class ERXLocalizerSample extends WOComponent {
public NSMutableDictionary _wotemp = new NSMutableDictionary();
public ERXLocalizerSample(WOContext context) {
super(context);
}
}



File: ERXLocalizerSample.wo/ERXLocalizerSample.html

<HTML>
<BODY BGCOLOR="#FFFFFF">
String: <WEBOBJECT NAME=String1></WEBOBJECT> <BR>

<WEBOBJECT NAME=Repetition1>
Repetition: <WEBOBJECT NAME=String2></WEBOBJECT> <BR>
</WEBOBJECT>
<BR>

Dictionary: <BR>
[title] <WEBOBJECT NAME=String3></WEBOBJECT> <BR>
[value] <WEBOBJECT NAME=String4></WEBOBJECT> <BR>
[value2] <WEBOBJECT NAME=String5></WEBOBJECT> <BR>
</BODY>
</HTML>


File: ERXLocalizerSample.wo/ERXLocalizerSample.wod

Repetition1: WORepetition {
item = wotemp.item;
list = session.localizer.listkey;
}
String1: WOString {
value = session.localizer.strkey;
}
String2: WOString {
value = wotemp.item;
}
String3: WOString {
value = session.localizer.dictkey.title;
}
String4: WOString {
value = session.localizer.dictkey.value;
}
String5: WOString {
value = session.localizer.dictkey.value2;
}



File: English.lproj/ERXLocalizerLocalize.string

{
strkey = "string type of property";
}


File: Japanese.lproj/ERXLocalizerLocalize.string

{
strkey = "文字列型プロパティ";
}


File: English.lproj/ERXLocalizerLocalize2.string

{
dictkey = {
title = "dictionary type of property: title";
value = "dictionary type of property: value";
value2 = "dictionary type of property: value2";
};
listkey = (
"list type of property: 1",
"list type of property: 2",
"list type of property: 3",
);
}


File: Japanese.lproj/ERXLocalizerLocalize2.string

{
dictkey = {
title = "辞書型プロパティ: titleキー";
value = "辞書型プロパティ: valueキー";
value2 = "辞書型プロパティ: value2キー";
};
listkey = (
"リスト型プロパティ: 1番目",
"リスト型プロパティ: 2番目",
"リスト型プロパティ: 3番目",
);
}






本日は以上です。

今回作成したサンプルコード
ERXLocalizer.tar.bz2

posted by 小見 拓 at 02:20| Comment(0) | TrackBack(0) | Project Wonder | このブログの読者になる | 更新情報をチェックする

2004年07月26日

WebObjectsライブラリ Project Wonder サンプルズ#2 ERXLongResponseとERXLongResponseTask

今日のお題。


WebObjectsのライブラリ Project Wonder
ERXLongResponseについて。


WOLongResponsePageProject Wonderな実装。


WOLongResponsePageは、ページを定期的にリフレッシュ
しながら、処理を行うことのできるWebObjectsのクラスです。
これを使用すると、現在の処理状況などを表示したりできます。

・ページのコンポーネントに配置すると、そのページがLongResponseなページに早代わりするという代物です。
Project Wonderのバージョン2.0以降に含まれます。

WOLongResponsePageを使えば、別にこちらを使う必要がない。と、いう気がしないでもないです。



使い方としては、
・ページにERXLongResponseを配置して、
・ERXLongResponseTaskインターフェイスを実装し、
・ERXLongResponseのtaskバインドにバインドすれば良い。


このライブラリを使う方としては、ERXLongResponseTaskに時間のかかってしまう処理を実装する。


ERXLongResponseTaskはJavaインターフェイスなので、
独自に実装しても構わないのですが、
ERXLongResponseTask.DefaultImplementationというデフォルト実装が用意されているので、
これを継承した方が良いとは思う。



バインドについて


ERXLongResponseは、下のバインドを持つ。

task
refreshInterval

・taskにはERXLongResponseTaskインターフェイスの実装クラスをバインド、
・refreshIntervalには、ページのリフレッシュ時間を秒単位で設定する。


refreshIntervalは必須のバインドになっていないが、何もバインドされないと、0秒設定になってしまうので、実質必須。


SourceForge cvs 2004/06/29版ではバグがあって、
このバインドが効かない。(回避策はいくらでもあるけどね。)


サンプルコード(抜粋)



LongLongTask.java


このクラスで、時間のかかってしまう処理を実装しています。


/**
* ERXLongResponseのサンプル。
* 長いタスクをperformAction()で実装するクラス。
*/
public class LongLongTask extends
ERXLongResponseTask.DefaultImplementation {

public int max = 15;
public int count;

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

/**
* キャンセル時に呼び出されます。
*/
protected WOComponent cancelPageForStatus(Object aStatus) {
return this.longResponse().pageWithName(
"CancelPage"
);
}
/**
* performAction()の処理中に例外が発生した時に呼び出されます。
*/
protected WOComponent pageForException(
Exception exception) {
return this.longResponse().pageWithName("ExceptionPage");
}
/**
* performAction()が終わった時に呼び出されます。
*/
protected WOComponent pageForResult(
Object aResult) {
return this.longResponse().pageWithName(
"ResultPage"
);
}

/**
* 長い処理を実行します。
* このメソッドは別スレッドで実行されます。
*/
public Object performAction() {
// cvs 2004/06/29版のバグ対策
// それ以降のバージョンであるか、自力ビルドしている場合は、
// この行を取り除くこと。
this.longResponse().setRefreshInterval(3);

while (count ++ < max) {
// ループ処理中に
// キャンセルされたかどうかのチェックを入れましょう。
if (this.isCancelled()) {
// キャンセルされていたら、
// 処理を中止します。
break;
}

try {
// 長い処理の代わり。
// 2秒待ちます。
synchronized (this) {
wait(2000);
}
} catch(InterruptedException e) {
// do nothing
}

}

return null;
}

}



ERXLongResponseSample.java


表示しているページのクラスです。

/**
* ERXLongResponseのサンプル。
* 処理時間のかかる処理を行います。
*/
public class ERXLongResponseSample
extends WOComponent {

/**
* 時間のかかる処理を実装したクラス。
*/
public LongLongTask task;

/**
* 本クラスを生成します。
*/
public ERXLongResponseSample(WOContext context) {
super(context);
this.task = new LongLongTask();
}

/**
* キャンセルボタンを押した時に呼び出されます。
*/
public WOComponent cancelBtnClicked() {
// キャンセルしたい時は,stop()メソッドを
// 呼び出せば良い。
this.task.stop();
return null;
}
}


ERXLongResponseSample.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<META NAME="generator" CONTENT="WebObjects 5.2">
<TITLE>ERXLongResponseSample</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<WEBOBJECT NAME=ERXLongResponse1></WEBOBJECT><BR>
max : <WEBOBJECT NAME=String1></WEBOBJECT><BR>
current : <WEBOBJECT NAME=String2></WEBOBJECT>
<WEBOBJECT NAME=Form1>
<WEBOBJECT NAME=SubmitButton1></WEBOBJECT>
</WEBOBJECT><BR>
</BODY>
</HTML>


ERXLongResponseSample.wod

ERXLongResponse1: ERXLongResponse {
refreshInterval = "4";
task = task;
}

Form1: WOForm {
multipleSubmit = true;
}

String1: WOString {
value = task.max;
}

String2: WOString {
value = task.count;
}

SubmitButton1: WOSubmitButton {
action = cancelBtnClicked;
value = "キャンセル";
}






今日は以上。


今回使ったサンプルコード。
ERXLongResponse.tar.bz2



現在、仕事でトラブル発生中です。

明日休みの予定だったのになぁ。
posted by 小見 拓 at 03:40| Comment(0) | TrackBack(0) | Project Wonder | このブログの読者になる | 更新情報をチェックする

2004年07月19日

WebObjectsライブラリ Project Wonder サンプルズ#1 ERXJSOpenWindowHyperlink

WebObjectsProject Wonderのライブラリはソースを見ないと、とても使えないライブラリです。
これは、ライブラリとして、本当に致命的な問題だと思います。


普通、そんなライブラリは使いません。


普通、使わないんだけど、それはちょっと惜しいので、Project Wonderのライブラリのドキュメントと、サンプルを作成しておくことにします。



@binding (s?) というjavadocの指定で、将来、
WebObjectsのコンポーネントのバインドを示す計画が
あるのだけど、いつ実現するのだろう?





第1回目は、
er.extensions.
ERXJSOpenWindowHyperlink

です。


なんでこれを選んだのかというと、目に止まったから。
単純で、説明しやすいからです。


ドキュメントは当然ありません。
.apiファイルで、コンポーネントのバインドが定義されている、なんてこともありません。
本当にソースを見ないと、どうしようも無いコンポーネントです。






このコンポーネントは、ハイパーリンクで、別ウィンドウを開くためのコンポーネントです。


使い方は、こんなふうにバインドすると、

<WEBOBJECT NAME=ERXJSOpenWindowHyperlink1>
リンク
</WEBOBJECT>

WEBOBJECT タグ内の「リンク」って文字が別ウィンドウを開くハイパーリンクになります。



リンクをクリックした時には、actionにバインドされているWOComponentを返すメソッドを呼び出します。ここで返したコンポーネントが、別ウィンドウで開くページになります。


新規に開くウィンドウの設定は、
width、heightといったバインドで指定します。


バインド例としては、

ERXJSOpenWindowHyperlink1: ERXJSOpenWindowHyperlink {
action = openNextWindow;
height = 300;
width = 500;
}

ってところです。



コンポーネントのバインドとしては、下のものが用意されています。


WebObjectsを使っている人なら、それぞれのバインドの意味は大体わかると思うので、それぞれについて説明しません。


action
width
height
scrollbars
menubar
toolbar
titlebar
resizable
href
target
disabled
queryDictionary
actionClass
directActionName



.apiファイルに、バインドの名前だけでも
定義しておいて欲しかったですね。




今回作成したサンプルコード

ERXJSOpenWindowHyperlink.tar.bz2


今日は以上。


また、忙しくなってきそうです。


ではでは。
posted by 小見 拓 at 02:50| Comment(0) | TrackBack(0) | Project Wonder | このブログの読者になる | 更新情報をチェックする

2004年06月26日

WebObjectsのオープンソースプロジェクト Project Wonderってなんじゃろな。#2

よく考えると、前回でインストール終わってない。
サーバーの画像とか入れ忘れてる。


という訳で前回からの続き。


WebObjectsのオープンソースプロジェクトProject Wonderをインストールする。


6


入手したProject Wonderを解凍すると、その中に、
WebServerResourcesってフォルダがあると思う。
このディレクトリのファイルは、画像とか、cssスタイルシートとか、Webサーバーに配置される類のファイルです。


このフォルダの中の *.woa を
/Library/WebServer/Documents/WebObjects
に配置、


更に、Frameworks/*.framework を
/Library/WebServer/Documents/WebObjects/Frameworks
に配置する。


WebObjectsをインストールすると、
/Library/WebServer/Documents/WebObjects/Frameworks/

JavaWOExtensions.framework
が入ってるけど、これは、Project Wonderの同名の framework と置き換えるので、元あったものは捨てて良い。


7


Applicationsってフォルダの中には、woaの拡張子のファイル群がある。これらは
/Library/WebObjects/Applications
ディレクトリにコピーする。


/Library/WebObjects/Applicationsディレクトリが無い場合は
ディレクトリを作成する。



ここまでのまとめ。


入手したProject Wonderの圧縮ファイルを解凍した後、


Frameworks
Applications
WebServerResources
各ディレクトリ内のファイルをそれぞれ、
/Library/Frameworks
/Library/WebObjects/Applications
/Library/WebServer/Documents/WebObjects
にコピーする。


XCodeのプロジェクトに
JavaWOExtensions.framework
ERExtensions.framework
ERJars.framework
を追加する。


元からあったJavaWOExtensions.framework は、Project Wonder
JavaWOExtensions.framework と置き換える。


Application.java、Session.java の親クラスを
er.extensions.ERXSessioner.extensions.ERXApplication
に変更する。


Application.javaのmain(String[])メソッドは、下のように変更する。


public static void main(String argv[]) {
ERXApplication.main(argv, Application.class);
}



Properties ファイルに Project Wonder 用の設定を追加する。


これは前回はさらっと流したが、実際には、こんな設定をPropertiesに加える。




まだ、ProjectBuilderTemplates とか、Utilities とか残ってるんだけど、これらは次回以降で。


ではでは。
posted by 小見 拓 at 02:20| Comment(3) | TrackBack(0) | Project Wonder | このブログの読者になる | 更新情報をチェックする

2004年06月02日

WebObjectsのオープンソースプロジェクト Project Wonderってなんじゃろな。#1

Project Wonderとは、
WebObjectsのオープンソースプロジェクトです。
使い方は、



1


入手する。

2


XCodeで、WebObjects Application、もしくはWebObjects Frameworkを作成すると、
最初からプロジェクトに加えられている
/System/Library/Framework/JavaWOExtensions.frameworkの参照を取り除く。


3


プロジェクトに、Project Wonder
JavaWOExtensions.framework、
ERExtensions.framework、
ERJars.frameworkを追加する。


4


最初からプロジェクトに加えられているPropertiesファイルにProject WonderのProperties設定を入れる。


5


WebObjects Applicationプロジェクトの
Session.java、Application.javaクラスの親クラスを、
er.extensions.ERXSessioner.extensions.ERXApplication
もしくは、それらのクラスと継承関係のあるクラスに変更する。


さらに、Application.javaのmain(String[])メソッドは、下のように変更する。


public static void main(String argv[]) {
ERXApplication.main(argv, Application.class);
}






だったと思う。
結構手順あるね。

後は、API見て自分で調べてくださいな。
今日は以上。


5月26日に公開した、Project Wonderの辞書ファイルは、この状態から作られたものです。


posted by 小見 拓 at 02:34| Comment(2) | TrackBack(0) | Project Wonder | このブログの読者になる | 更新情報をチェックする
記事検索
 
カテゴリ
最近のコメント
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


広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

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