Struts 1.3 + Spring 2.5のサンプルアプリ(ついでにGradle化)

古いけど動いているシステムではよく使われていそうなStruts 1.3 + Spring 2.5の組み合わせのシンプルなサンプルアプリが急遽必要になったので、探してみると意外とちょうど良いのが見つからない。
Struts + Spring + Hibernate integration example
からダウンロードできるものがHibernateを使っているけど、シンプルで良さそう。

というわけでこれをちょっと修正して用意してみた。ついでにGradle化なんてしてみたり(オリジナルはMavenです)。

修正版はGitHubにあげておきました。
https://github.com/wadahiro/struts-spring-example

以下、修正内容と使い方について説明しておきます。

修正内容

データベースをMySQLからH2Databaseに変更

オリジナルはMySQLが必要。サンプルなのでさくっと動かしたいので組み込みDBのH2Databaseに変更。テーブルの初期化も自動実行されるようにH2Databaseを設定。

HibernateからSpring JDBC Templateに変更

オリジナルはDAOはHibernateを使っているけど、今回Hibernateは不要なのでSpring JDBC Templateに変更。不要なHibernateの設定ファイルを削除し、DAOクラスの実装を修正しました。

ビルドツールをMavenからGradleに変更

pom.xml -> build.gradleにすると132行から32行に減った。やっぱXMLは冗長だなぁと思う。
ついでにJetty Pluginも使えるようにして(といっても1行追記しただけど)、簡単にサーバ上で動かせるようにした。

Springのコンフィグファイルをクラスパス経由で読むように変更

GradleのJetty Pluginで最初動かそうとすると、Springのコンフィグファイルをファイルパスから読んでいて動かず。クラスパス経由で読むように微修正。

マルチバイト対応

Jettyだと問題ないけど、ビルドしたWARをTomcatやJBossにデプロイすると見事に文字化けする。対策として、SetCharacterEncodingFilter クラスを追加しweb.xmlでフィルターとして組み込みつつ、各JSPエンコード設定を追加。

使い方

GitHubからcloneし、Eclipseで色々いじりたい人は以下のコマンドプロジェクト直下で実行し、インポートしてください。Struts、Springなどの必要なJARもこの時に自動取得するので、インターネット接続は必須です。

gradlew eclipse

アプリケーションを動かしたい場合は、以下のコマンドをプロジェクト直下で実行する。
なお、環境変数JAVA_HOMEを設定していないと動かないので注意。

gradlew jettyRun

以下のようにコンパイル後、Jettyが起動します。Running at ... で停止するので、その状態になったら表示されているURLにアクセスすればサンプルを動かせます。止めたい場合は、Ctrl+c でOK。

C:\Users\wadahiro\git\struts-spring-example>gradlew jettyRun
:compileJava
注意:C:\Users\wadahiro\git\struts-spring-example\src\main\java\com\mkyong\custom
er\dao\impl\CustomerDaoImpl.javaの操作は、未チェックまたは安全ではありません。
注意:詳細は、-Xlint:uncheckedオプションを指定して再コンパイルしてください。
警告1:processResources UP-TO-DATE
:classes
> Building > :jettyRun > Running at http://localhost:8080/struts-spring-example

なお、Jetty上のサンプルアプリをデバッグしたい場合は、Eclipseなどからリモートデバッグを行えばOK。Jettyはgradle経由で起動させているので、実行前にデバッグモードのオプションを環境変数に設定しておけば良い。
Windowなら、

set GRADLE_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n 

MacやLinuxなら、

export GRADLE_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n"

と設定してからGradleを実行すれば良い。なお、Gradleの実行時に--daemonは付けないように注意。--daemonで起動すると別のプロセスで動いてしまうので。

TomcatやJBossにデプロイしたい場合は、以下のコマンドをプロジェクト直下で実行する。build/libs以下にWARファイルが生成されるのでそれをデプロイすればOK。

gradlew war