hnakamur’s blog

ものすごい勢いで忘れる私のために未整理でもいいからとりあえずメモ

2011-06-11

Spring 3のHello WorldアプリにMyBatisを組み込み

組み込んだ結果はこちら。hnakamur/spring3-example1 at fa38bdcaeb7502d4f105746cc1d0bc6875a7d021 - GitHub

参考:This blog is all about me doing nothing serious :): Using MyBatis 3 with Spring 3 Using Mapper XML Files

上記のサイトではorg.mybatis.spring.SqlSessionTemplateのコンストラクタが引数なしでセッターでインジェクションしていますが、Spring - mybatis - An introduction to MyBatis integration with Spring - SQL Mapping Framework for Java - Google Project Hostingのバージョン1.0.1ではコンストラクタに引数が必要になっていたので変更してあります。

GitHubのソースに含まれない設定内容は以下の通りです。ここではDBはPostgreSQLを使用しています。

$TOMCAT_HOME/conf/server.xmlの<GlobalNamingResources>に以下のようにデータソース定義を追加します。
<Resource name="jdbc/postgresql" auth="Container"
              type="javax.sql.DataSource"
              driverClassName="org.postgresql.Driver"
              url="jdbc:postgresql://127.0.0.1:5432/springdb1"
              username="spring"
              password="spring"
              maxActive="20" maxIdle="10" maxWait="-1" />

$TOMCAT_HOME/lib/にPostgreSQLのJDBCドライバを入れます。ダウンロードはこちら。PostgreSQL JDBC Driver

[Window]/[Preferences]→[Tomcat]→[コンテキスト宣言モード]を「コンテキスト・ファイル」にしていると、コンテキストファイルに<ResourceLink>タグの記述が必要です。プロジェクトのプロパティの[Tomcat]の[その他の情報]に以下の内容を設定しておきます。
<ResourceLink name="jdbc/postgresql" global="jdbc/postgresql" type="javax.sql.DataSource"/>
なお、この設定は上記のGitHubのソースの.tomcatpluginに含まれています。

あと、SpringやMyBatisの設定をsrc/main/webapp/WEB-INF以下に置かず、src/main/resources以下においてclasspath:~やclasspath*:~で参照する方法もあるらしい。Problems with classpath between Eclipse, Tomcat and JUnit in Spring 3 app - Stack Overflowとか。ただ、classpath内に置く利点が私にはまだ不明なので、とりあえずWEB-INF以下に置く方式のままにしておきます。レファレンスではそうなっていますし。
13. Object Relational Mapping (ORM) Data Access
3. The IoC container
17. Integrating with other web frameworks

Spring application context loading tricks « Gridshoreによるとclasspath*:とワイルドカードではまることもあるらしいので注意。

Windows 7でPostgreSQL 9.0.xのpsqlの文字化けはcygwinで対処

Windows 7でPostgreSQL 9.0.xのpsqlの文字化けはcygwinのbashを使うことで対処します。さらに、メッセージの文字化け防止のために、接続後以下のコマンドを実行します。
\encoding sjis
現在の設定は引数なしで\encodingを実行します。
\encoding

参考:Windowsでpsqlに接続した場合|きよのブログ

cmd.exeだとコードページが932(SJIS)のままだと、psqlのパスワードプロンプトやテーブル一覧表示コマンド\dtの結果が文字化けします。
一方、以下のコマンドでコードページを65001(UTF-8)にしてpsqlを起動すると
chcp 65001
psqlのパスワードプロンプトやテーブル一覧表示コマンド\dtの結果は文字化けしなくなるのですが、SQL実行時に表示されるメッセージ(例:「psql:create_tables.sql:5: NOTICE: CREATE TABLE / PRIMARY KEYはテーブル"admin"に暗黙的なインデックス"adminpk"を作成します」)が文字化けします。フォントをデフォルトの[ラスター フォント]ではなく[Consolas]や[Lucida Console]にしてみましたが英語部分は化けなくなりましたが日本語部分が表示されません。

というわけで冒頭に書いた方法がよさそうです。

m2eclipseとTomcatプラグインの連携設定

2011-06-19追記:その後hnakamur’s blog: Sysdeo TomcatプラグインよりWTPのほうがよいですということがわかりました。


プロジェクトのプロパティの[Tomcat]→[全般]タブ→[Webアプリケーション・ルートとするサブディレクトリー]をどう設定するかについてのメモです。

Super Agile StrutsとかMaven2 + Eclipse + Tomcatプラグイン の組み合わせ - Enjoy*Studyではsrc/main/webappにしています。ですが、Maven2でリソースファイルのプロパティ置換をしていたりすると困る気がします。

そこでmavenをフルビルドすることで作成されるwar生成用の一時フォルダを設定するようにしてみました。具体的には以下のようにします。
  • プロジェクトのプロパティの[Builders]では[Maven Project Builder]の行が存在しチェックがついた状態にしておく(m2eclipseでプロジェクトを作ればそうなっています)。
  • プロジェクトのプロパティの[Maven]/[Lifecycle Mapping]→[Goals to invoke after project clean]を「clean package」にする。
  • プロジェクトのプロパティの[Tomcat]→[全般]タブ→[Webアプリケーション・ルートとするサブディレクトリー]は「target/<warファイルのベース名>」とする。warファイルのベース名は、pom.xmlでbuildタグのfinalNameタグを指定する場合はその値になり、finalNameを指定しない場合は${artifactId}-${version}になります。

この設定により、[Project]/[clean]メニューを実行すると「mvn clean package」が実行されて、targetフォルダ以下が作り直されます。ただ、エクスプローラでtargetフォルダを開いていたりするとcleanでフォルダが消せずうまくいかないので注意。

開いていなくてもTomcatプラグインでTomcatを起動中の場合もうまくいかないときもあるようです。Consoleにエラーは出ないのですが、targetフォルダ内のwarファイル生成用フォルダの中身が不足しているときがありました。

Tomcatを停止してから[Project]/[clean]を実行するほうが無難です。つまりホットデプロイはあきらめるということですが、不安定になるよりはいいと割り切ることにします。

Struts2.2とSpring3.0のHelloWorldアプリを作ってみた

Struts2.2とSpring3.0のHelloWorldアプリを作ってみた。

hnakamur/struts2-example1 at 6153ab91682aaab9e9b30870cd562db36b8267fe - GitHub

hnakamur/spring3-example1 at 7bb45dbf8e4eeea0873d1187c626544d9994c9ec - GitHub

java ee - compare spring mvc 3 and struts 2 - Stack Overflow
java - Struts or Spring MVC or Struts & Spring? - Stack Overflow
を見ると、Spring バージョン2.5で導入されたアノテーションベースのSpring MVCがいいらしい。

@Transactionalアノテーションを使う関係でSpringはどのみち使うし、Struts2は使わずにSpring MVCを使うことにします。依存関係は少ないほうがいいですしね。

ブログ アーカイブ