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

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

人事評価と人工知能について考えたことがメインテーマです。

STS 3.8.3(Spring Boot 1.5.1)+thymeleaf HTMLのタグを閉じ忘れると例外が発生するので注意!

プログラミング Spring Boot入門

入力画面で使う各パーツの使い方の確認をしていて、動作確認のためにHTMLを書く前に認識しておいた方が良いことがあるのに気づいたので、先にそれを書きます。

 

HTML5で静的HTMLを書いて、それにthymeleafのタグを適用して画面に流用するケースです。

 

thymeleafのドキュメント(Tutorial: Using Thymeleaf (ja)

を見ると、以下のように書いてあります。

Thymeleafは6種類のテンプレートを処理することができます。これをテンプレートモードと呼びます:

Legacy HTML5 以外は整形式XMLです。Legacy HTML5 モードでは閉じていないタグ・値がない属性・引用符で囲まれていない属性が許容されています・・

 

なので、HTML5の文法上OKだったら問題ないな・・と考えてると、ちょっとはまります。

 

内蔵サーバーを起動して動かしたときに、例外が発生して画面が表示されずに、こんな画面がでます。

f:id:arakan_no_boku:20170318204450j:plain

 

thymeleafは、HTML5で許されている書き方を一部許さないみたいなんです。

 

例えば、HTML5は閉じタグの省略ができます。

 

例えば、</li>、</dt> 、</dd>、</p>、</option> <tbody>、</tbody>、</tr>、</td> 、</th>などですね。

 

これは、thymeleafだと例外発生の原因になります。

 

あと、空要素(もともと終了タグが不要なもの)の書き方も、HTML5では、<br>や<hr>のように、/>で終わらせない書き方が推奨されていたりもします。

 

これも、thymeleafだと例外発生の原因になります。

 

thymeleafは、すべてのタグが閉じタグで、閉じていないとだめですし、すべての空要素も /> で終わっていないと駄目です。必ず、閉じる・・を心がけないと、例外で画面がおちて修正する面倒にまきこまれると思った方がいいです。

 

と・・、ここまで書くと、ドキュメントには「Legacy HTML5 モードでは閉じていないタグ・値がない属性・引用符で囲まれていない属性が許容されています」と書いてあるじゃないか?モードをそれにしていないから駄目なだけで、モードを変更すれば大丈夫なんじゃないかと思う人もいると思います。

 

"BOKU"もそう思って、当然試しました。

 

モードの変更自体は、application.propertiesに以下のように書くことでthymeleafの設定を変更できるので、LEGACYHTML5に変更することはできます。(デフォルトで使う分には、記述不要です)

spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html
spring.thymeleaf.mode=LEGACYHTML5
spring.thymeleaf.encoding=UTF-8
spring.thymeleaf.content-type=text/html 

 

でも、残念ながら、LEGACYHTML5にすると、別の例外がでてうまく動きませんでした。

 

どうも、LEGACYHTML5にテンプレートモードを設定する場合は「nekohtml」(http://nekohtml.sourceforge.net/)というHTMLパーサーも必要みたいなんですね。

 

じゃあ、組み込んでやってみるか?と思ったんですが、ドキュメントに「バリデーションはXMLXHTMLのみで使用可能なことに注意してください。」などど書いてあったりします。

 

どうも、thymeleafにとっては、「LEGACYHTML5」は対応はしているが、ちょっと特殊な使い方にあたるようです。

 

問題ないのかもしれませんが、過去の経験上、特殊な使い方をしていて、バージョンアップの時などに不必要な苦労をさせられることもあったので、メリット・デメリットを考慮してやめました。

 

正直なところ、最初にルールとしてわかっていれば、タグを必ず閉じるとか、<br>と書けるようにするより、<br />と書くように気をつけるのは大した手間ではありません。

 

今のところ、その考え方でやって、支障はでていません。個人的にはこちらのやり方がおすすめです。