java代码:
package com.zx.tag;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class EachTag extends SimpleTagSupport {
//1.获取要遍历的结果集
private List item;
private String var;
public void setItem(List item) {
this.item = item;
}
public void setVar(String var) {
this.var = var;
}
@Override
public void doTag() throws JspException, IOException {
System.out.println(var);
//2.对结果集进行遍历
for(Object o : item) {
System.out.println(o+",");
//3.将对应键值对放入作用域
this.getJspContext().setAttribute(var, o);
this.getJspBody().invoke(null);
}
}
}
tld代码:
<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<description>自定义标签</description>
<display-name>zdytag</display-name>
<tlib-version>1.0</tlib-version>
<!-- zy:ip -->
<short-name>zy</short-name>
<uri>http://www.zhuoxun/jxb</uri>
<tag>
<description>这个标签用来遍历结果集</description>
<name>each</name>
<tag-class>com.zx.tag.EachTag</tag-class>
<body-content>scriptless</body-content>
<attribute>
<description>结果集</description>
<name>item</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<description>获取作用域中键值对的key</description>
<name>var</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
html代码:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.*"%>
<%@ taglib uri="http://www.zhuoxun/jxb" prefix="zy"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>main</title>
</head>
<body>
<%
List<String> list = new ArrayList<>();
list.add("打篮球");
list.add("看电视");
list.add("踢足球");
request.setAttribute("list", list);
%>
<!-- 自定义标签完成c:forEach的功能 -->
<ul>
<!-- !!!!!自定义标签中属性的值是作用域中键值对的key!!!! -->
<zy:each item="${list }" var="one">
<!-- el表达式是从作用域(大到小)中获取key为one的键值对 -->
<li>${one}</li>
</zy:each>
</ul>
</body>
</html>
注意:
java中的属性名item、var,准确的说要和java中的set方法中set后面的东西一致(setItem)
tld中的tag/attribute/name
html中的zy:each里面的item、var
这三个位置的字段名要一样,也必须一样
其他
自己建立了一个技术群,大家愿意主动学习和分享,愿意一块实现一些有意思的技术,进行理论和实践的交流。这里面有前端和后段,不是单一的一种,方便大家沟通前后端兼容问题