当属性无效时,我可以在自定义JSP标记中抛出JSTL异常吗?

时间:2012-01-13 04:21:47

标签: jsp exception jstl custom-tags

我正在制作一些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>

如果传递错误的值,我想抛出异常。当我搜索这个主题时,我刚刚找到this。我不能在JSTL中抛出正常的异常吗?

4 个答案:

答案 0 :(得分:2)

我决定恢复和编辑a deleted answer,这看起来部分正确。

  

您可以通过在类似的脚本中添加例外来抛出异常:

<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应该是你观看的一部分&#34;因此,您应该尝试将您的逻辑(包括抛出异常)保留在您的servlet中。

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

答案 1 :(得分:1)

  

立刻注意到问题

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

如果那是你真正想要的,你可以定义一个自定义标签,只执行“抛出新的WhateverException()”,然后使用你的自定义标签库,如:<mytaglib:reportError/>,作为标准的核心标签工具做了不考虑抛出异常对任何人来说都是可取的。

答案 2 :(得分:1)

我只是使用自定义EL函数或标记系统地抛出异常,或者显示带有错误消息的大红色div,或两者都

${myFn:illegalState("the type must be odd or even but it is " ${type})}

答案 3 :(得分: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;
    }