目录
前言
上次我们分享了自定义标签--jsp标签基础,今天分享的内容是自定义标签——jsp标签增强。
一、自定义foreach标签
1、定义助手类ForeachTag
分析foreach标签所需属性:1. items 2.var
package com.zhw.tag;
import java.util.Iterator;
import java.util.List;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;
public class ForeachTag extends BodyTagSupport{
private List<Object> items;
private String var;
public List<Object> getItems() {
return items;
}
public void setItems(List<Object> items) {
this.items = items;
}
public String getVar() {
return var;
}
public void setVar(String var) {
this.var = var;
}
@Override
public int doStartTag() throws JspException {
Iterator<Object> it = items.iterator();
pageContext.setAttribute(var, it.next());
pageContext.setAttribute("it", it);
return EVAL_BODY_INCLUDE;
}
@Override
public int doAfterBody() throws JspException {
Iterator<Object> it = (Iterator<Object>) pageContext.getAttribute("it");
if(it.hasNext()) {
pageContext.setAttribute(var, it.next());
pageContext.setAttribute("it", it);
return EVAL_BODY_AGAIN;
}else {
return EVAL_PAGE;
}
}
}
doStartTag():
@Override public int doStartTag() throws JspException { Iterator<Object> it = items.iterator(); pageContext.setAttribute(var, it.next()); pageContext.setAttribute("it", it); return EVAL_BODY_INCLUDE; }
因为我们是要遍历数据,所以我们需要把集合里面的值一个一个输出,然后一个一个的赋值。在这里我们就使用到了iterator()也就是迭代器。在迭代器中如果有值,我们就把值赋值给var,也就是我定义的遍历输出的值。注意:在这里我们不能直接在dostartTag方法里面把当前集合给赋值完,因为dostartTag方法只是开始,它是不能直接处理标签体的。所以接下来我们就需要把迭代器的值用pageContext存储起来,在doAfterBody方法中要使用到
doAfterBody():
@Override public int doAfterBody() throws JspException { Iterator<Object> it = (Iterator<Object>) pageContext.getAttribute("it"); if(it.hasNext()) { pageContext.setAttribute(var, it.next()); pageContext.setAttribute("it", it); return EVAL_BODY_AGAIN; }else { return EVAL_PAGE; } }
在doAfterBody方法里面我们首先要得到我们存储的迭代器,然后就可以开始判断迭代器中是否还有数据。如果有数据,就把数据赋值到var中,如果没有则结束
接下来进入tld文件的编写。
2、定义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>JSTL 1.1 core library</description>
<display-name>JSTL core</display-name>
<tlib-version>1.1</tlib-version>
<short-name>z</short-name>
<uri>http://jsp.zhwLouis</uri>
<validator>
<validator-class>
org.apache.taglibs.standard.tlv.JstlCoreTLV
</validator-class>
</validator>
<tag>
<name>foreach1</name>
<tag-class>com.zhw.tag.ForeachTag</tag-class>
<body-content>JSP</body-content>
<attribute>
<!--标识集合遍历是指针所在的位置,指向当前遍历对象-->
<name>items</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<!--标识集合遍历是指针所在的位置,指向当前遍历对象-->
<name>var</name>
<required>true</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
</tag>
</taglib>
3、 使用自定义的foreach标签
<%@page import="com.zhw.tag.Teacher"%>
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="z" uri="http://jsp.zhwLouis" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type"