iBATIS2.3.2のバグ

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

javax.servlet.ServletException: SqlMapClient operation; uncategorized SQLException for SQL []; SQL state [null]; error code [0];   
--- The error occurred in ../sql/order.xml.  
--- The error occurred while applying a result map.  
--- Check the Order.ordermain.  
--- Check the result mapping for the 'items' property.  
--- Cause: java.lang.NullPointerException; nested exception is com.ibatis.common.jdbc.exception.NestedSQLException:   
--- The error occurred in ../sql/order.xml.  
--- The error occurred while applying a result map.  
--- Check the Order.ordermain.  
--- Check the result mapping for the 'items' property.  
--- Cause: java.lang.NullPointerException
	org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:515)
	org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:419)
java.lang.NullPointerException
	java.lang.Class.isAssignableFrom(Native Method)
	com.ibatis.sqlmap.engine.type.TypeHandlerFactory.getTypeHandler(TypeHandlerFactory.java:143)
	com.ibatis.sqlmap.engine.type.TypeHandlerFactory.getTypeHandler(TypeHandlerFactory.java:123)
	com.ibatis.sqlmap.engine.mapping.result.ResultMap.prepareBeanParameterObject(ResultMap.java:591)

これは既知の問題で修正済みとのこと。
[IBATIS-522] NPE in TypeHandlerFactory.getTypeHandler() when type is null - ASF JIRA

最新版のiBATISを落としてJarを入れ替えておいたほうがいい。最新は 2.3.4となっていた。
Apache Download Mirrors

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

複雑なアクションの結果であまり更新されないものに関してはキャッシュをするようにしたいが、アプリからは透過で細かいことを気にせず使えるようなキャッシュフレームワークを調査中。

JSPのカスタムタグのような実装が便利そうだ、s:actionで内部的にアクションを細分化して呼び出すようにしておくとその単位でのキャッシュもしやすいだろう。

OpenSymphony社の OSCache が良さそうだ。こちらは分散環境にも対応可能なものだそうだ。
http://www.opensymphony.com/oscache/
OpenSymphonyはStruts2のベースのWebWorkの開発会社でもある。

調査してみる。

OSCacheの紹介はこちらが判りやすい
OSCacheのキャッシングでWebアプリケーションのパフォーマンスを向上する (1/2):CodeZine(コードジン)

Struts2アプリのProfilingの方法

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

Profilingを有効にするには次の手順を行う。

続きを読む

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

Struts2のs:checkboxlistに配列を渡せば、複数選択可能なcheckboxが簡単に出力できる。

しかし、全てが1行に出てしまうので要素数が多い場合に具合が良くない。

次のように記述すると簡単に一行の出力要素数を調整できる。

元のJSPはこんな感じで出力していたとすると、これだと100要素があると1行に100個出てしまい、1つの要素の文字列の途中で折り返してしまったりと見栄えがいまいち良くない。

  <s:checkboxlist list="config.getList('area')" listKey="value" name="area" listValue="label" theme="simple"/>
続きを読む

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

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

続きを読む

OGNLでコレクションの抽出

Struts2JSPカスタムタグ中などで利用できるOGNL式はコレクションに対して便利な操作が簡単に行える。

コレクションからの条件抽出も次のようにして実現できる。

コレクション.{? 条件 }

これで条件に一致する要素のみで構成されたコレクションとなる。

次のようなリストがあるとして

<s:set name="list1" value="{ 'item1', 'item20', 'item300', 'item4000' }"/>

次のようにすると、

<s:set name="list2" value="#list1.{? #this.length()>5 && #this.length()<8 }"/>

長さが6か7の要素のみにフィルタされるので、次のようにすると

<s:iterator value="#list2">
    [<s:property value="top"/>]
</s:iterator>

次の出力となる。

[item20][item300]

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 value="'item200' in #list1"/>]<br>

こうなる。

item2:[false]
item20:[true]
item200:[false]

ちょっとTIPS:not inもある