Thymeleaf + Springboot + Mybatis + MySQL + VSCodeーThymeleafとVuejs V2の統合

### ThymeleafとVuejs V2の統合
##### Thymeleaf
　Thymeleaf は、Spring Boot 互換のテンプレートエンジンです。
　サーバー側で動的に変わる部分を、JSP のような拡張タグではなく、HTML の属性値で記述するため、ブラウザでテンプレートを表示しても見た目かわ崩れず、実際の表示に近い形で表示される特徴があります。

##### Vuejs V2
　ユーザーインターフェイスを構築するためのプログレッシブフレームワークです。
　コンポーネントシステムは Vue.js におけるもうひとつの重要な抽象概念です。
　Vue においては、「コンポーネント」は本質的にはあらかじめ定義されたオプションを持つ Vue インスタンスです。

---

##### Vue インスタンスのオプション
<table>
  <caption>Vue インスタンスのオプション</caption>
  <thead>
    <tr>
      <th>オプション</th> <th>エレメント</th> <th>説明</th> <th>例</th>
    </tr>
  </thead>
  <tr>
    <td>状態</td>
    <td>data</td>
    <td>コンポーネントインスタンスの<br>最初のリアクティブステートを返す関数。</td>
    <td>例１：<br>
data() {<br>
&nbsp;&nbsp;&nbsp;&nbsp;return { a: 1 }<br>
}<br>
例２：<br>
data() {<br>
&nbsp;&nbsp;&nbsp;&nbsp;a: 1<br>
}
</td>
  </tr>
  <tr>
    <td>状態</td>
    <td>methods</td>
    <td>コンポーネントインスタンスに<br>混ぜ合わせるメソッドを宣言します。</td>
    <td>例：<br>
      plus() {<br>
      &nbsp;&nbsp;&nbsp;&nbsp;this.a++<br>
      }
    </td>
  </tr>
  <tr>
    <td>状態</td>
    <td>watch</td>
    <td>データ変更時に呼び出される<br>ウォッチコールバックを宣言します。</td>
    <td>例：<br>
      name(val, oldVal) {<br>
      &nbsp;&nbsp;&nbsp;&nbsp;console.log(`new: \${val}, old: \${oldVal}`)<br>
      }
    </td>
  </tr>
  <tr>
    <td>レンダリング</td>
    <td>template</td>
    <td>コンポーネントの文字列テンプレート。</td>
    <td>ー
    </td>
  </tr>
  <tr>
    <td>ライフサイクル</td>
    <td>beforeCreate</td>
    <td>インスタンスが初期化されるときに呼び出されます。</td>
    <td>ー
    </td>
  </tr>
  <tr>
    <td>ライフサイクル</td>
    <td>created</td>
    <td>インスタンスがすべての状態関連オプションの処理を終了した後に呼び出されます。</td>
    <td>ー
    </td>
  </tr>
  <tr>
    <td>ライフサイクル</td>
    <td>beforeMount</td>
    <td>コンポーネントがマウントされる直前に呼び出されます。</td>
    <td>ー
    </td>
  </tr>
  <tr>
    <td>ライフサイクル</td>
    <td>mounted</td>
    <td>コンポーネントがマウントされた後に呼び出されます。</td>
    <td>ー
    </td>
  </tr>
  <tr>
    <td>ライフサイクル</td>
    <td>beforeUnmount</td>
    <td>コンポーネントインスタンスがアンマウントされる直前に呼び出されます。</td>
    <td>ー
    </td>
  </tr>
  <tr>
    <td>ライフサイクル</td>
    <td>unmounted</td>
    <td>コンポーネントがアンマウントされた後に呼び出されます。</td>
    <td>ー
    </td>
  </tr>
</table>

---
##### ライフサイクルダイアグラム
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480807/7186978b-5fd9-15c3-a32c-d32157cb22ae.png)

---
##### サンプル作成
1\. 殻HTMLを作成
　「classpath:templetes」の配下に「vueinthymeleaf.html」を作成する。
　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480807/3a4b45b5-d6b8-43af-4c5b-46263744796c.png)

---
2\. 下記ソースを1で作成されたHTMLに張り付ける。
```html:vueinthymeleaf.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">

<head th:replace="~{common/common :: meta_header('ホーム',~{::link},~{::script})}">
    <link rel="stylesheet" th:href="@{/css/index/index.css}" />
</head>

<body>
    <!-- ヘッダの読み込む -->
    <div th:replace="~{common/common :: header}"></div>
    <!-- メニューの読み込む -->
    <div th:replace="~{common/common :: menu}"></div>

    <div id="app">
        <b-form-input v-model="name" placeholder="Enter your name"></b-form-input>
        <div class="mt-2">Value: {{ name }}</div>
    </div>
    <script>
        const vApp = new Vue({
            el: "#app",
            data: {
                name: ""
            }
        })
    </script>
</body>
```

---
3\. ビュー遷移用コントローラーを作成する。
　作成方法は[「Thymeleaf + Springboot + Mybatis + MySQL + VSCodeー画面遷移(@Controller)」](https://qiita.com/training_zhang/items/6208f5b28f0673f7ac9e)を参照してください。

---
4\. 動作確認
　アプリケーションを起動して、起動方法は[「Thymeleaf + Springboot + Mybatis + MySQL + VSCodeー画面遷移(@Controller)」](https://qiita.com/training_zhang/items/6208f5b28f0673f7ac9e)を参照してください。
　下記URLをブラウザに入力して、作成した画面を表示される。
　URL：http://127.0.0.1:8080/greeting/vueinthymeleaf
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480807/e37ab163-c2c1-f223-3cd9-fe19e2a44f7a.png)
　画面のテキストボックスに任意な文字列を入力して、確認してください。

---
5\. 画面イベントを実装してみる。
　1で作成されたHTMLにの「<b-form-input v-model="name" placeholder="Enter your name"></b-form-input>」の直下に下記ソースを張り付ける。
```html:追加HTML
...
<b-form-input v-model="name" placeholder="Enter your name"></b-form-input>
<b-button @click="setNameWithDateTime">Set the name with current datetime</b-button>
...
```
　JavaScript部分のdata部の直下に下記メソッド部を追記してください。
```javascript:追記メソッド部
            methods:{
                setNameWithDateTime: function() {
                    this.name = dateFns.format(new Date(), 'YYYY-MM-DD HH:mm:ss', {location: 'ja'})
                }
            }
```

---
6\. 動作確認
　HTMLの修正で、VSCodeが自動ディプロイなので、アプリケーションを再起動しなくても最新なHTMLを自動適用できる。
　4の画面を再読み込みで最新のHTMLを読み込み。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480807/6719fce8-879c-0f8d-7d31-b40c4b3b42af.png)
　ボタンをクリックして、現時点の日付を自動的にテキストボックスに設定できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480807/35e86318-a6c3-d3dd-2937-a1734b2a06b8.png)

---
7\. ボタンをクリックして、AxiosでRestful APIを呼び出して、サーバ側のデータを取得して、画面に設定する。
  Restful APIを下記のように作成する。
　作成方法は[「Thymeleaf + Springboot + Mybatis + MySQL + VSCodeーRESTful API(@RestController)」](https://qiita.com/training_zhang/items/221ba93fb317dc30cb21)を参照してください。
```java:Restful API
    @GetMapping(value="/getSystemDate")
    public String getSystemDate() {
        return "From Restful API: " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Calendar.getInstance().getTime());
    }
```
　5で追加されたJavaScriptメソッド部のメソッド「setNameWithDateTime」の中身を下記のように修正する。
```javascript:修正後のメソッド「setNameWithDateTime」
                setNameWithDateTime: function() {
                    axios.get('/api/getSystemDate').then((res) => {this.name = res.data});
                }
```

---
8\. 動作確認
　4の画面を再読み込みで最新のHTMLを読み込み。ボタンをクリックして、確認してみよう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480807/20c0cf09-3f87-39ae-4816-b4f8d2673379.png)

---
##### まとめ
　以上は、VuejsのCDN使い方の説明です。
　本章に、ThymeleafにのVueの使い方、ボタンでVueのdata部更新する方法とaxiosでのRestful API呼び出しを実装しました。