JSP

s:includeによるJSPの部品化再び

以前JSPの部品化を検討したときに s:includeによる部品化は仮引数が使えないなどいまいち使い勝手が良くないと結論付けたが最近とても良い方法を思いついた。それは

OGNLでNestしたMapへのアクセス

Struts2のOGNLでのNestしたMapへのアクセスで少し躓いた。 <s:set name="nestmap" value="#{ 'a' : #{ 'A' : 'aa', 'B' : 'bb' }, 'b' : #{ 'A' : 'cc', 'B' : 'dd' } }"/>このようなNestしたMapがあったとして、これにアクセスする場合次のどれでもアクセスできる <s:property value="#nestmap.a.A"/> <s:property value="#nestmap['a'].A"/> </s:property></s:property></s:set>

アクション結果のキャッシュ

複雑なアクションの結果であまり更新されないものに関してはキャッシュをするようにしたいが、アプリからは透過で細かいことを気にせず使えるようなキャッシュフレームワークを調査中。JSPのカスタムタグのような実装が便利そうだ、s:actionで内部的にアクシ…

checkboxlistを複数行で出力する方法

Struts2のs:checkboxlistに配列を渡せば、複数選択可能なcheckboxが簡単に出力できる。しかし、全てが1行に出てしまうので要素数が多い場合に具合が良くない。次のように記述すると簡単に一行の出力要素数を調整できる。元のJSPはこんな感じで出力していた…

OGNLでコレクションの抽出

Struts2のJSPカスタムタグ中などで利用できるOGNL式はコレクションに対して便利な操作が簡単に行える。コレクションからの条件抽出も次のようにして実現できる。 コレクション.{? 条件 }これで条件に一致する要素のみで構成されたコレクションとなる。次のよ…

OGNLのin句

Struts2の各種ファイルで利用できるOGNL式で、in句を使うとコレクション中での要素の存在を簡単に調べることができるJSPの場合次のようなリストがあったとして <s:set name="list1" value="{ 'item1', 'item20', 'item300', 'item4000' }"/> この結果は item2:[<s:property value="'item2' in #list1"/>]<br> item20:[<s:property value="'item20' in #list1"/>]<br> item200:[</s:property></s:property></s:set>

OGNLコレクションの射影

Struts2のOGNLでコレクションの射影を容易に作成できる コレクション.{ 操作 }で新しいコレクションが返される。{ }内では #thisで現在要素を参照できる。例えば文字列のリストがあったとして、各要素の後に " ({文字列長})"のような文字列を付加したリスト…

EclipseのJSPエディタでStruts2のタグ2

EclipseのJSPエディタには標準版と Amateras版があり、以前のエラー回避方法(EclipseのJSPエディタでStruts2のタグ - Struts 2+Spring 2+Tiles+Acegi+iBatis+GWT+JUnit 4+JMockit でフルスタックJAVAフレームワーク)は標準JSPエディタの場合にしか有効ではな…

s:subsetの使い方

Struts2のTagの s:subset はリストの一部分を取り出す時に利用する。 s:incldueと組み合わせて利用すると条件によって2段組または1段組にしたい場合などで便利に使える。リスト要素を単純に出力するとして、 s:include で取り込まれる側には純粋な1段分の…

OGNLのlist

OGNLでリストを生成する場合、リストの最後の要素に余分な ","が付いているとリストになってくれない。次のように書くのは'label2'の後の "," が余分だからNGで <s:set name="listitem" value="#{ '1':'label1', '2':'label2', }" /> <s:set name="listitem" value="{ 'label1', 'label2', }" /> 次のように書けばOKだった <s:set name="listitem" value="#{ '1':'label1', '2':'label2' }" /> </s:set></s:set></s:set>

s:includeのバグ

Struts2のs:includeは便利に使えるのだが、バグがあった。8192バイトの境界に複数バイトのUTF-8文字跨ったものをincludeするとその文字が化けてしまうという問題。 これは s:incldueの内部で使用している FastByteArrayOutputStream というのがUTF-8複数バイ…

s:setのscope

Struts2のs:actionで呼んだ先に名前つきでパラメータを渡す方法として <s:set name="" value="#request.namedParam='test'"/> のような方法を挙げたが、s:setにはスコープ指定があるのに気が付きました。 <s:set name="namedParam" value="'test'" scope="request"/> と書いたほうがスッキリします。参照の仕方はどちらも <s:property value="%{ #request.namedParam }"/> でOK。</s:property></s:set></s:set>

s:actionによる呼び出し

Struts2で他のアクションを s:action で呼び出した場合、呼び出されたアクション側で元のValueStackは参照できるが、名前付き変数は参照できないようだ。名前付き変数とは <s:set name="namedParam" value="'test'"/> などとして名前をつけた変数の事を指している。では渡したい場合はどうするか?普通</s:set>…

s:actionによる他のアクションの実行3

Struts2で他のアクションを呼び出す方法として s:action によるものがあるが、この機能の便利なところは元々のアクションに渡されたパラメータが全て s:action で呼び出したアクションにもデフォルトで渡されるということだ。これで、呼び出すアクションに一…

s:actionによる他のアクションの実行2

Struts2のJSP中でs:actionにより他のアクションを実行し、ValueStackを参照可能だが、結果のresultは実行されていない。 実行するためには executeResult="true" とする、こうすると出力内容が取り込まれる。ただし、HTMLのヘッダータグなどを出力していると…

s:actionによる他のアクションの実行

Struts2のJSP中でs:actionタグを使用すると他のアクションを実行して、その結果のValueStackを参照したり結果の出力を取り込んだりすることが出来る。まずValueStackを参照する場合id属性で変数名を指定すれば、その変数経由で呼び出したアクションのValueSt…

s:componentでの部品

s:component でJSPやHTML出力の部品化を行うことが出来るが、部品の中でFORM要素を使用する場合 はフォーム要素のタグの属性で templateDir や theme をFORM要素のものに戻してあげないと出力がされないので注意が必要だ。templateDirやthemeをちゃんと指定…

s:componentで部品を呼び出す

s:componentで呼び出すときにparameterを渡すことが出来る。呼び出し元と同じValueStackが参照できるのでどれ位意味が有るか不明だが次のようにする。 <s:component templateDir="parts" theme="simple" template="sample.jsp"> <s:param name="firstName" value="'fooFirst'"/> <s:param name="lastName" value="'fooLast'"/> </s:component> としてsample.jsp側では <%@page contentType…

s:componentタグによるJSPの部品化

s:componentタグによってJSPを部品化する事がある程度できる。templateDirとthemeとtemplateで{templateDir}/{theme}/{template}のようなパスになるのでその場所にJSPを置いて呼び出せばいい例えば <s:component templateDir="parts" theme="simple" template="sample.jsp"/> こうした場合WebContents/parts/simple/sample.jspが呼び</s:component>…

s:iteratorタグのstatus

Struts2での繰り返し処理のタグの s:iterator で属性status を指定すると、繰り返しの状態を取得できる。次のようにすると rs という変数が status になる <s:iterator value="listElements" status="rs"> statusは次のようなプロパティを参照できる 補足 例 index 何行目か 0からの数値 #rs.index count </s:iterator>…

s:includeについて

Struts2のカスタムTagに s:incldue というのがある。 こちらは s:component と違い、 s:param で指定されたValueStackにはアクセスできないようだ。 しかしこちらのページhttp://struts.apache.org/2.0.11.1/docs/include.htmlのExsampleにはparamで渡せるよ…

JSPパーツの部品化の方法(再)

Struts2のタグを調べていたら s:component というのが有った。 これはJSPやVelocity、Freemarkerのテンプレートをパーツとして取り込む機能のようだ。試したところ、取り込まれるJSP内部でもValueStackが参照できるし、s:param で仮引数的に渡すことも出来る…

s:urlのincludeParams

s:urlタグでURLを作ると きに指定できるオプションで、元の画面を表示した時のパラメータを含んだURLを生成してくれる。 これはこれでありがたい場面もあるが、必要ないときには <s:url id="url_var" action="foo" includeParams="false" /> とすると、余分なパラメータは付かなくなる。</s:url>

Struts2フォーム要素とGWTの連携

画面中のGWT支配下のコントロールでStruts2のアクションを呼び出しは問題ないがやはりちょっとはStruts2のフォーム要素と関連を持たせたい場合がある。 たとえば、郵便番号から住所を引っ張ってくるAJAXを考えたときに、郵便番号フィールドはGWTで表示して、…

Struts2のJSPからGWTの呼び出し

GWTのRPCのサービス実装側で簡単にStruts2のActionが使えるようになった、次はStruts2の画面のJSPからGWTを起動(画面中のあるエリアがGWTの支配下にあるイメージ)してみる。Struts2のJSPでGWTのRootPanelで指定しているIDのタグを作成し、次のJavaScriptを…

if タグのネスト

Struts2の s:if タグはネストすることが出来る if ( test1 ) { if ( test2 ) { a } else { b } } else { c } このような条件は <s:if test="test1"> <s:if test="test2"> a </s:if> <s:else> b </s:else> </s:if> <s:else> c </s:else> そのままこう書けばOK

comboboxタグ

テキスト入力と selectタグを併せたような combobox コントロールというのがある。 これは、指定するオプションもテキスト入力と select を併せたものとほぼ同じ次のように出力させることが出来る <s:combobox list="mediaList" listKey="type" listValue="type" name="media" key="label.media" /> ちょっとTIPS:fieldとselectの間の <br/> を変更するオプション</br/></s:combobox>…

s:checkboxlistタグについて

Struts2のカスタムタグには s:checkbox と類似の s:checkboxlist というのがある こちらは s:select と同じような使い方になる。listのソースを固定値ではなく、プログラムから設定する方法で紹介するtutorial.Media.java public class Media { String type;…

checkboxの扱い

WebのformでCheckboxのUIを使う場合問題になるのが、Checkboxがcheckされていない場合にパラメータ自体が投げられず、実装によってはアプリ上で保持している値がクリアされないというものがある。 hiddenなどを使ってCheckboxが投げれら無かった場合の処理を…

selectタグ2

selectタグでは次のような便利なタグオプションが使える オプション説明例 required必須マークが表示されるrequired="true"選択肢*:のようにラベルに"*"が表示されるこれはUI要素で共通に使える emptyOption空の要素を先頭に作るか否かemptyOption="true"先…