[Seasar-user:18296] Re: [Fisshplate]括弧などを含むバインド変数の置換について
Go Takahashi
[E-MAIL ADDRESS DELETED]
2009年 8月 16日 (日) 12:06:28 JST
六さん
回答ありがとうございます。高橋です。
> 出来れば、メソッド呼び出しで取得したい値は、#var と #exec で
> 変数に代入してそれを表示するようにして戴いた方がよいと思います。
一晩寝て、すっきりした頭で考えた結果、結局ご指摘どおり #var や
#exec で対応する方がいいような気がしてきて、試していたところでした。
OGNLもしっかり文法をおさらいすると、カンマ区切りで複数の式を順次
評価することも出来るし、プロジェクションを使えばシンプルに記述
できる部分もあったりと、自己解決気味になっておりました。
質問しておきながらすみませんです。
> というのは、ご指摘のあったバインド変数周りの実装なんですが
> とてもごちゃごちゃしてまして、なぜかというと
> 「こんな感じで${hoge}を表示する」みたいにリテラルとバインド変数が
> 混在したものに値を埋め込むための苦肉の策みたいな感じなのです。
ソースからひしひしと伝わってきました…ご苦労察します(w
> そのため、近い内にバインド変数の評価をOGNLではなく、
> FreeMarkerに全部任せてしまおうと思っていました。
そういう計画もあるんですね。
出来れば便利ですので期待してます!!
> メソッド呼び出しは事前に #exec でやって戴くのが
> 堅いかな〜、と思います。
はい。基本そのようにしたいと思います。
> FreeMarker化は、前述の通り、バインド変数はプロパティ参照しか想定して
> いなかったので、急いでやっても互換性に問題はないだろうと思っての
> 判断なのですが、もし不都合ありそうでしたら
> 0.1.4での反映は一旦見送りたいと思います。
心配なのは依存ライブラリですが、サイトを見る限り、freemaker.jar が
増えるだけでしょうか?それなら問題ないと思います。
要望的には必須と言うわけではなくなりましたので、ご無理の無いように…。
以下、蛇足ですが、参考までに。
検証の対象としていた帳票は、以下のような時間割的なもので、
1週間分が1段となっていて、しかも各日毎にコマ数もバラバラという
内容です。
+-------------+-------------+-------------+--
| 1月1日(日) | 1月2日(月) | 1月3日(火) | ...
+-+-----------+-+-----------+-+-----------+--
|A|10:00-11:00|A|10:00-11:00|C|13:00-14:00|
|B|11:00-12:00|B|11:00-12:00|D|14:00-15:00|
|C|13:00-14:00| | |E|15:00-16:00|
|D|14:00-15:00| | | | |
| | | | | | |
+-+-----------+-+-----------+-+-----------+--
まず、日付の出力に関しては、インデックスが使えないのなら、
DTO側で、first,second...というようなプロパティを用意するか、
各曜日毎に #var で 変数を宣言して、 #exec でいちいち代入を
するか、どちらかとなりますが、当然後者を選びました。
結局は、
#var d0,d1,d2,d3,d4,d5,d6
と変数を定義しておいて、
#exec d0=week.days[0],d1=week.days[1],d2=week.days[2], ....
というようにOGNLを記述することで対応する事にしようと思います。
実はOGNLをおさらいするまでは、カンマ区切りで複数の式を書ける
ことを認識しておらず、
#exec d0=week.days[0]
#exec d1=week.days[1]
...
と記述しなければならないと思っていて、なんだかテンプレートの
行数が増えてやだな…というのがご質問の一番のきっかけだったり。
無精でごめんなさい。
また、コマの各行の出力については、1日のコマ数が一定であれば、
単純に #foreach でmaxを指定すればいいのですが、各日ごとにバラバラ
ですのでDTOを生成する際に、空欄用のダミーのコマを詰める処理が
必要になってしまいます(そんなことをしたくないからFisshplateを
使っているのにっ)。
なので、以下のようにプロジェクションを用いて、行の表示内容を
生成しようと思っています。
#exec #i = idx, frames = week.days.{ (#i < #this.frames.size) ? #this.frames[#i] : null }
#exec f0=frames[0],f1=frames[1],f2=frames[2] ... これなら、空欄にすべきコマについ
ては null となりますので、
目的を果たせます。
DTO生成時に頑張るか、テンプレート側で楽をするかは、尽きぬ問題では
ありますが…。
以上、長文で失礼しました。
Seasar-user メーリングリストの案内