2014-12-05 168 views
1

考虑片断
loop.jsp自定义标签迭代通过JSP

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" 
    pageEncoding="ISO-8859-1"%> 
<%@ taglib uri="mypredefinedtaglibrary" prefix="my" %> 
<html> 
<head> 

</head> 
<body> 
    <my:looping end="5" start="1"> 
    <p>My Name is Khan</p><br/> 
    </my:looping> 

</body> 
</html> 

MyTagHandlerForLoop.java

public class MyTagHandlerForLoop extends TagSupport { 

    private static final long serialVersionUID = 1L; 
    private int start = 0; 
    private int end = 0; 

    public void setStart(int start) { 
     this.start = start; 
    } 

    public void setEnd(int end) { 
     this.end = end; 
    } 

    @Override 
    public int doAfterBody() throws JspException { 
     if (start < end) { 
      start++; 
      return EVAL_BODY_AGAIN; 
     } else { 
      return SKIP_BODY; 
     } 

    } 

    @Override 
    public int doStartTag() throws JspException { 

     return EVAL_BODY_INCLUDE; 
    } 

} 

mytags.tld

<tag> 
     <name>looping</name> 
     <tag-class>org.customtags.MyTagHandlerForLoop</tag-class> 
     <body-content>scriptless</body-content> 
     <attribute> 
      <name>start</name> 
      <required>true</required> 
     </attribute> 
     <attribute> 
      <name>end</name> 
      <required>true</required> 
     </attribute> 
    </tag> 

内部web.xml配置

<jsp-config> 
    <taglib> 
     <taglib-uri>mypredefinedtaglibrary</taglib-uri> 
     <taglib-location>/WEB-INF/tags/mytags.tld</taglib-location> 
    </taglib> 
    </jsp-config> 

的O/P为反映:

My Name is Khan 
My Name is Khan 
My Name is Khan 
My Name is Khan 
My Name is Khan 

当我在调试模式的第一运行,对象全部被创建, 那么setter是c/d,导致

start = 1 
end = 5 

if (start < end) { 
       start++; 
       return EVAL_BODY_AGAIN; 

该循环过程执行4次。

那么,为什么我的名字是汗输出5次。不应该是4次。

+0

注释掉'doAfterBody()'中的所有内容。现在打印多少次? 1,对吗?因为'doStartTag()'正在打印一次。至少这就是我所猜测的。 – developerwjk 2014-12-05 22:37:31

回答

1

“Evaluate Body”,输出“我的名字是汗”,运行5次。首先从doStartTag()方法,然后,如您所建议的那样,从doAfterBody()方法中再增加4倍。

此图解释了经典自定义标签的工作原理。

custom tag cycle

+0

非常感谢。 – 2015-07-22 09:26:41