- 自定义标签
tld文件:taglib description 的缩写,标签库描述文件。 - 编写流程
- 1 编写实现类
- 2 编写配置文件tld
- 3 在jsp中使用
- 编写流程实现
- 1 编写实现类
传统标签:Tag接口,编写繁琐,不适合初学者。实现类:TagSupport
简单标签:SimpleTag接口,实现类:SimpleTagSupport 【使用】 - 2 编写配置文件tld
tld文件基于xml,内容是xml,扩展名为tld。需要特殊的编辑器处理。
文件名称:自定义
文件位置:
WEB INF目录下,除classes和lib目录
WEB INF/lib目录中jar文件中,META INF目录 - 3 在jsp中使用
引用:<%@ taglib uri="" prefix=""%>
@taglib对指定的标签库进行引用的 uri,确定使用的哪一个标签库 (a标签)prefix,前缀 自定义(xx)
- 1 编写实现类
实现类:
package com.myweb.tag;
import java.io.IOException;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import javax.servlet.jsp.JspContext;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.JspTag;
import javax.servlet.jsp.tagext.SimpleTag;
public class MyTag implements SimpleTag {
private PageContext pageContext;
private JspFragment jspBody; //获得标签体
/**
* 1
*/
public void setJspContext(JspContext pc) {
this.pageContext = (PageContext) pc;
}
//提供页面属性attribute对应的 类的属性property的set方法
private Map items;
private String var;
/**
* 2
* @param items
*/
public void setItems(Map items) {
this.items = items;
}
public void setVar(String var) {
this.var = var;
}
/**
* 3 获得标签体
*/
public void setJspBody(JspFragment jspBody) {
this.jspBody = jspBody;
}
/**
* end
*/
public void doTag() throws JspException, IOException {
Set set2 = items.entrySet();
Iterator it2 = set2.iterator();
while(it2.hasNext()){
Object obj = it2.next();
Map.Entry entry = (Map.Entry)obj;
//将entry放置到域中,el必须从域中获取内容
pageContext.setAttribute(var, entry); //page
//循环一次标签体输出一次
this.jspBody.invoke(this.pageContext.getOut()); //将标签体的内容输出到指定的流中
}
}
@Override
public void setParent(JspTag parent) {
}
@Override
public JspTag getParent() {
return null;
}
}
tld文件:
<?xml version="1.0" encoding="UTF-8"?>
<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>
<!-- 建议再jsp引用时,使用的前缀名称 -->
<short-name>my</short-name>
<!-- 给每一个标签库进行命名,建议全球唯一,URL -->
<uri>http://www.myweb.com/mytag</uri>
<!-- tld配置文件与 实现类关联 -->
<!-- 配置循环 标签 -->
<tag>
<name>forEach</name>
<tag-class>com.myweb.tag.MyTag</tag-class>
<!--
empty : 没有标签体
scriptless : 不支持jsp脚本 <%%>,但支持el表达式
JSP : 支持jsp所有功能,但只有传统标签可以使用。SimpleTag简单标签不能使用
tagdependent : 此标签在内部使用,一般不使用
-->
<body-content>scriptless</body-content>
<!-- 声明属性 items -->
<attribute> <!-- 实现必须通过property set方法获得数据 -->
<!-- 属性的名称 -->
<name>items</name>
<!-- 必须填写 -->
<required>true</required>
<!-- runtime expressions 是否支持运行时表达式 -->
<rtexprvalue>true</rtexprvalue>
</attribute>
<!-- 声明属性 var -->
<attribute>
<name>var</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
jsp文件:
<%@page import="java.util.HashMap"%>
<%@page import="com.myweb.bean.Person"%>
<%@page import="java.util.Map"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.myweb.com/mytag" prefix="my" %>
<!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" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<hr><br>
<%
//准备数据
Map<String,Person> personMap = new HashMap<String,Person>();
personMap.put("001", new Person("p001","Uzi","18"));
personMap.put("002", new Person("p002","Deft","19"));
personMap.put("003", new Person("p003","Impl","20"));
pageContext.setAttribute("personMap", personMap); //page作用域
%>
<!-- 使用测试 -->
<my:forEach items="${personMap}" var="entry">
${entry.key} ===> ${entry.value} <br/>
</my:forEach>
</body>
</html>
结果: