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(コードジン)
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"/>続きを読む
OGNLでコレクションの抽出
Struts2のJSPカスタムタグ中などで利用できる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もある