絶対パス指定とかではなく、クラスパスからの相対パスでファイルを取得する方法をやってみます。
STS3(3.9.6)+SpringBoot2.0+Tymeleaf3.0迄動作確認しています。
クラスパス内の静的ファイルにアクセスする方法
Spring Bootだと、これが簡単にできる方法があります。
src/main/resources の下にフォルダを作ったり、ファイルを置いたりして、ResourceLoaderというクラスを使って、それにアクセスすることができます。
Spring Bootでアクセスする方法
準備として、src/main/resourcesの下い data というフォルダを作って、適当にファイルを置いておきます。
サンプルなので、適当にsample.txtとでも名前をつけておきます。
ResourceLoaderクラス
アクセスは、コントローラクラスから行います。
それ以外から行おうとしてもうまくいかないので注意してください。
@Controller
public class Hello3Controller {
@Autowired
protected ResourceLoader resourceLoader;
@RequestMapping(value = "/hello3", method = RequestMethod.GET)
public String index(Hello3Form form, Model model) {
String pathAndFile = "data/sample.txt";
Resource resource = resourceLoader.getResource("classpath:" + pathAndFile);
model.addAttribute("resourceFileName",resource.getFilename());
return "hello3";
}}
ResourceLoaderクラスは、@Autowiredして使えるようにします。
対象ファイルは、src/main/resources からの相対パスで指定します。
今回は、”src/main/resources/data/sample.txt” を取得したいわけですか、"data/sample.txt" です。
で、ResourceLoaderクラスの、getResourceメソッドを使って取得するわけですが、ポイントは、"classpath:”の文字列です。
これを相対パスの前につけておくことで、src/main/resources/以下の相対パスでResourceオブジェクトとしてファイルが取得できるようになります。
resourceLoader.getResource("classpath:" + pathAndFile);
Resourceオブジェクトを取得すれば、後はまあ普通にファイルをオープンして読んで処理をするだけです。
サンプルを作ってみます
サンプルでごちゃごちゃ書くとポイントがずれるので、今回は簡単にresourceオブジェクトからfilenameを取得して表示するだけのコードにしています。
試しに、表示するHTMLをこんな感じにしてみました。
<form role="form" id="hello3Form" action="/outpg01" th:action="@{/outpg01}" th:object="${hello3Form}" method="post">
<p class="msg" th:text="${resourceFileName}">Please input PID</p></form>
実行してみます。
とれてますね。
おまけ:参考までに
参考までに、取得したResourceオブジェクトでファイルの存在チェックをしてFileオブジェクトを取得するメソッドだけ書いておきます。
(参考)
存在チェックをするメソッド
boolean bool = resource.exists();
リソースが実際に存在するかどうかを返します。
Fileオブジェクトを取得する
File file = resource.getFile();
STS +Spring Boot +thymeleaf 関連記事
入力画面に関連する記事
参照画面・画面遷移に関連する記事
参照画面:テーブルを使い、行毎に色分けした一覧表を表示する。
入力チェックに関連する記事
入力チェック:@Patternと正規表現で独自チェックする。
入力チェック用アノテーション定義を自分で作る。(独自実装版)
データアクセス・その他に関連する記事