1

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.E​​LException: クラス 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ことが保証されています。LongNumber

param.edIdただし、 and/orの値はparam.id数値であることが保証されておらず、悪意のあるユーザーによって変更される可能性があります。その場合、上記のような予期せぬエラーが発生する場合があります。


このように、2 つの追加変数を本当に設定する必要がありますか?

<c:set var="paramId" value="${param.id}"/>
<c:set var="paramEdId" value="${param.edId}"/>

上記のループでそれらを使用しますか、またはその解析例外を回避する簡潔な方法はありますか (値が解析できない場合)?

4

1 に答える 1

1

まず第一に、悪意のあるユーザーがパラメーター値を変更したために JSP が例外を生成したとしても、まったく気にしません。

しかし、MVC パターンを使用し、ブラウザーから送信されたパラメーターをコマンド/フォーム オブジェクトに入力し始めた場合、これは発生しません。そうすれば、文字列の代わりに型付き変数を使用し、それらの型付き変数をデータベースからの型付き値と比較できます。

于 2013-03-02T11:30:43.957 に答える