読者です 読者をやめる 読者になる 読者になる

アラカン"BOKU"のITな日常

あれこれ興味をもって考えたことを書いてます

クラスパス内の静的ファイルにアクセスする STS 3.8.3(Spring Boot 1.5.1)+thymeleaf 

CSVデータとかを置いといて、初期データとして読み込むとか、独自の設定ファイルを用意するとか、たまに、静的ファイルを使いたいときがあります。

 

当然、テストの時と本番運用時でファイルのパスを書き換えたりはしたくないので、やっぱり、絶対パス指定とかではなく、クラスパスからの相対パスでファイルを取得したいわけです。

 

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

 

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

 

今回は、それをためしにやってみます。

 

まず、準備として、src/main/resourcesの下い data というフォルダを作って、適当にファイルを置いておきます。サンプルなので、適当にsample.txtとでも名前をつけておきます。

f:id:arakan_no_boku:20170330230302j:plain

 

アクセスは、コントローラクラスから行います。それ以外から行おうとしてもうまくいかないので注意してください。

@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  3.8.3(Spring Boot 1.5.1)+thymeleaf 関連記事

 

入力画面に関連する記事

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

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

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

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

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

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

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

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

 

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

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

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

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

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

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

 

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

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

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

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

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

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

 

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

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

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

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

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

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

 

f:id:arakan_no_boku:20170404203859j:plain