自定义标签

  • 自定义标签
    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)

实现类:

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>

结果:

结果

Coding Diary

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值