JSTLでは以下のように数値を比較しています。
<c:set var="testValue" value="10"/>
<c:choose>
<c:when test="${testValue==10}">
<c:out value="Test is successful."/>
</c:when>
<c:otherwise>
<c:out value="Test is unsuccessful."/>
</c:otherwise>
</c:choose>
条件は true と評価され、「テストは成功しました」と表示されます。
変数の値がtestValue
数値でない場合、
<c:set var="testValue" value="xxx"/>
その後、テストは次の例外で失敗します。
javax.el.ELException: クラス java.lang.String 型の xxx をクラス java.lang.Long に変換できません
文字列は に解析できないためLong
です。比較は辞書式に行われます。
これは、次のように EL を使用することで回避できます。
<c:set var="testValue" value="${xxx}"/>
この場合、<c:otherwise>
セクション内のテキストが表示されます。
次のようなデータベースからデータを取得するときに、このような構成を使用しています。
<c:forEach var="row" items="${list}" varStatus="loop">
<c:choose>
<c:when test="${param.edId==row.id || row.id==param.id}">
// Do something.
</c:when>
<c:otherwise>
// Do something.
</c:otherwise>
</c:choose>
</c:foreach>
上記のコードでは、 の値は、Oracle データベースのデータ型に対応するrow.id
ことが保証されています。Long
Number
param.edId
ただし、 and/orの値はparam.id
数値であることが保証されておらず、悪意のあるユーザーによって変更される可能性があります。その場合、上記のような予期せぬエラーが発生する場合があります。
このように、2 つの追加変数を本当に設定する必要がありますか?
<c:set var="paramId" value="${param.id}"/>
<c:set var="paramEdId" value="${param.edId}"/>
上記のループでそれらを使用しますか、またはその解析例外を回避する簡潔な方法はありますか (値が解析できない場合)?