1). MFForEach
①. 在 WEB-INF 文件夹下新建一个 .tld(标签库描述文件) 为扩展名的 xml 文件.
②. 在 tld 文件中描述自定义的标签:
<?xml version="1.0" encoding="ISO-8859-1"?>
<taglib xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
version="2.1">
<!--版本-->
<tlib-version>1.0</tlib-version>
<!-- 标签建议前缀-->
<short-name>atguigu</short-name>
<!-- uri-->
<uri>http://atguigu.com</uri>
<tag>
<!-- 标签的名字: 在 JSP 页面上使用标签时的名字 -->
<name>MFForEach</name>
<!-- 标签所在的全类名 -->
<tag-class>com.practice.App.Servlet.Tag2.MFforEach</tag-class>
<!-- 标签体的类型 :empty为无标签体-->
<body-content>scriptless</body-content>
<!-- 标签属性 -->
<attribute>
<!-- 标签属性名-->
<name>item</name>
<!-- 标签属性是否是必须的-->
<required>true</required>
<!-- 标签属性是否支持运行时表达式的值-->
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>var</name>
<required>true</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
</tag>
</taglib>
③. 创建一个标签处理器类MFforEach : 实现 SimpleTag 接口.
package com.practice.App.Servlet.Tag2;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
import java.io.IOException;
import java.util.List;
public class MFforEach extends SimpleTagSupport {
private List<?>item;
private String var;
// 可以直接调用其对应的 getter 方法得到对应的属性
public void setItem(List<?> item) {
this.item = item;
}
public void setVar(String var) {
this.var = var;
}
public void doTag() throws JspException, IOException {
if(item!=null){
for(Object obj:item){
getJspContext().setAttribute(var,obj);
//显示标签体内容
getJspBody().invoke(null);
}
}
}
}
④. 在 JSP 页面上使用自定义标签:
使用 taglib 指令导入标签库描述文件:
<%@taglib uri=“http://atguigu.com” prefix=“atguigu” %>
<%@ taglib prefix="atguigu" uri="http://atguigu.com" %>
<%--
Created by IntelliJ IDEA.
User: H
Date: 2019/7/13
Time: 17:16
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>MFForEach</title>
</head>
<body>
<atguigu:MFForEach item="${requestScope.customers}" var="cus">
${pageScope.cus.id},${cus.name},${cus.age}
<br/>
</atguigu:MFForEach>
<br/>
</body>
</html>
输出标签体内容
public class TextJspFragment extends SimpleTagSupport {
public void doTag() throws JspException, IOException {
JspFragment bodycontent=getJspBody();
StringWriter stringWriter=new StringWriter();
bodycontent.invoke(stringWriter);
//若bodycontent.invoke(null);则为在jsp页面显示标签体内容
String content=stringWriter.toString().toUpperCase();
getJspContext().getOut().println(content);
System.out.println(stringWriter.toString());
}
}
三个重要方法
getJspContext():获取JspContext对象:实际传进来的是ServletContext对象
getJspBody;与标签体内容有关
getParent():获取父标签处理类的对象