JSP/Servlet | JSTL(JSP Standard Tag Library) | 出力と変数 <c:out>, <c:set>, <c:remove>

プログラムを学ぶとき、最初のほうで学ぶものが変数である。JSTLにも変数を扱うタグが存在する。ここでは変数の出力、宣言、削除について説明する。

出力 <c:out>

属性

項目 説明 必須 デフォルト
value 出力される値 必須
default 変数がnullの場合に代わりに出力される値 body
escapeXml タグが特殊なXML文字をエスケープする必要がある場合はtrue true

使用形式

基本形式

<c:out value="foo" />
  • 値であるfooがそのまま出力される。

変数の使用とデフォルト値の代替

<c:out value="${name}" default="foo" />
  • 変数を指定する場合は${変数名}で指定する。
  • name変数がnullの場合、default値が代わりに出力される。

使用例

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
      <title><c:out> Tag Example</title>
</head>
<body>
      <c:out value="${'<c:out> , &'}"/>
</body>
</html>

結果表示

<tag> , &

付録: XSS (Cross-site Scripting)

クロスサイトスクリプティングとは、攻撃者が特定のコードをサーバーに送り、意図しないプログラムが実行される場合をいう。多くはJavaScriptであり、ユーザーから値を受け取って画面に表示する場合は常に注意しなければならない。

たとえば、ユーザーから<script>alert(1)</script>という文字列を受け取り、そのまま画面に表示すると警告ダイアログが表示されるだろう。このとき<c:out>を使って文字列をエスケープすれば、スクリプト言語は実行されず、入力された文字列がそのまま表示されるだけになる。

<c:out>はXSS対策に有用である。

変数宣言 <c:set>

属性

項目 説明 必須 デフォルト
value 情報を保存 body
target 属性を修正する変数名
property 修正する属性
var 情報を保存する変数名
scope 情報を保存する変数のスコープ Page

使用形式

基本形式

<c:set var="name" value="foo" />
  • 一般的には変数名と値だけを使うことが多い。

scope設定

<c:set var="name" value="foo" scope="request" />
  • page、request、sessionを指定できる。指定しない場合はデフォルトのpageになる。

変数値の変更

<c:set var="name" value="foo" />
<c:set var="name" value="hello" />
  • 既存の変数名と同じ名前で宣言すると、最後に宣言された変数値が保存される。

使用例

<%@ taglib uri = "http://java.sun.com/jsp/jstl/core" prefix = "c" %>
<html>
<head>
      <title><c:set> Tag Example</title>
</head>
<body>
      <c:set var="foo" scope="session" value="Hello World"/>
      <c:out value="${foo}"/>
</body>
</html>

結果表示

hello

変数削除 <c:remove>

<c:set>で定義された変数を完全に削除する場合に使用する。

属性

項目 説明 必須 デフォルト
var 削除する変数名 必須
scope 削除する変数のスコープ すべてのスコープ

使用形式

基本形式

<c:remove var="name" />

scope設定

<c:remove var="name" scope="page" />
  • scopeを指定しない場合、同じ名前の変数をすべて削除する。

使用例

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
      <title><c:remove> Tag Example</title>
</head>
<body>
      <c:set var="foo" value="hello" scope="session"/>
      <p>削除前 foo=<c:out value="${foo}"/></p>
      <c:remove var = "foo"/>
      <p>削除後 foo=<c:out value="${foo}"/></p>
</body>
</html>

結果表示

削除前 foo=hello
削除後 foo=