このページに書いてあること。
JavaFrameWorkのSpringBootで画面ファイルを好きなフォルダに配置してアプリケーションの戻り値として使用するにはどうすればいいのか調べたのでリマインダとしてメモ
- @Controllerを適用したクラスで、画面ファイルを外だしする
- その画面を戻り値として返す
背景:
1)通常、Timeleafを用いて画面を返す場合、src/main/resource/templatesに配備する。
2)war化してアプリケーションを配備した場合、templatesはwarの中に込められてしまい、warからデプロイするような環境では画面の変更にリビルドが必要になってしまう。
※warから展開したwebapps以下やwork以下を直接弄る場合は問題ないが、再デプロイ時に消し飛ぶ可能性があり、嫌がられた
3)どうやったら設定ファイルと同様に外部化できるのだろうか。
というもの。
結論:
Tomcatのクラスパスを追加して、その中にtemplatesフォルダを作り、普通に画面名を返すだけ。
@PostMapping("/")
public String index(@RequestHeader HttpHeaders httpHeaders) throws ApplicationBindException {
return "home4.html";
}
何も特殊なことは無かった。
Springの画面返却は通常、Timeleafのエンジンとかを使用して実施しますが、テンプレートを探すために使用されるパス(上記の例ならindexメソッドで、戻り値の方にStringを指定した場合)はTemplatedResolverという機能により「classpath:/templates/」が自動で設定されます。
つまり、アプリケーションのクラスパス配下のtemplatesフォルダ内のファイル名を指定してやればいいだけという事です。
で、通常はsrc/main/resource/templatesが自動的にクラスパス配下に追加されているので、HTMLのファイル名だけでアクセスできるわけですね。
なので、こちらもTomcatの起動シェルのクラスパスに適当なフォルダを追加し、その中にtemplatesフォルダを用意してやれば、あとはHTMLファイル名で自動的にあさってくれます。
他に試したこと:
1)ResourceHandlerを使ってファイルを読み込んで、メソッド引数に指定したHttpResponseServletに直接書き込む。
2)@ResponseBodyをつかって、FileReaderを使って読み込んだファイル内容を直接コンテンツを返す。
どちらも実現はできるのですが、ハンドリングが非常に面倒。
TemplatesResolver使うのが一番いいですね。