1

使用 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 -->
<% } %>

是否可以编写一个支持elseand的自定义标签else if,而不是简单地为每个检查设置一对标签?

如果不可能,那是“首选”风格?小脚本或多个标签对?在我的组织中,大多数人似乎对 scriptlet 不屑一顾,但我还没有真正听到为什么像我列出的那些简单的条件语句如此糟糕的充分理由。

4

5 回答 5

4

XML 中的标签成对出现,一个打开一个关闭。if then else end 的三个元素不适合一个好的打开和关闭格式。唯一的另一种方法是使用选择标签,如下所示:

<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 结构的常用方法。

于 2009-06-04T01:03:27.000 回答
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>
于 2009-06-04T01:05:13.177 回答
1

上述解决方案将起作用(<c:choose> 和<c:if>)。

如果您有兴趣编写自定义标签来做更多或更“特定于域”,它们实际上很容易。

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

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

于 2009-06-04T13:15:09.620 回答
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 ...
<% } >
于 2009-06-04T00:53:14.340 回答
0

我看不出您为什么不能编写一个知道在其正文内容中查找该标记的自定义 JSP 标记的任何原因。这不是一个“最佳实践”,但它会是一种非常干净和直观的做事方式。

于 2009-11-30T20:25:14.173 回答