HHeLiBeXの日記 正道編

日々の記憶の記録とメモ‥

JSPで誤ったコメントアウト

実害がなかったので「未遂」ではあるのだが‥
問題となったのは次のコード。

<%@ page
contentType="text/html"
pageEncoding="UTF-8"
%><%
response.setHeader("pragma","no-cache");
response.setHeader("Cache-Control","no-cache");
%><?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "DTD/xhtml11.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
<title>invalid comment out</title>
</head>
<body>
<pre>
==== begin ====
</pre>
<div>
<!-- 画像は出さないことにする。
<img src='<%=request.getContextPath()%>/images/hogehoge.jpg' />
-->
</div>
<pre>
==== end ====
</pre>
</body>
</html>

注目すべきは20行目あたりのコメントアウトされたらしき部分。

<div>
<!-- 画像は出さないことにする。
<img src='<%=request.getContextPath()%>/images/hogehoge.jpg' />
-->
</div>

なにやら、画像を表示するためのimgタグを出力しないようにしたいらしいが‥
このJSPにブラウザからアクセスすると、次のように表示される。(2つのpreタグなので、2つのテキストの行間に空白ができる。)

==== begin ====

==== end ====

ところが、この表示されたページのソースを見てみると‥

<pre>
==== begin ====
</pre>
<div>
<!-- 画像は出さないことにする。
<img src='/testApplication/images/hogehoge.jpg' />
-->
</div>
<pre>
==== end ====
</pre>

しっかりとスクリプトレット「<%=request.getContextPath()%>」が実行され、「testApplication」というテキストに置き換わっている。これがもし副作用のある処理だったら‥
この場合、次のように書かなければならなかった。

<div>
<%-- 画像は出さないことにする。
<img src='<%=request.getContextPath()%>/images/hogehoge.jpg' />
--%>
</div>

これなら、"<%--"から"--%>"まではJSPのコメントとみなされ、Javaソースファイルを生成する際の前処理で除去される。
もっと言うと、この「画像は出さないことにする。」というコメントは生成されたHTMLソースに対するコメントではなく、JSPファイルに対するコメント。ならばHTMLコメントではなくJSPコメントであるべき。
ちなみに、もうひとつトンデモコード。

<div>
<%/* 画像は出さないことにする。
<img src='< %=request.getContextPath()% >/images/hogehoge.jpg' />
*/%>
</div>

わざわざコメント内に含まれるスクリプトレットの開始("<%")と終了("%>")を空白文字で切ってそれと認識させないようにしている。‥気持ちはわかるけど‥なぜJavaコメント‥

JSPファイル内ではいろいろな形式のコメントを混在させることができる(できてしまう)ので、混乱するのもわからなくはないが、正しく使い分けるようにしたい。
JSPコメント

<%-- ‥ --%>

HTMLコメント

<!-- ‥ -->

スクリプトレット内でJavaコメント

<%
‥
// ‥
‥
/* ‥ */
‥
%>

scriptタグ内でJavaScriptコメント

<script type="text/javascript">
‥
// ‥
‥
/* ‥ */
‥
</script>

まぁ、あげればきりがあるようなないような‥

(2010/06/14)コードスタイル(jsp、html)を指定するとHTMLコメント部分が表示されなくなってしまうので、スタイル指定をはずしました。