swat_Seasar_Memo

2004-08-26

[]WEB+DB PRESS Vol.22S2Daoの章を読んだ。 09:21

ダイアリのほうで書いたんだけれど、前提知識が無さ過ぎだったので、疑問に思ったことをドキュメントを見ながらお勉強。

  • テーブルと対になるクラスでは、toString()、equals(Object obj)、hashCode()のオーバーライドは必須なんだろうか?オーバーライドする意味は十分わかるんだけれど、サンプルコードを見ている限り、強要されているようではない。オーバーライドしなくてもだいじょうぶなんだろうか?

ドキュメントを見る限り、オーバーライドされている模様。オーバーライドしなくてもコンパイルは通りそうだから、大丈夫なんだろうけれど、実際に動かして見るしかないか。

  • IDになっているカラムが引数に含まれていないコンストラクタがあるけど、これは必須か?

ドキュメントのサンプルコード(Employee)では定義されていないので必須ではなさそう。じゃあどんな意味が?

追記:もしかして普通に使いたいだけか。ああ、そうか・・・orz

  • すみません。アノテーションって何ですか?(嗚呼、馬鹿丸出し)

ドキュメントを読んだらなんとなく理解は出来ました。DBの名前とJavaBeanを結びつけるために使うって言うのが基本線なんですね。

  • OrderItemsクラスにTABLEというアノテーションが切られているけれど、なぜこれだけ?

クラス名からパッケージ名を除いた名前がテーブル名と一致する場合は、TABLEアノテーションを定義する必要はありません。

ああ、そういうことですか、アンダーバーがありますもんね。

  • Daoインターフェースのメソッド命名規則ってあるんだろうか?getAllOrderItemsというsignatureだけでどんなオブジェクトのリストが帰ってくるかを知る方法はあるんだろうか?

S2DaoではメソッドのsignatureよりSQL文の中身を自動的に決定しています。そのためメソッドのsignatureはS2Daoの想定にあわせてもらう必要があります。

あ、あるんですね。signatureからどんなSQLが発行されるか分かるようにならんといけませんね。

  • SQLのバインド変数コメントで、/*empno*/7788というように7788というリテラルが入っていないといけないのはなぜだろう。実際にこの数値が評価されて使われることがあるのか?

バインド変数コメントの右側のリテラルがバインド変数で置き換えられます。

じゃあ、入れていないとダメってことか。SQL単体で通るものじゃないとダメ、ってことなんですかね。

最初っからドキュメント読んどけよ、という感じなのですが、記事から先に読んだらすごく焦ってしまいました。あーびっくりした。

po78@nut.compo78@nut.com2007/07/26 05:22Thank you for you work! Good Luck.r

azs34@aol.comazs34@aol.com2007/07/27 06:57Really good site, and a pleasant suprise... Good Luck!c

nhh@oro.comnhh@oro.com2007/07/28 11:16Thank you very much.t

vvb@yahoo.comvvb@yahoo.com2007/07/29 19:01Very nice work, admin :) Good luck!

xss2@yahoo.comxss2@yahoo.com2007/07/30 23:52Big thanx to webmaster!<

oyyu78@aol.comoyyu78@aol.com2007/08/01 01:49Thanks bro! Real good work!

DestryDestry2012/02/16 03:16Your post is a timely contribution to the debtae

flgmdlflgmdl2012/02/16 19:33aYh9Ye <a href="http://qevnjxbflpxp.com/">qevnjxbflpxp</a>

トラックバック - http://seasarproject.g.hatena.ne.jp/swat/20040826

2004-06-16

動いた! 23:21

先日インターフェースだけ定義した。それに簡単に具象クラスを書いてみる。若干インターフェースも変更した。

ログインに必要なパラメータ

LoginArg.java

package swat.test;

public interface LoginArg {

	String getUserName();

	String getPassword();

}

ログインに必要なパラメータの具象クラス

DBArg.java

package swat.test;

public class DBArg implements LoginArg {
	
	private String userName;
	private String password;

	public String getUserName() {
		return userName;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String string) {
		password = string;
	}

	public void setUserName(String string) {
		userName = string;
	}

}

ログインする主体の具象クラス

OrdinaryUser.java

package swat.test;

public class OrdinaryUser implements Principal {
	
	LoginArg arg;
	Role role;

	public LoginArg getLoginArgs() {
		return arg;
	}

	public void setRole(Role role) {
		this.role = role;
		System.out.println("Roleは、"+role.getClass().getName());
	}

	public LoginArg getArg() {
		return arg;
	}


	public void setArg(LoginArg arg) {
		this.arg = arg;
	}

}

認証を行なう者の具象クラス

DBAuthenticator.java

package swat.test;

public class DBAuthenticator implements Authenticator {
	
	private Role role;

	public Role authenticate(LoginArg arg) {
		
		String userName = arg.getUserName();
		String password = arg.getPassword();
		
		System.out.println("USER "+userName + "は、password "+password+"で、DBAuthenticatorにより認証されました。");
		return role;
	}

	public Role getRole() {
		return role;
	}

	public void setRole(Role role) {
		this.role = role;
	}

}

ログインしたものに与えられるロールの具象クラス

UserRole.java

package swat.test;

public class UserRole implements Role {

}

ブートストラップ

ComponentRunner.java


import org.seasar.framework.container.S2Container;
import org.seasar.framework.container.factory.S2ContainerFactory;

public class ComponentRunner {

	public static void main(String[] args) throws LoginFaliedException {

		S2Container container =
			S2ContainerFactory.create("swat/test/login.dicon");

		Authenticator auth =
			(Authenticator) container.getComponent(Authenticator.class);

		Principal principal =
			(Principal) container.getComponent(Principal.class);

		LoginLogicComponent component = new LoginLogicComponent();

		component.login(auth, principal);
	}
}

diconファイル

login.dicon



"http://www.seasar.org/dtd/components.dtd">
<components>
	<component class="swat.test.DBAuthenticator">
		<property name="role">
			<component class="swat.test.UserRole"/>
		</property>
	</component>
	<component class="swat.test.OrdinaryUser">
		<property name="arg">
			<component class="swat.test.DBArg">
				<property name="userName">'swat'</property>
				<property name="password">'swatpass'</property>
			</component>
		</property>
	</component>
</components>

実行結果

[WSSR0008]swat.test.OrdinaryUserのプロパティ(role)が見つからないので設定をスキップします
USER swatは、password swatpassで、DBAuthenticatorにより認証されました。
Roleは、swat.test.UserRole

ホントにとりあえずのとりあえずなんだけれど動いた。驚いているのは、一度チュートリアルを流したことがある程度の知識で、ここまでなーんにも見ないでできちゃったこと。さて、次はAOPのほうをいじってみたいと思います。

TotaaTotaa2012/02/18 12:55Sheriff Clarence Dupnik is the Obama aosopgilt who linked Gabby Giffords shooting with right wing 'uncivil' rhetoric. (See Rush Limbaugh during that time)

jhoslqdhjhoslqdh2012/02/19 23:44BsaCWT , [url=http://jsxasclbtkxq.com/]jsxasclbtkxq[/url], [link=http://tonpcndmhqnk.com/]tonpcndmhqnk[/link], http://adntdyekqonm.com/

ojcnqjihcjmojcnqjihcjm2012/02/26 02:59XhNfQ1 <a href="http://fifmknizgvfe.com/">fifmknizgvfe</a>

トラックバック - http://seasarproject.g.hatena.ne.jp/swat/20040616

2004-05-15

ちょっと遊ぶ。 16:57

d:id:masataka_kさんのチュートリアルを一通りやったので、ちょっとずつ遊んでみよう。

依存性は後から与えられるということは、極端な話、何も考えずにロジックを組むことができちゃうってことを意味するはず?実際にやってみる。題材は「ログイン」。何を使って認証するかは決めていない。DBかもしれないし、ファイルかもしれないし、LDAPかもしれない。今はとりあえずおいておく。

ということで思いつくままにロジックとインターフェースだけ書いてみる。

ロジック

LoginLogicComponent.java

package swat.test;

public class LoginLogicComponent {

    /**
     * @param auth
     * @param principal void
     */
    public void login(Authenticator auth, Principal principal)
        throws LoginFaliedException {

        //ログインに必要なパラメータを取り出す。
        LoginArg arg = principal.getLoginArgs();

        //認証せよ!!
        Role role = auth.authenticate(arg);

        if (role == null) {
            throw new LoginFaliedException();
        }

        //Roleをセット
        principal.setRole(role);

    }

}

ログインする主体

Principal.java

package swat.test;

public interface Principal {

    LoginArg getLoginArgs();

    void setRole(Role role);

}

認証を行なう者

Authenticator.java

package swat.test;

public interface Authenticator {

    Role authenticate(LoginArg arg);

}

ログインに必要なパラメータ

LoginArg.java

package swat.test;

public interface LoginArg {

}

ログインしたものに与えられるロール

Role.java

package swat.test;

public interface Role {

}

ログイン失敗時の例外

LoginFaliedException.java

package swat.test;

public class LoginFaliedException extends Exception {

}

ブートストラップ

ComponentRunner.java

package swat.test;

import org.seasar.framework.container.S2Container;
import org.seasar.framework.container.factory.S2ContainerFactory;

public class ComponentRunner {

    public static void main(String[] args) throws LoginFaliedException {

        S2Container container =
            S2ContainerFactory.create("swat.test.login.xml");

        Authenticator auth =
            (Authenticator) container.getComponent(Authenticator.class);

        Principal principal =
            (Principal) container.getComponent(Principal.class);

        LoginLogicComponent component = new LoginLogicComponent();

        component.login(auth, principal);
    }
}

例外が具象クラスになってしまったけれど、それは仕方がないかな。ログイン失敗したときの挙動をS2で制御できればいいか。

さて、今度は少しずつ具象クラスを書いていこう。その過程でインターフェースにメソッドを追加していく予定。

トラックバック - http://seasarproject.g.hatena.ne.jp/swat/20040515