3

JSPタグを作成しています。タイプパラメータをタグに渡します。

コードは次のようになります。

<%@ attribute name="type" require="true" %>
<c:choose>
    <c:when test="${type eq 'even'}">
        <c:set var="remainder" value="0" />
    </c:when>
    <c:when test="${type eq 'odd'}">
        <c:set var="remainder" value="1" />
    </c:when>
    <c:otherwise>
        <%-- Want to throw exception!! --%>
    </c:otherwise>
</c:choose>

間違った値を渡した場合に例外をスローしたい。私がこの主題について検索したとき、私はちょうどこれを見つけまし。JSTLで通常の例外をスローできませんか?

4

4 に答える 4

2

部分的に正しいと思われる削除された回答を復活させて編集することにしました。

次のようにスクリプトレットに追加することで、例外をスローできます。

<c:choose>
    <c:when test="${type eq 'even'}">
        <c:set var="remainder" value="0" />
    </c:when>
    <c:when test="${type eq 'odd'}">
        <c:set var="remainder" value="1" />
    </c:when>
    <c:otherwise>
        <% if (true) throw new Exception("Wrong type"); %>
    </c:otherwise>
</c:choose>

ただし、jspは「ビュー」レイヤーの一部であると想定されているため、実際には、サーブレットでロジック(例外のスローを含む)を維持するようにしてください。

if (true)ステートメントに注意してください。例外スクリプトレットをコードにドロップしただけでは、コンパイラが「到達不能コード」について文句を言うので、これはトリックです。

于 2016-09-29T15:36:01.890 に答える
1

すぐに問題に気付くために投げるだけ

誰が「気付く」のでしょうか?この例外はコンテナでのみキャッチでき、「500 Internal ServerError」ページ(または定義したカスタムエラーページ)が発生します。

それが本当に必要な場合は、「throw new WhateverException()」を実行するカスタムタグを定義してから、次のようにカスタムtaglibを使用できます。<mytaglib:reportError/>標準のコアtaglibは、例外のスローを考慮していなかったためです。誰にとっても望ましい。

于 2012-01-22T13:14:53.960 に答える
1

体系的に例外をスローするか、エラーメッセージとともに大きな赤いdivを表示する、またはその両方を行うカスタムEL関数またはタグを使用するだけです。

${myFn:illegalState("the type must be odd or even but it is " ${type})}
于 2012-01-22T13:14:55.013 に答える
0

ここでのあなたの目標は、開発者にカスタムタグの不適切な使用を通知することであると想定します。他の回答でほのめかされているように、JSPでエラーをスローすると、おそらく(構成によっては)ユーザーがアプリケーションエラーページに移動するため、ユーザー入力エラーを別の方法で処理する必要があります。

タグハンドラーをJavaでコーディングできる場合、仕様には、これを実行できるTLDのオプション要素がいくつか含まれています。

  1. 仕様は、validatorを実装するクラスを取る要素を定義しますjavax.servlet.jsp.tagext.TagLibraryValidator。実際には、これは多くの柔軟性を提供するため、使用するのがやや複雑です。
  2. 仕様tei-classは、を拡張するクラスを取るものも定義しますTagExtraInfo。JavaDocが指摘しているように:

    カスタムタグの追加のタグ情報。このクラスは、タグライブラリ記述子ファイル(TLD)で言及されています。このクラスを使用する必要があります。

    • タグがスクリプト変数を定義している場合
    • タグがタグ属性の変換時検証を提供する場合。

JSPのバージョンによっては、開発者が提供する変数の検証を処理するためのオーバーライドisValid()またはメソッドが必要になります。validate()

Apache taglibは、タグの一部を検証するためにこれらを使用します:(https://github.com/javaee/jstl-api/blob/master/impl/src/main/java/org/apache/taglibs/standard/tei/ImportTEI .java

    public boolean isValid(TagData us) {
        if (Util.isSpecified(us, VAR) && Util.isSpecified(us, VAR_READER))
            return false;

        return true;
    }

または、JSP 2.0を使用している場合はvalidate、の配列を返すことができるため、実装は少し複雑になりますValidationMessage。Glassfishには例があります:( https://github.com/javaee/glassfish/blob/master/appserver/tests/appserv-tests/devtests/web/jspGetTagLibraryInfos/servlet/taglib/MyTagExtraInfo.java

    public ValidationMessage[] validate(TagData data) {
        ValidationMessage[] vms = null;
        TagLibraryInfo[] infos =
            getTagInfo().getTagLibrary().getTagLibraryInfos();
        if (infos.length != 1) {
            vms = new ValidationMessage[1];
            vms[0] = new ValidationMessage(null, "Wrong number of tsglibs");
        }
        return vms;
    }
于 2020-02-27T21:03:52.173 に答える