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

我决定恢复并编辑一个看起来部分正确的已删除答案。

您可以通过将其添加到 scriptlet 中来引发异常,如下所示:

<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>

但是,您的 jsps 应该是您的“视图”层的一部分,因此您应该真正尝试将您的逻辑(包括抛出异常)保留在您的 servlet 中。

注意if (true)声明。这是一个技巧,因为如果您只是将异常脚本放入代码中,编译器会抱怨“无法访问的代码”。

于 2016-09-29T15:36:01.890 回答
1

只需抛出即可立即注意到问题

谁会“注意到”?该异常只能被容器捕获,它将导致一些“500 Internal Server Error”页面(或您定义的一些自定义错误页面)。

如果那是您真正想要的,您可以定义一个自定义标签,该标签将只执行“抛出新的 WhatException()”,然后使用您的自定义标签库,例如:<mytaglib:reportError/>,因为标准核心标签库不会考虑抛出异常适合任何人。

于 2012-01-22T13:14:53.960 回答
1

我只会使用自定义的 EL 函数或标签,它会系统地抛出异常,或者显示带有错误消息的大红色 div,或者两者兼而有之

${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) 中提到了此类。必须使用此类:

    • 如果标签定义了任何脚本变量
    • 如果标签想要提供tagattributes 的翻译时验证

根据 JSP 版本,您可能需要重写isValid()validate()方法来处理验证开发人员提供的变量。

Apache 标签库使用这些来验证他们的一些标签:(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 回答