JSP自定义标签:是否可以拥有多个启动/关闭标签?

时间:2009-06-04 00:41:14

标签: java jsp coding-style django-templates custom-tag

使用Django模板语言后,我真的很想能够做到这样的事情:

{% if condition %}
    <!-- snip -->
{% else %}
    <!-- snip -->
{% endif %}

当我使用JSP时,我很难做到这样的事情:

<logic:equal name="something" value="example">
    <!-- snip -->
</logic:equal>
<logic:notEqual name="something" value="example">
    <!-- snip -->
</logic:notEqual>

或:

<% if (condition) { %>
   <!-- snip -->
<% } else { %>
   <!-- snip -->
<% } %>

是否可以编写支持elseelse if的自定义标记,而不是只为每个支票添加一对标记?

如果不可能,这是“首选”风格? Scriptlets或多个标签对?在我的组织中,大多数人似乎对Scriptlet不满意,但我还没有真正理解为什么像我列出的简单条件语句那么糟糕的原因。

5 个答案:

答案 0 :(得分:4)

XML中的标签成对出现,一个打开一个要关闭。 if then else结尾的三个元素不会提供一个好的打开和关闭格式。唯一的另一种方法是使用choose标记,如下所示:

<c:choose>
  <c:when test="${bean.value == 2}">
    <p>True</p>
  </c:when>
  <c:otherwise>
    <p>False</p>
  </c:otherwise>
</c:choose>

这是在jstl中编码if then else结构的常用方法。

答案 1 :(得分:4)

JSTL标签带有一个选择标签,其作用类似于多选。

<c:choose>
    <c:when test="${first condition}">
       whatever
    </c:when>
    <c:when test="${second condition}">
       whatever
    </c:when>
    <c:when test="${third condition}">
       whatever
    </c:when>
    <c:otherwise>
          whatever else
    </c:otherwise>
 </c:choose>

答案 2 :(得分:1)

以上解决方案可行(<c:choose&gt;和<c:if&gt;)。

如果您有兴趣编写自定义标签以进行更多操作或更具“特定领域”,那么它们实际上非常简单。

我几年前在JavaOne上做了一个演示 - 幻灯片在http://javadude.com/articles/javaone/index.html(在第一部分)。有关如何编写循环和条件标记的详细信息。 (我在标准标签库出来之前做过演示,顺便说一下)

http://www.orionserver.com/docs/tutorials/taglibs/index.html还有一个非常好的自定义标签教程。它有一些针对orion服务器的细节,但大多数都是非常通用的。

答案 3 :(得分:0)

标准标记库中有条件标记:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<c:if ... >

</c:if>

查找对jstl的任何引用。

你也可以直接在jsp中这样做,虽然它有点不受欢迎:

<% if (something) { %>
 ... this will only display if something is true ...
<% } >

答案 4 :(得分:0)

我没有看到任何理由为什么你不能编写一个知道在其bodycontent中寻找标签的自定义JSP标签。这不是一个“最佳实践”,但它将是一种非常干净和直观的做事方式。