[Seasar-user:10743] Re: [Teeda]「値の保持」と「値の受け渡し」の両立のコツを教えてください

ENDO [E-MAIL ADDRESS DELETED]
2007年 9月 27日 (木) 00:00:29 JST


遠藤です。

07/09/26 に 橋本 昇<[E-MAIL ADDRESS DELETED]> さんは書きました:
> >試行錯誤の結果、現在は
> >・画面間で共有するプロパティをDTOに定義し、Pageクラスではプロパティの保持を
> >そのDTOに委譲する。
> >・そのDTOをSubapplictionScopeアノテーションを使って保持(またはHTML内の
> ><input type="hidden" id="[DTO名]SessionSave"/>を使って保持)
> >としています。
> このテクニックは基本的にはサブアプリケーション毎に1つの共有DTOを作成す
> るという意味なのでしょうか?

↑ということです。

他にDTOを使う理由は、ページ間で値を受け渡すためには基本的にはHTMLテンプレート
内でinputタグを使ってプロパティを記述してやる必要がありますが、プロパティの中には
HTMLには出力したくないプロパティもあります(ユーザに変更されたら困るものなど)。
そういうプロパティはDTOに定義して、SessionSaveを使ってセッションを介してDTOごと
ページ間で受け渡すようにすれば、プロパティの値がユーザ側にもれなくてすみます。


> >ただしこの方法でも以下の難点があるのでいまいちすっきりしていません。
> >・Pageクラス内でDTOのプロパティのgetter,setterを用意しなければならない
> >(せっかくpublic field対応になったのに…)
> これはどういう意味でしょう?
> 重ね重ね申し訳ありませんが、勉強の為に教えていただけますか?

S2.4.17からプロパティをpublicで定義するとgetter,setterが不要になったのですが、
プロパティをDTOで定義して、そのDTOをPageクラスに持たせるようにすると結局

public String getEmpDtoName() {
    return empDto.getName();
}

のようなgetter,setterが必要になり、getter,setter不要の恩恵が得られないということ
です。


> >違う話になってしまいますが、他にTeedaを使っていて悩んでいるのはforeachです。
> >foreach用のDTOのプロパティをPageクラスで再度定義しなければいけないというのが
> >つらい。
> >1ページ内で複数のDTOのforeachがあると全部のDTOのプロパティをPageクラスに定義
> >しておかなければならないですし、プロパティ名がぶつからないように注意しなければなら
> >ない。今は規約としてDTOのプロパティ名はempDtoNameのように先頭にDTO名を
> >つけることにしています。しかし、そうすると非常にプロパティ名が長くなってしまう、
> >entityとDTOでプロパティ名が異なるのでDxoで全プロパティの変換ルールを書かなけれ
> >ばならないという不便さがあります。
> このアイディアは、Dao用のDTO、Page用のDTO、そしてPageのプロパティこの3
> つを準備すると言う事でしょうか?

いわゆる「見出し」「明細」形式の画面の場合、見出し用DTO、明細用DTO
(foreach用のDTO)を用意して、Pageクラスに両DTOのプロパティ用の
getter,setterを定義しています。


> しかし、下記のようなアノテーションがTeedaにあったらうれしいなと妄想だけ
> はしていました。
> @ForEach(prefix="empDto")
> public List<EmpDto> empDtoItems;
> public String empDtoName;
> public Integer empDtoAge;

こういうのがあるといいですね。

または
<div id="empDtoItems">
<span id="name"></span>
</div>
と書いた場合はPageクラスにnameというプロパティがなくてもempDtoにnameという
プロパティがあればよいようにならないかなぁと。

それから

> >entityとDTOでプロパティ名が異なるのでDxoで全プロパティの変換ルールを
> >書かなければならないという不便さがあります。

これについてはDxoのSourcePrefixアノテーションを使うと
empDtoName → name
は変換できるようですが、反対方向の
name → empDtoName
が変換できないので、両方向変換できたらうれしいなと。


> また、他のアイディアをお持ちの方がいらっしゃったら是非教えてください。
> よろしくお願いします。

是非Tipsやベストプラクティスの情報を交換しましょう。



Seasar-user メーリングリストの案内