使用自定义标签集合在JSTL中切换语句/迭代

时间:2012-03-02 08:09:41

标签: java jsp java-ee jstl

HelloTag.Java

public class HelloTag extends SimpleTagSupport {

@Override
public void doTag() throws JspException, IOException {
    JspWriter out = getJspContext().getOut();

    ArrayList outerList = new ArrayList();
    ArrayList innerList = null;
    for (int i = 0; i < 5; i++) {
        innerList = new ArrayList();
        innerList.add("1");
        innerList.add("Name");
        outerList.add(innerList);
    }
    for (int i = 0; i < outerList.size(); i++) {
        for (int j = 0; j < innerList.size(); j++) {
            out.println(innerList.get(j));
        }
    }
}
}

在JSP文件中 有以下代码段:

 <body>
    <ct:Hello></ct:Hello>
</body>

当我运行JSP文件时,此文件显示准确的结果;但

我想对来自自定义标记类

的每个值做出决定

,例如

 <c:set var="name" scope="" value=""/>
 <c:choose>
 <c:when test="${name == 1}">
  This is Your ID:-
 </c:when>
 <c:otherwise>
    This is Your Name
 </c:otherwise>
 </c:choose>

上面的代码仅仅是为了举例。请更新我如何决定自定义标签类的每个值。

解释我的问题的其他方法是,我想将每个值存储在一个变量中,然后使用JSTL来决定该值,而不使用Scriplet标记,重点关注上述场景( HelloTag.Java

1 个答案:

答案 0 :(得分:2)

目前还不清楚你在问什么。但是你的标签实际上只是循环遍历外部列表的每个内部列表(实际上,我想它应该这样做,但它有一个错误,所以它没有)。

您不需要自定义标记来执行此操作,因为JSTL <c:forEach>标记已经执行此操作。假设您有一个存在于请求(或页面,或会话或应用程序)属性中的outerList:

<%-- iterate through the outer list --%>
<c:forEach var="innerList" items="${outerList}">
    <%-- iterate through the innerList --%>
    <c:forEach var="element" items="${innerList}">
        <%-- do what you want with the element --%>
    </c:forEach>
</c:forEach>

从你的问题来看,在我看来你不应该有一个内心清单。相反,外部列表应包含具有PersongetId()方法的对象(例如getName()类的实例)。因此循环将是:

<%-- iterate through the outer list --%>
<c:forEach var="person" items="${personList}">
    ID : ${person.id}<br/>
    Name : <c:out value="${person.name}"/>
</c:forEach>