问题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>
因为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>
首先
......
<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呢??上面的理解肯定有错(否则也就不会想不通了,请大家帮忙指正,谢谢!!)
2、建议lz去看看有关taglib,也就是标签库的内容。应该就明白了。good luck