2007-12-01から1ヶ月間の記事一覧
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定義を使用するような場合、ネストして使用することになる。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>
sqlMapConfig.xml に次のように記述すると iBatisでLazyLoadingが有効になる。 これで、1対多のような副問い合わせが有る場合、そのプロパティにアクセスされたときに初めてSQLが発行される。 <sqlMapConfig> <settings : lazyLoadingEnabled="true" enhancementEnabled="true" /> : : LazyLoadingEnabledが false の場合、 getSqlMapClient</settings></sqlmapconfig>…
iBatisで駆動表と1対多の関係にあるテーブルから同時にデータを取得してみる素直な実装では次のよう データを格納するクラスでプロパティとしてList型をつくり public class User { : public static class History { String date; double pay; public Strin…
コード見るとロックを掛けている様に見えるが、思ったとおりの動作にならない。 現在理由を調査中。
ScopeInterceptorを使用するとsessionやapplicationスコープでBeanのプロパティを簡単に管理できるようになる。 例えば、更新前に確認画面を表示した回数をカウントし、更新を実行したらカウントを破棄するような動作をさせる場合次のように実装できる。最初…
何度かModelDrivenにしないと意図通りに動作しないとか、ModelになくActionに有るプロパティがsetされないと書いていたが、原因が判明した。 悪さをしていたのは Localeによるdispatch先の選択2 - Struts 2+Spring 2+Tiles+Acegi+iBatis+GWT+JUnit 4+JMockit…
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を使うと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でグローバルなException捕捉の方法は( Struts2で例外を捕捉してエラーページを表示する方法 - Struts 2+Spring 2+Tiles+Acegi+iBatis+GWT+JUnit 4+JMockit でフルスタックJAVAフレームワーク )の通りだが、Action個別でのException捕捉方法は次の通…
setXXXされたくないパラメータは名前付けを工夫すれば回避できる( 投げられたパラメータを setXXX されたくない場合 - Struts 2+Spring 2+Tiles+Acegi+iBatis+GWT+JUnit 4+JMockit でフルスタックJAVAフレームワーク )が、他にも方法があった。その方法は Pa…
個別のページでinsertDefinition タグを呼び出して、name属性でレイアウト指定をしているが、nameに渡す属性は単なる文字列だからランタイムに変更できるはずなので実用するかどうかは別として試してみる。tilesはStruts2のタグではないのでOGNL評価はしてく…
TilesのputAttributeタグに role 属性があり、ユーザーのroleにより切り替えられるようになっている。この仕組みが Acegi による認証でも使えるのか確認してみた。 認証は Struts2 のアクションで独自に行う - Struts 2+Spring 2+Tiles+Acegi+iBatis+GWT+JUn…
FileUploadInterceptorで出力されるエラーメッセージはグローバルリソースに設定しておかなければいけないのだが、ソースを読むとリソース探索の起点としてInterceptorのクラスを渡しているけれど、本来はアクションのクラスで、どうもこの制限はバグなので…
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() ファイルタイプが許可リス…
Uploadされると、FileUploadInterceptorによって ファイルは一時ファイルとして保存される MIME型、サイズがチェックされパスした要素についてパラメータ設定 各file型のフィールドについて次のパラメータを追加 パラメータ名 データ型 備考 フィールド名 ja…
アップロード用フォームの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…
まずシステム全体として受け付ける最大ファイルサイズを <constant name="struts.multipart.maxSize" value="10000000" /> のように設定。※デフォルトは 2097152 バイトとなっている。そして、jpegファイルのみ受け入れ、最大サイズを10000000バイトとする場合、アクションには次のように記述 <action name="uploadform" class="UploadAction" method="doNothing" > <result>/uploadform.jsp</result> </action> </constant>
Uploadに対応するためには現在のフレームワークのJarに次のJarを追加する必要がある。 commons-fileupload-1.2.jar commons-io.jarまた、FileUploadInterceptorをInterceptorスタックに追加する必要があるが、exceptionを捕捉するためと、プロパティへの設定…
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>
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>
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>
TLDファイルが struts2-core-2.0.11,jar に入っていて eclipse から認識できない?のでJSPエディタでタグの補完機能が使えなかったり、エラーマークが表示されたりして気持ちよくない。struts2-core-2.0.11.jar の中に META-INF/struts-tags.tld というファ…
結果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>
PostgrsSQLのdouble型を何も気にせずマッピングしようとしたら駄目だった。 jdbcTypeとして、PostgreSQL側のデータ型を教えてあげる必要があるようだ。WEB-INF/sql/suser.xml <result property="salary" column="salary" jdbcType="double" columnIndex="4"/></result>