JavaのWebアプリケーション開発フレームワークによる、Webサイト開発の顛末記です。

EclipseのMavenを使った、Spring-MVC、Thymeleaf、MyBatis 等のプログラミングテクニックを、
備忘録的に記録しています。実際に動くソースコードを多用して説明していますので、
これからEclipseや、Spring-MVCを始めたいと思っている人にとって、少しでも参考になれば幸いです。
■Spring Boot の小径 第4歩 Spring Boot 匍匐前進
4-9)静的コンテンツの配置
静的コンテンツの配置に関して、ちょっとはまってしまったので、備忘録として記録しておくことにします。
静的コンテンツとは要するに、スタイルシート(css)だったり、JavaScript(js)だったり、画像ファイル(jpg,pngなど)だったり、
 ※)JavaScriptが静的かという点については、賛否両論あるでしょうがブラウザ側で動作するものという観点から静的に含めておきます。
のプログラムとは直接関係のない、固定的なファイルのことです。
ネットの情報を総合すれば、Spring Bootの場合は、classpath(src/main/resources/):/static/ディレクトリ配下に
これらの静的ファイルを配置すれば、あとは Spring Bootが、よしなに展開してくれるという訳で、
私も、Spring Bootを始めて一番最初に、src/main/resources/static/index.html (中身は 単なるhello) を置いて
アプリケーションを起動し、ブラウザに http://localhost:8080/index.html でhello が表示されたので
めでたしめでたしという事で、その後はプログラムの方に没頭していました。
前節「4-8)環境設定の外部ファイル注入」で、
jQueryやスタイルシートを使用したサンプルプログラムを動かそうとしたところ、
これがまったく動きません。ふぇ???
ブラウザでデバッグしてみると、cssや、jsや、jpg といった静的ファイルが 404(Not Found)で返ってきています。
なんでやねん? で、ResourceHandlerを登録してみたりとか、色々やってみたのですが、
全くパスが解けない。どこかでマッピングを壊しているとしか考えられないので
振り出しに戻って、これまで作ったクラスを一旦全部取り払って、ひとつづつ組み込み直しながら
どこでマッピングが壊れるか確認したところ、
前節で作成した、リクエストURLマッピングパターンの登録メソッドdispatcherRegistration()の
addUrlMappings("url-pattern");が悪さしていることがわかりました。
このメソッドは、Spring-MVCでやった、web.xml のdispatcherServlet <url-pattern>
定義に相当し、ここに例えば *.do とか定義すると、サーブレット(hoge)を実行する場合は
ブラウザリクエストURLには、hoge.do と指定しないと実行されません。
Spring Boot ではデフォルトでは /* (なんでもOK)なので、サーブレット名は拡張子なしでも実行されますが、
このデモプロジェクトでは、意識的に *.xhtml を指定していたので、
ブラウザリクエストURLには、any.xhtml と指定すると、サーブレットは問題なく実行されるのですが、
今度はSpring Boot が、xhtml の拡張子が付いたファイル名しか受け付けなくなり、cssや、js といった拡張子のファイルを
404(Not Found)で返してしまっていました。

教訓:Spring Boot ではリクエストURLマッピングパターンは使うべからず
   ⇒具体的には、application.properties の appconfig.url-pattern はコメントアウトして未定義とする。(デフォルトを使う)

なこと言ったって、どうしても使いたいのよ。
という場合どうするか、さらに悪戦苦闘した結果。やっと解を見つけました。
classpath(src/main/resources/):/static/ ディレクトリ配下のファイル群を
src/main/webapp/ 直下に、丸ごとそっくりコピーします。
理由は定かではありませんが、たったこれだけで、
リクエストURLマッピングパターンを指定しても、しなくても、
どちらでも問題なくパスは解決されるようになります。
元々の、classpath(src/main/resources/):/static/配下の静的コンテンツは、
そのまま残ってても動作に影響はありませんが、使用されなくなるため、
削除してしまっても問題ない様です。
ただ一つ問題点(?)として挙げるならこの方式の場合、
Gradleで war を作成するときに、src/main/webapp/配下は war に含まれなくなるので要注意です。

もっとも、私の場合は、war でデプロイするつもりは毛頭ないのであまり関係ありませんけどね。

 

これで、Eclipse上では一通り予定した機能は実装できました。
次は、gitとGradleを使ってTomcat動作環境への自動デプロイに挑戦してみます。
が、年度末で仕事が立て込んできたので、こちらはしばし開店休業です。

 

※)ここだけの話 2017/Apr/05 追記
ここだけの話、静的コンテンツを、src/main/webapp/配下に設置する理由についてですが、
最初色々と試行錯誤した結果、プロジェクト直下に /static というディレクトリを作り、
この配下に静的コンテンツを配置してもうまく動作することがわかりました。
そのうち、Spring Boot Maven版を作った際、Maven版のプロジェクトでは自動的に
src/main/webapp/というディレクトリが作られているのに気が付いたので、
ものは試しと、この下にコンテンツを配置してみたら見事に動きました! v(^o^)v
しかも、これまで、classpath(src/main/resources/):/static/だろうと、/staticだろうと、
プログラムを正常に動かすためには、
プロジェクト名でマウス右ボタンクリック⇒「実行」⇒「Spring Boot アプリケーション」
の手順で起動しないといけませんでしたが、
src/main/webapp/形式の場合だと
これまでの手順はいうに及ばず、さらに Spring-MVCで扱った「サーバービュー」でのTomcat起動にも
対応していることが確認できました!
「サーバービュー」で動かせるという事は、プロジェクトを切り替える際に一々アプリケーションを停止せずに、
「サーバービュー」に使用するアプリを追加しておいて、URLの切り替えでアプリが切り替えられるのでとても便利です。

「サーバービュー」の使い方については、
■SpringMVC の小径 2-1)Tomcatサ-バ-の設定
で説明しているので、ここを見てください。

以上、ここだけの話。人には内緒にしておいてくださいネ。