问题1: 主要是关于片段的概念,如下代码段是<my:testTag....>...</my:testTag>这个使用标记被称为“片段”呢,还是体中的<jsp:attribute>...</jsp:attribute> 被称为片段?
  因为testTag.tag文件中 body-content="empty" 所以也就不存在体了,因此我觉得把整个使用标记文件的标签称为片段。问题2: 是关于指令 variable 概念上有点模糊,在testTag.tag中current的值是复制到属性 var 中,还是直接复制到调用页面的test.jsp中? 还有一个问题,在test.jsp中 var="anyName" 是指为标记文件中的属性var赋值吗?如果是的话,为什么el表达式调用的是这个anyName的值,而不是属性名"var"?

test.jsp 
<%@ page contentType="text/html" %>
<%@ taglib prefix="my" tagdir="/WEB-INF/tags/mytags" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><html>
  <head>
    <title>Even and Odd Rows</title>
  </head>
  <body bgcolor="white">
    <h1>Even and Odd Rows</h1>
    <table>
      <my:testTag items="a,b,c,d,e" var="anyName">
        <jsp:attribute name="even">
          <c:set var="counter" value="${counter + 1}" />
          <tr bgcolor="red"><td>${counter}: Even Row: ${anyName}</td></tr>
        </jsp:attribute>
        <jsp:attribute name="odd">
          <c:set var="counter" value="${counter + 1}" />
          <tr bgcolor="blue"><td>${counter}: Odd Row: ${anyName}</td></tr>
        </jsp:attribute>
      </my:testTag>
    </table>
  </body>
</html>

testTag.tag

<%@ tag body-content="empty" %>
<%@ attribute name="items" rtexprvalue="true" required="true" %>
<%@ attribute name="var" rtexprvalue="false" required="true" %>
<%@ attribute name="even" fragment="true" required="true" %>
<%@ attribute name="odd" fragment="true" required="true" %>
<%@ variable name-from-attribute="var" alias="current" 
  variable-class="java.lang.Object" scope="NESTED" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><c:forEach items="${items}" varStatus="status" var="current">
  <c:choose>
    <c:when test="${status.count % 2 == 0}">
      <jsp:invoke fragment="even" />
    </c:when>
    <c:otherwise>
      <jsp:invoke fragment="odd" />
    </c:otherwise>
  </c:choose>
</c:forEach>

解决方案 »

  1.   

    我尝试回答下问题2,我是这么理解的,current就跟java里面声明的一个变量一样,后面可以通过${current}来取这里的值,具体说var="current"我感觉就像一个变量的定义,就是一种写法而已。就跟java中类型名 变量名的写法一样。不知道能明白吗。
      

  2.   

    谢谢楼上的回答,但是还是不太明白她的机制
    首先
    ......
    <table>
          <my:testTag items="a,b,c,d,e" var="anyName">
    这里的var=anyName 应该是为 testTag.tag中的片段属性var 提供一个属性值
            <jsp:attribute name="even">
    ......二、
    <%@ attribute name="var" rtexprvalue="false" required="true" %>
    在testTag.tag中这里声明了片段 var 搞不懂为什么这里的 name 还必须是 var,而此时它的值就是上面代码中的 anyName 了三、
    <%@ variable name-from-attribute="var" alias="current" 
      variable-class="java.lang.Object" scope="NESTED" %>
    这里将名为 var 的属性的别名设置为 current , 至于 scope 关于何时将值复制到调用页面的(也就是 test.jsp 页面),什么标记开始时、什么标记结束时、在标记中时,等完全不明白,有设呢区别和,所谓的开始标记和结束标记是不是<my:testTag>...</my:testTag>也不清楚,愿意附带指教的请一定指教谢谢!四、
    <c:forEach items="${items}" varStatus="status" var="current">
      <c:choose>
    ......
    这里只是声明了一个名为"current"的一个变量,它的值就是
    ......
    <my:testTag items="a,b,c,d,e" var="anyName">
    这里传到片段里的值 a、b、c、d 4个
    ......五、但是至于
    ......
    <tr bgcolor="red"><td>${counter}: Even Row: ${anyName}</td></tr>
    ......
    调用的时候为什么是调用anyName我就不明了,anyName不就是一个名为var的属性片段值嘛~~,而且它的别名 current 的值是 a b c d 为什么要调用 anyName呢??上面的理解肯定有错(否则也就不会想不通了,请大家帮忙指正,谢谢!!)
      

  3.   

    1、说实在的,没看明白lz的问题...
    2、建议lz去看看有关taglib,也就是标签库的内容。应该就明白了。good luck