かんがるーさんの日記

最近自分が興味をもったものを調べた時の手順等を書いています。今は Spring Boot をいじっています。

IntelliJ IDEA の起動、簡単な Spring Boot Project の作成&実行 ( その2 )

概要

IntelliJ IDEA の起動、簡単な Spring Boot Project の作成&実行 ( その1 ) の続きです。

  • この手順で確認できるのは以下の内容です。
    • Thymeleaf のテンプレートファイルを Tomcat 起動中に変更しても反映されるようにする方法
    • Spring Loaded による Tomcat 起動中の java ソースの変更と反映の確認

ソフトウェア一覧

参考にしたサイト

  1. Spring Boot Reference Guide
    http://docs.spring.io/spring-boot/docs/1.2.0.RELEASE/reference/htmlsingle/

手順

Thymeleaf のテンプレートファイルを Tomcat 起動中に変更しても反映されるようにする

  1. Project View で以下の階層にある resouces ディレクトリを選択した後コンテキストメニューを表示し、「New」->「File」を選択します。「New File」ダイアログが表示されたら application.properties と入力した後「OK」ボタンをクリックします。

     ksbysample-simple
     └ src
        └ main
           └ resources

  2. 作成した application.properties をダブルクリックして開き、リンク先の内容に変更します。これで Thymeleaf のキャッシュが無効になり、Tomcat 起動中にテンプレートファイルを修正しても反映されるようになります。

  3. 確認してみます。Gradle tasks View から bootRun タスクを実行して Tomcat を起動します。

  4. ブラウザを起動し、http://localhost:8080/test/thymeleaf-sample にアクセスします。以下の画像と同じ内容が表示されます。

    f:id:ksby:20141228161536p:plain

  5. Tomcat を起動したままの状態で、thymeleaf-sample.html をリンク先のその1の内容に変更します。

  6. ブラウザに戻り F5 キーを押してリロードします。以下の画像の内容に変わり変更が反映されています。

    f:id:ksby:20141228233322p:plain

Spring Loaded による Tomcat起動中のソースの変更と反映の確認

Tomcat 起動中に java のソースファイルを追加、変更した場合、Spring Loaded によりどの程度まで反映されるのか確認してみます。

Controller クラスの @RequestMapping を付与した method の中身を変えてみたら? →再起動なしで反映されます。

  1. ブラウザで http://localhost:8080/test にアクセスします。以下の画像と同じ内容が表示されます。

    f:id:ksby:20141228114727p:plain

  2. TestController.java の index メソッドリンク先のその1の内容に変更します。

  3. Gradle tasks View を表示し、build タスクをダブルクリックして実行します。

  4. ブラウザに戻り F5 キーを押してリロードします。以下の画像の内容に変わり変更が反映されています。

    f:id:ksby:20141229012500p:plain

新しい Thymeleaf のテンプレートファイルを作成して、return で呼び出すテンプレートを変更してみたら? →再起動なしで反映されます。

  1. ブラウザで http://localhost:8080/test/thymeleaf-sample にアクセスします。以下の画像と同じ内容が表示されます。

    f:id:ksby:20141228161536p:plain

  2. Project View で以下の階層にある test ディレクトリを選択した後コンテキストメニューを表示し、「New」->「HTML File」を選択します。「HTML File」ダイアログが表示されたら thymeleaf-sample2.html と入力した後「OK」ボタンをクリックします。

     ksbysample-simple
     └ src
        └ main
           └ resources
              └ templates
                 └ test

  3. 作成した thymeleaf-sample2.html をダブルクリックして開き、リンク先の内容に変更します。

  4. TestController.java の thymeleafSample メソッドリンク先のその2の内容に変更します。

  5. Gradle tasks View を表示し、build タスクをダブルクリックして実行します。

  6. ブラウザに戻り F5 キーを押してリロードします。以下の画像の内容に変わり変更が反映されています。

f:id:ksby:20141229013945p:plain

Controller クラス内に新規の @RequestMapping を付与した method を追加してみたら? →再起動なしで反映されます。

  1. TestController.java に addurl メソッドを追加します。thymeleafSample メソッドの下にリンク先のその3のコードを追加します。

  2. Gradle tasks View を表示し、build タスクをダブルクリックして実行します。

  3. ブラウザで http://localhost:8080/test/addurl にアクセスします。以下の画像と同じ内容が表示され変更が反映されています。

    f:id:ksby:20141229015307p:plain

Controller クラスの @RequestMapping を付与した method の引数に Model model を追加して、テンプレートにデータを渡すように変えてみたら? →再起動なしで反映されます。

  1. TestController.java の thymeleafSample メソッドに引数を追加します。リンク先のその4のコードに変更します。

  2. thymeleaf-sample.html を リンク先のその2のコード に変更します。

  3. Gradle tasks View を表示し、build タスクをダブルクリックして実行します。

  4. ブラウザで http://localhost:8080/test/thymeleaf-sample にアクセスします。以下の画像と同じ内容が表示され変更が反映されています。

f:id:ksby:20141229021349p:plain

POJO クラスを新規作成して、そのインスタンスを model に渡すようにしてみたら? →再起動なしで反映されます。

  1. Project View で ksbysample-simple.web package を選択した後コンテキストメニューを表示し、「New」->「Java Class」を選択します。「Create New Class」ダイアログが表示されたら User と入力した後「OK」ボタンをクリックします。

  2. 作成した User.java をダブルクリックして開き、リンク先の内容に変更します。

  3. TestController.java の thymeleafSample メソッドリンク先のその5のコードに変更します。

  4. thymeleaf-sample.html を リンク先のその3のコード に変更します。

  5. Gradle tasks View を表示し、build タスクをダブルクリックして実行します。

  6. ブラウザで http://localhost:8080/test/thymeleaf-sample にアクセスします。以下の画像と同じ内容が表示され変更が反映されています。

    f:id:ksby:20141229024245p:plain

新規のController クラスと @RequestMapping を付与した method を追加してみたら? →反映されません。再起動が必要です。

  1. Project View で ksbysample-simple.web package を選択した後コンテキストメニューを表示し、「New」->「Java Class」を選択します。「Create New Class」ダイアログが表示されたら Test2Controller と入力した後「OK」ボタンをクリックします。

  2. 作成した Test2Controller.java をダブルクリックして開き、リンク先の内容に変更します。

  3. Gradle tasks View を表示し、build タスクをダブルクリックして実行します。

  4. ブラウザで http://localhost:8080/test2 にアクセスします。404(Not Found)が返ってきてページは表示されません。

  5. 以上で確認は終了です。Ctrl+F2 を押して Tomcat を停止します。

  6. ここまでで Project のディレクトリ・ファイルは以下の構成になっています。

    f:id:ksby:20141229035825p:plain

結果

  • 新規に Controller クラスを作成した場合には Tomcat の再起動が必要。
  • それ以外は Tomcat の再起動不要。
  • Spring Loaded は IntelliJ IDEA の軽快さと合わさるとかなり便利な気がします。。。

※@Service, @Repository を付与したクラスの検証は後日実施予定。

ソースコード

application.properties

spring.thymeleaf.cache = false

thymeleaf-sample.html

■その1

<!DOCTYPE html>
<html>
<head lang="ja">
    <meta charset="UTF-8"/>
    <title></title>
</head>
<body>
これは /test/thymeleaf-sample のページです。<br/>
Tomcat 起動中に内容を変更しても反映されます。
</body>
</html>

■その2

<!DOCTYPE html>
<html>
<head lang="ja">
    <meta charset="UTF-8"/>
    <title></title>
</head>
<body>
これは /test/thymeleaf-sample のページです。<br/>
Tomcat 起動中に内容を変更しても反映されます。<br/>
<span th:text="${msg}">msg</span>
</body>
</html>
  • <span th:text="${msg}">msg</span> を追加します。

■その3

<!DOCTYPE html>
<html>
<head lang="ja">
    <meta charset="UTF-8"/>
    <title></title>
</head>
<body>
これは /test/thymeleaf-sample のページです。<br/>
Tomcat 起動中に内容を変更しても反映されます。<br/>
<span th:text="${msg}">msg</span><br/>
<span th:text="${user.name}">user.name</span>さんの連絡先は<span th:text="${user.tel}">user.tel</span>です。
</body>
</html>

TestController.java

■その1

    @RequestMapping
    @ResponseBody
    public String index() {
        return "これは /test のページです。Tomcat起動中に文字列を追加してみました。";
    }
  • return の文字列に "Tomcat起動中に文字列を追加してみました。" を追加します。

■その2

    @RequestMapping("/thymeleaf-sample")
    public String thymeleafSample() {
        return "test/thymeleaf-sample2";
    }
  • return の文字列を test/thymeleaf-sample → test/thymeleaf-sample2 へ変更します。

■その3

    @RequestMapping("/addurl")
    @ResponseBody
    public String addurl() {
        return "これは /test/addurl のページです。";
    }

■その4

    @RequestMapping("/thymeleaf-sample")
    public String thymeleafSample(Model model) {
        model.addAttribute("msg", "引数 model を追加してみました。");
        return "test/thymeleaf-sample";
    }
  • thymeleafSample の引数に model を追加します。
  • model.addAttribute メソッドを呼び出し、テンプレートに渡すデータを追加します。
  • return の文字列を test/thymeleaf-sample2 → test/thymeleaf-sample へ戻します。

■その5

    @RequestMapping("/thymeleaf-sample")
    public String thymeleafSample(Model model) {
        model.addAttribute("msg", "引数 model を追加してみました。");
        User user = new User();
        user.setName("田中 太郎");
        user.setTel("03-1234-5678");
        model.addAttribute("user", user);
        return "test/thymeleaf-sample";
    }
  • User クラスのインスタンスを生成してデータをセットした後、model に追加する処理を追加します。

thymeleaf-sample2.html

<!DOCTYPE html>
<html>
<head lang="ja">
    <meta charset="UTF-8"/>
    <title></title>
</head>
<body>
これは /test/thymeleaf-sample のページです。<br/>
ただしファイルは thymeleaf-sample2.html です。
</body>
</html>

User.java

■その1

package ksbysample.simple.web;

public class User {

    private String name;

    private String tel;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getTel() {
        return tel;
    }

    public void setTel(String tel) {
        this.tel = tel;
    }

}

IntelliJ IDEA で getter, setter method を自動生成したい場合、1)ソース上の挿入位置にカーソルを移動した後コンテキストメニューを表示して「Generate...」メニューを選択、2)表示された「Generate」リストから「Getter and Setter」を選択、3)「Select Fields to Generate Getters and Setters」ダイアログで生成対象のメンバ変数を選択後「OK」ボタンをクリック、で生成できます。

Test2Controller.java

package ksbysample.simple.web;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequestMapping("/test2")
public class Test2Controller {

    @RequestMapping
    @ResponseBody
    public String index() {
        return "これは /test2 のページです。";
    }

}

履歴

2014/12/29
初版発行。