2007-12-01から1ヶ月間の記事一覧

Springでsessionスコープのオブジェクト

sessionやapplicationスコープのオブジェクトはSpringでも簡単に管理できる。 例えば、 applicationContext.xmlで次のように scopeで sessionを指定するだけ。 <bean id="sessionobj" class="tutorial.SessionObj" scope="session" init-method="init"> </bean> そして、参照したいActionにDIしてあげれば良い <bean id="UserAction" class="tutorial.UserAction" scope="request"> </bean>

ネストしたTile

Tileの一部分でさらに別のTile定義を使用するような場合、ネストして使用することになる。bodyをさらに top、center、bottom に分割する場合tiles.xmlで分割部分のdefinitionをし、 <definition name="default.layout_body" template="/tiles/layout_body.jsp"> <put-attribute name="top" type="string"></put-attribute> <put-attribute name="center" type="string">…</put-attribute></definition>

iBatisのLazyLoading設定

sqlMapConfig.xml に次のように記述すると iBatisでLazyLoadingが有効になる。 これで、1対多のような副問い合わせが有る場合、そのプロパティにアクセスされたときに初めてSQLが発行される。 <sqlMapConfig> <settings : lazyLoadingEnabled="true" enhancementEnabled="true" /> : : LazyLoadingEnabledが false の場合、 getSqlMapClient</settings></sqlmapconfig>…

iBatisでの1対多のテーブルからのデータ取得

iBatisで駆動表と1対多の関係にあるテーブルから同時にデータを取得してみる素直な実装では次のよう データを格納するクラスでプロパティとしてList型をつくり public class User { : public static class History { String date; double pay; public Strin…

ScopeInterceptorのLock

コード見るとロックを掛けている様に見えるが、思ったとおりの動作にならない。 現在理由を調査中。

ScopeInterceptorの使い方

ScopeInterceptorを使用するとsessionやapplicationスコープでBeanのプロパティを簡単に管理できるようになる。 例えば、更新前に確認画面を表示した回数をカウントし、更新を実行したらカウントを破棄するような動作をさせる場合次のように実装できる。最初…

Localeによるリソース選択Interceptorの問題解消

何度かModelDrivenにしないと意図通りに動作しないとか、ModelになくActionに有るプロパティがsetされないと書いていたが、原因が判明した。 悪さをしていたのは Localeによるdispatch先の選択2 - Struts 2+Spring 2+Tiles+Acegi+iBatis+GWT+JUnit 4+JMockit…

Action側のパラメータがセットされない

2008/01/23 ここにあげた問題は勘違いによるものでした、現在は解決されています ParametersInterceptorやScopeInterceptorは ValueStack でsetされると書かれている、これは例えばModelDrivenでModel側にプロパティSetterがない場合、次に積まれているアク…

呼び出しの拡張子

struts2ではデフォルトで呼び出しの拡張子は action となっている、これは struts.xml で次のようにすることで変更できる。 <constant name="struts.action.extension" value="do" /> これで struts1 と同じ do になる。JSPやアクションなどのアプリケーション中でエクステンションを意識する場所は殆ど無い。</constant>

ScopeInterceptorについて

ScopeInterceptorを使うとsessionスコープやapplicationスコープのプロパティを簡単に使うことができるようだ。次のように struts.xml に記述すると <action name="scopetest" class="ScopeTestAction" method="doCountup"> <interceptor-ref name="transact"> <param name="scope.session">counter</param> </intercetor-ref> <result>/sample.jsp</result> </action> アクシ…

Struts2でのAction個別のException捕捉

Struts2でグローバルなException捕捉の方法は( Struts2で例外を捕捉してエラーページを表示する方法 - Struts 2+Spring 2+Tiles+Acegi+iBatis+GWT+JUnit 4+JMockit でフルスタックJAVAフレームワーク )の通りだが、Action個別でのException捕捉方法は次の通…

setXXXされたくないパラメータ2

setXXXされたくないパラメータは名前付けを工夫すれば回避できる( 投げられたパラメータを setXXX されたくない場合 - Struts 2+Spring 2+Tiles+Acegi+iBatis+GWT+JUnit 4+JMockit でフルスタックJAVAフレームワーク )が、他にも方法があった。その方法は Pa…

動的なTilesのレイアウト変更

個別のページでinsertDefinition タグを呼び出して、name属性でレイアウト指定をしているが、nameに渡す属性は単なる文字列だからランタイムに変更できるはずなので実用するかどうかは別として試してみる。tilesはStruts2のタグではないのでOGNL評価はしてく…

Tilesでのロールによる表示の切り替え

TilesのputAttributeタグに role 属性があり、ユーザーのroleにより切り替えられるようになっている。この仕組みが Acegi による認証でも使えるのか確認してみた。 認証は Struts2 のアクションで独自に行う - Struts 2+Spring 2+Tiles+Acegi+iBatis+GWT+JUn…

Uploadエラーメッセージの場所

FileUploadInterceptorで出力されるエラーメッセージはグローバルリソースに設定しておかなければいけないのだが、ソースを読むとリソース探索の起点としてInterceptorのクラスを渡しているけれど、本来はアクションのクラスで、どうもこの制限はバグなので…

Struts2および関連本

Practical Apache Struts 2 Web 2.0 Projects作者: Ian Roughley出版社/メーカー: Apress発売日: 2007/11/19メディア: ペーパーバック購入: 1人 クリック: 35回この商品を含むブログ (1件) を見る Java・J2EE・オープンソース Spring入門 ~より良いWebアプリ…

アップロードのエラーメッセージ

次のメッセージが出力される場合があるFileが作成できなかった場合など struts.messages.error.uploading inputName サイズチェックでエラー場合 struts.messages.error.file.too.large inputName, file.getName(), file.length() ファイルタイプが許可リス…

FileUploadの為のAction

Uploadされると、FileUploadInterceptorによって ファイルは一時ファイルとして保存される MIME型、サイズがチェックされパスした要素についてパラメータ設定 各file型のフィールドについて次のパラメータを追加 パラメータ名 データ型 備考 フィールド名 ja…

FileUploadの為のJSP

アップロード用フォームのJSPは次のようにする。 encodeを multipart/form-data にすることぐらい。/jsp/uploadform.jsp <%@page contentType="text/html; charset=UTF-8" %> <%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %> <%@ ta…

FileUploadの為のstruts.xml設定

まずシステム全体として受け付ける最大ファイルサイズを <constant name="struts.multipart.maxSize" value="10000000" /> のように設定。※デフォルトは 2097152 バイトとなっている。そして、jpegファイルのみ受け入れ、最大サイズを10000000バイトとする場合、アクションには次のように記述 <action name="uploadform" class="UploadAction" method="doNothing" > <result>/uploadform.jsp</result> </action> </constant>

FileUploadの為のInterceptor設定

Uploadに対応するためには現在のフレームワークのJarに次のJarを追加する必要がある。 commons-fileupload-1.2.jar commons-io.jarまた、FileUploadInterceptorをInterceptorスタックに追加する必要があるが、exceptionを捕捉するためと、プロパティへの設定…

Methodフィルタを行うInterceptor

ActionのMethod名により適用を制御できる標準のInterceptorは次のとおりであるが TokenInterceptor TokenSessionStoreInterceptor DefaultWorkflowInterceptor ValidationInterceptor ExecuteAndWaitInterceptor ParametersInterceptor PrepareInterceptor …

同名アクションの優先順位

package が同じ場合でも、異なるpackage で namespace が同じでも、後に定義された action が有効となる。 <package namespace="/" name="package1" extends="MyDefault"> <action name="test"> <result>/A3.jsp</result> </action> </package> <package namespace="/" name="package2" extends="MyDefault"> <action name="test"> <result>/A1.jsp</result>…</action></package>

Locale切り替えパラメータ名

I18nInterceptorを使用すると Locale をリクエストパラメータから設定できるようになるが、デフォルトのパラメータ名は "request_locale" となっている。 http://domain/app/some.action?request_locale=ja http://domain/app/some.action?request_locale=en…

デフォルトアクション

packageにActionが見つからない場合のデフォルトのアクションを設定しておくことができる次のように書くと 存在しないaction名でアクセスすると default_action が呼ばれるようになる <package ...> <default-action-ref name="default_action" /> : </package> 次のような場合の優先順位を試してみた <package name="package1"> <default-action-ref name="foo" /> <action name="foo"> : </action> </package>

packageのnamespace

struts.xmlのpackageでnamespaceを指定しないと "" となり、これは fallback とみなされる。 つまり namespace が完全に一致するパッケージにアクションが見つからないときに fallback から探される。 <package name="MyDefault1" extends="struts-default"> <action name="foo"> : </action> </package> <package namespace="/hoge" name="MyDefault2" extends="struts-default"> </package>

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

TLDファイルが struts2-core-2.0.11,jar に入っていて eclipse から認識できない?のでJSPエディタでタグの補完機能が使えなかったり、エラーマークが表示されたりして気持ちよくない。struts2-core-2.0.11.jar の中に META-INF/struts-tags.tld というファ…

プロパティ名がSQLの結果と一致する場合

結果Beanのプロパティに一致する場合は resultMap ではなく、 resultClass で直接結果格納用のクラスを書けば処理される <resultMap id="result" class="tutorial.User"> <result property="id" column="id" columnIndex="1"/> <result property="name" column="name" columnIndex="2"/> <result property="password" column="password" columnIndex="3"/> </result></result></result></resultmap>

動的な条件

iBatisで動的な条件を作成してみる。 例えばidのリストもしくは名前のリストで一致するものの一覧を取得する場合 <select id="getFilter" resultMap="result" parameterClass="tutorial.UserFilter"> SELECT id,name,password,salary FROM suser <dynamic prepend="WHERE"> <iterate prepend="OR " property="ids" open="id in (" close=")" conjunction=","> #ids[]# </iterate></dynamic></select>

varchar型以外のデータ型マッピング

PostgrsSQLのdouble型を何も気にせずマッピングしようとしたら駄目だった。 jdbcTypeとして、PostgreSQL側のデータ型を教えてあげる必要があるようだ。WEB-INF/sql/suser.xml <result property="salary" column="salary" jdbcType="double" columnIndex="4"/></result>