SE_BOKUのまとめノート的ブログ

SE_BOKUが知ってること・勉強したこと・考えたことetc

クラスパス内の静的ファイルにアクセスする STS3 +Spring Boot +thymeleaf 

絶対パス指定とかではなく、クラスパスからの相対パスでファイルを取得する方法をやってみます。

STS3(3.9.6)+SpringBoot2.0+Tymeleaf3.0迄動作確認しています。

f:id:arakan_no_boku:20190222012501j:plain

 

クラスパス内の静的ファイルにアクセスする方法

 

Spring Bootだと、これが簡単にできる方法があります。 

src/main/resources の下にフォルダを作ったり、ファイルを置いたりして、ResourceLoaderというクラスを使って、それにアクセスすることができます。

 

Spring Bootでアクセスする方法 

 

準備として、src/main/resourcesの下い data というフォルダを作って、適当にファイルを置いておきます。 

サンプルなので、適当にsample.txtとでも名前をつけておきます。

f:id:arakan_no_boku:20170330230302j:plain

 

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>

 

実行してみます。

f:id:arakan_no_boku:20170330232944j:plain

とれてますね。 

 

おまけ:参考までに

 

参考までに、取得したResourceオブジェクトでファイルの存在チェックをしてFileオブジェクトを取得するメソッドだけ書いておきます。 

(参考)

存在チェックをするメソッド

boolean bool =  resource.exists();
リソースが実際に存在するかどうかを返します。

 

Fileオブジェクトを取得する

File file =  resource.getFile();

 


 STS  +Spring Boot +thymeleaf 関連記事

 

入力画面に関連する記事

画像をSUBMITボタン代わりに使う

ラジオボタンとラジオボタングループを使う 

ラジオボタンとラジオボタングループを使う 

チェックボックスを使う。 

HTMLのタグの閉じ忘れで例外が発生する!

プルダウンリストとマルチセレクトボックスを使う。

今度はテキストエリアで複数行入力する。 

テキストボックスの入力と基本的なチェックを使う。

 

参照画面・画面遷移に関連する記事

参照画面:テーブルを使い、行毎に色分けした一覧表を表示する。 

参照画面:条件に一致した時のみHTML要素を出力する。

セッションを使って画面間で情報を受け渡す 

画面遷移:GET時のリクエストパラメータを受け取る 

日本語しか使わなくても、i18N対応はする意味がある。

 

入力チェックに関連する記事

入力チェック:未入力時に空文字が渡される仕様を回避する。 

入力チェック:@Patternと正規表現で独自チェックする。

入力チェック:アノテーション定義を自分で作る。(再利用版)

入力チェック用アノテーション定義を自分で作る。(独自実装版)

入力チェック:複数項目の相関チェックアノテーションの作り方

 

データアクセス・その他に関連する記事

データアクセス:Jprepositoryを使って簡単にCRUDする。 

データアクセス:ネイティブなSQL文を実行する 

クラスパス内の静的ファイルにアクセスする 

SpringBootだとログの書き出しも楽ちんです。 

SpringBootプロジェクトでJUNIT4を使った単体テストをする。