反省

OGNLのなんでもできる便利さは実装の甘さにより脅威に対して無防備となる可能性がありましたね。https://www.sec-consult.com/files/20120104-0_Apache_Struts2_Multiple_Critical_Vulnerabilities.txt2.3.1 など相当枯れたと思われたバージョンでも外部から…

default-interceptor-refのバグ

Struts2の設定で default-interceptor-ref を指定するといちいち個別の Action に interceptor-ref を書かないで済むので package で default-interceptor-ref を指定して package 内の Action ではすべて共通のinterceptorスタックを適用するような指定方法…

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

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

日本語Struts2本が発売になります

毎日コミュニケーションズ社から本サイト関連のStruts2と各コンポーネントの日本語の本が出版されることになりました。Struts2 フルスタック化&Webアプリケーション開発 ~Struts2+Spring 2+Tiles+iBATIS+GWTで作るショッピングサイト~作者: 三国逸文出版社/…

struts 2.0.12

Struts2が2.0.12にバージョンアップしていた。アップグレードはjarを差し替えるだけなので問題は無いけどちょっとはまったので。。。 WTP環境で、WEB-INF/lib 下の古いバージョンのjarを削除して、新しいjarに入れ替えサーバーを起動しようとしたところ Unab…

Interceptorパラメータ設定

Struts2でInterceptorのパラメータを設定する場合、 <interceptor-ref name="hoge"> <param name="fileUpload.maxallowsize">10000</param> </intrerceptor-ref> などと記述することができて便利であるが、hogeインターセプター・スタックに fileUpload インターセプターが無くてもエラーにならないので注意が必要だ。存在しないインターセプター名であれば警…

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>

iBATIS2.3.2のバグ

Springのwith dependencyパッケージは関連するJarが含まれていて便利だが、Spring2.5.5付属のiBATISは2.3.2となっていて、このバージョンには副問い合わせでのバグがある。 副問い合わせ指定のSQLを実行すると次のようなエラーが出力されてしまう。 javax.se…

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

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

Struts2アプリのProfilingの方法

Struts2にはProfilingの仕組みが標準状態で組み込まれているのでそれを利用してインターセプターやアクションでどれだけ時間が掛っているか測定することができる。 profilingすることによって、モジュール化されていて1リクエストで複数のアクションが実行…

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

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

Struts2でTilesを利用することの利点

Struts2のJSPで出力にTilesのレイアウトを適用すると、利点としてレイアウト変更に容易に対応できるという点はすぐに分かるが実はもっと大きな利点がある。

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で現在要素を参照できる。例えば文字列のリストがあったとして、各要素の後に " ({文字列長})"のような文字列を付加したリスト…

s:generatorタグの例

Struts2のs:generatorタグを使うと次のようにして配列を生成できる。 <s:generator separator="|" val="'a|b|c|d|e|f'"> <s:set name="lst" value="top"/> </s:generator> これは <s:set name="lst" value="{ 'a', 'b', 'c', 'd', 'e', 'f' }"/> と同じ結果になる。この配列は例えばStruts2のs:selectタグの要素に指定できる <s:select list="lst" name="selecttest1"/> s:generator…</s:select></s:set>

prepareインターセプターについて

Struts2のprepareインターセプターを利用するとメソッド実行前に処理を行わせることができるようになる。 実行するメソッドによって前処理で行う内容を変更したい場合は、staticParamsでパラメータを注入してもらい、その値で振り分けるようなことを考えてい…

GWTのコンパイル

GWT

GWTで開発されたクライアント側のコードは最終的にJavaScriptに変換する必要があるが、HsotedモードブラウザのCompile/Browseボタンで生成されたコードとコマンドラインでコンパイルして生成したコードでは内容が異なるので注意が必要だ。Hostedモードブラウ…

iBatisの結果キャッシュ

iBatisのSQL設定ファイルで次のようにして結果キャッシュの指定ができる <cacheModel id="test.cache" type="LRU"> <flushInterval hours="24"/> <flushOnExecute statement="test.refresh"/> <property name="size" value="200"/> </cacheModel> これはLRUで最大24時間、200件のキャッシュを行う指定となる。またキャッシュを無効にする条件として test.refreshを指定している。あとはこのキャッシュ設定を適用するselectでc…

Struts2のセキュリティーアップデート

Struts2の 2.0.11.2 がリリースされています。セキュリティアップデートですので入れ替えておきましょう。http://jira.opensymphony.com/secure/ViewIssue.jspa?key=XW-641ダウンロードはこちらから http://struts.apache.org/download.cgi#struts20112

iBatisのサブクエリに複数のパラメータを渡す

iBatisで1対多のテーブルからの取得などの場合にサブクエリの指定は次のように行う。 <result property="history" column="id" select="getHist"/> これで、 getHist のSQL中で id の値は #value# で参照できるようになる。サブクエリに渡す値が一つで足りる場合は問題ないが、複合キーなどの場合に駆動表の複数カラム</result>…

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

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

selectの結果をMapで受け取る

以前resultMapの型をHashMapにする方法を紹介した 結果をMapで受け取る - Struts 2+Spring 2+Tiles+Acegi+iBatis+GWT+JUnit 4+JMockit でフルスタックJAVAフレームワーク が、今回のは結果をListではなく、Mapにする方法。 queryForListではなくqueryForMap…

TOMCATのwelcome-fileの設定

Tomcatの web.xml に wellcome-file の設定をしておくと、ディレクトリ名でアクセスされた場合などに所定のactionを実行させることが出来る。 <welcome-file-list> <welcome-file>index.do</welcome-file> </welcome-file-list> ただし、これだけでは意図どおりに機能しない。これは tomcat からはそんなactionが実在するかわから…

Struts2アクションのスコープ

Struts2のアクションをSpringでBean生成させるときに以前 "request"スコープを使用していた(Struts2のAction専用のスキャン用Annotationを作る - Struts 2+Spring 2+Tiles+Acegi+iBatis+GWT+JUnit 4+JMockit でフルスタックJAVAフレームワーク)が、s:actio…

@Overrideアノテーション

Java5 では interface のメソッドの実装に @Override を付けるとエラーとなってしまうが、 Java6 ではエラーにならなくなった。Struts2の仕組みのような場合 @Override を付けるのは必須だと思う。例えば、あるアクションで public class Foo implements Ses…

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>