これは Mayaa Advent Calendar 2015 の21日目です。昨日は「テンプレートエンジン(Mayaa, Mixer2, Thymeleaf, JSF2.x)を比較してみて」でした。
クリスマスまであと5日です。
テンプレートエンジンを比較してみて
前回までに、Mayaa, Mixer2, Thymeleaf, JSFのどれを使うべきかについて結論を出しました。しかし、JSPを使わなければいけないケースもありますし、簡単なプログラムではライブラリを導入せず、さっとJSPだけで済ませたい時もあります。
そんなわけで、これまでの経験を元に、JSPを使う際の注意点を考えてみたいと思います。
JSPでいしがみメソッド
m:id含め、プログラム都合の識別子は常に大文字を使う
プログラムに制御情報を書いてしまうのでこの限りではないですが、せめて見えやすくしたいところです。また、中にごちゃごちゃした式を書いていくのはアレなので、taglibやヘルパー関数にまとめたいです。
僕はJSTLやtaglibは中途半端過ぎて嫌いなので、ヘルパーにまとめます。ヘルパー関数はimport staticを使うのが良いと思います。
m:idのする仕事を4種類に限定する
JSPはなんでも出来てしまいます。それこそ、いきなりスクリプトレットで、プログラムを書いてしまうことも出来ますが、それはやめましょう。Mayaaでのいしがみメソッドで使う4種類の仕事のみをJSPでもやるようにしましょう。
4種類の実装方法はルールに従う
こんな感じでスタイルを統一しましょう。
HERE:
名前: <%= escape(bean.getName()) %>
IF:
<% if (bean.isHoge()) { %>
<div>
ほげほげです。
</div>
<% } %>
TAG:
<a
href="<%= adjustPath(bean.getUrl()) %>"
>リンク</a>
LOOP:
<% for (int i = 0; i < bean.getSize(); i++) { %>
<div>
<%= i %>回目のほげほげです。
</div>
<% } %>
LOOP系のm:idはindexには長い名前を使い、maxを十分に大きな値を設定する
これはケースバイケースで考えてください。あまり長い名前にすると、テンプレートが見づらくなりますが、iとかjにすると、ブロックを移動した時に動かなくなるかもしれません。
writeプロセッサーでエスケープを解除するときは全部する
escapeヘルパー関数を作ると良いです。
tableタグだけは特別に扱う
ここは心配がいらないです。
m:idをパラメータ対応にする
これも心配がいらないです。
適宜ヘルパー関数をパラメータ化するのが良いと思います。
PathAdjusterを効果的に使う
ここが意味することは、PathAdjusterみたいなものをヘルパー関数として作ると良いことがあります。JSPテンプレートにベタに絶対パスを調整するコードを書かず常に adjustPath(~)
のように囲っておくと、後々良いことがあるはずです。
ヘッダー・フッター・共通部品はiframeタグをうまく使う
<jsp:include>
タグを使うのが良いと思います。<%@ include file="" %>
ディレクティブを使うべきケースはほぼないと思います。
テンプレート上のコメントは、ソース表示時に見えないようにする
<%-- --%>
を使いましょう。
単語はなるべくテンプレート側に書く
これは正反対になります。
単語はテンプレートに書いてはいけません。
どこかのファイルにテーブル化しておくべきです。
nekoHTMLパーサーをいじる
パーサもへったくれもないので、気をつけてValidなHTMLを書いてください。出力したページをバリデータにかけても良いかもしれません。
まとめ
以上、見てみると、意外と、Mayaaでの経験がそのままJSPで活かせそうです。JSPを注意して使うことによって、テンプレートがスパゲッティにならないですみます。
ただ、そう思って自分もJSPを扱っていますが、それでもやはり、JSPはぐちゃぐちゃでデザイナーには読めないものになってしまいますし、常にヘルパー関数を使うようなルールを運用するのはめんどくさく、結局Mayaaを使ったほうが楽だったのではないかと感じてしまうことが多いです。パフォーマンスも良くありません。
ある程度の規模のプログラムを作るときは、JSPは避けるべきだと思います。