本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用
内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系。
本人互联网技术爱好者,互联网技术发烧友
微博:伊直都在0221
QQ:951226918
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1.背景
1)自定义标签可以降低 jsp 开发的复杂度和维护量,从 html 角度来说,可以使 html 不用去过多的关注那些比较复杂的商业逻辑(业务逻辑);
2)利用自定义标签,可以软件开发人员和页面设计人员合理分工:页面设计人员可以把精力集中在使用标签(HTML,XML或者JSP)创建网站上,而软件开发人员则可以将精力集中在实现底层功能上面,如国际化等,
从而提高了工程生产力;
3)将具有共用特性的tag库应用于不同的项目中,体现了软件复用的思想。
2.什么是自定义标签
1)用户定义的一种自定义的jsp标记 。当一个含有自定义标签的jsp页面被jsp引擎编译成servlet时,tag标签被转化成了对一个称为 标签处理类 的对象的操作。于是,当jsp页面被jsp引擎转化为servlet后,
实际上tag标签被转化为了对tag处理类的操作。
2)标签的形式
①空标签:<hello/>
②带有属性的空标签: <max num1=“3” num2=“5”/>
③带有内容的标签: <greeting> hello </greeting>
④带有内容和属性的标签: <greeting name=“Tom”> hello </greeting>
3.使用一个标签
index.jsp
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <%@ page import="java.util.*" %> 4 <%@ page import="com.jason.test.javabean.Customer" %> 5 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 6 <html> 7 <head> 8 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 9 <title>Simple Tag </title> 10 </head> 11 <body> 12 13 <% 14 //模拟servlet 中的操作 15 List<Customer> customers = new ArrayList<Customer>(); 16 customers.add(new Customer(1,"AA",12)); 17 customers.add(new Customer(2,"BB",13)); 18 customers.add(new Customer(3,"CC",14)); 19 customers.add(new Customer(4,"DD",15)); 20 customers.add(new Customer(5,"EE",16)); 21 22 request.setAttribute("customers", customers); 23 %> 24 25 <jsp:forward page="testtag.jsp"></jsp:forward> 26 27 </body> 28 </html>
testtag.jsp
1) 通过指令 taglib 引入标签的uri ,设置前缀 prefix
2) 使用uri里面的 标签
1 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 2 3 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 4 5 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 6 <html> 7 <head> 8 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 9 <title>Insert title here</title> 10 </head> 11 <body> 12 <c:forEach items="${requestScope.customers }" var="customer"> 13 ${customer.id }, ${customer.name}, ${customer.age }<br> 14 </c:forEach> 15 16 </body> 17 </html>
4.标签库 API,描述
1)SimpleTag 接口
① setJspContext 方法:该方法把代表 JSP 页面的 pageContext 对象传递给标签处理器对象
② setParent 方法:该方法把父标签处理器对象传递给当前标签处理器对象
③ getParent 方法:该方法用于获得标签的父标签处理器对象
④ setJspBody 方法:该方法用于把代表标签体的 JspFragment 对象传递给标签处理器对象
⑥ doTag 方法:该方法用于完成所有的标签逻辑。该方法可以抛出 javax.servlet.jsp.SkipPageException 异常,用于通知 web 容器不再执行 JSP 页面中位于结束标记后面的内容
2)实现 SimpleTag 接口的标签处理器类的生命周期
5. 如何自定义一个标签:编写一个 hello world
1)编写完成标签功能的 Java 类(标签处理器),实现 SimpleTag 接口
MyTag.java
1 package com.jason.tag.mytag; 2 3 import java.io.IOException; 4 5 import javax.servlet.jsp.JspContext; 6 import javax.servlet.jsp.JspException; 7 import javax.servlet.jsp.tagext.JspFragment; 8 import javax.servlet.jsp.tagext.JspTag; 9 import javax.servlet.jsp.tagext.SimpleTag; 10 11 public class MyTag implements SimpleTag { 12 13 @Override 14 public void doTag() throws JspException, IOException { 15 16 System.out.println("hello world ... "); 17 } 18 19 @Override 20 public JspTag getParent() { 21 System.out.println("JspTag ... "); 22 return null; 23 } 24 25 @Override 26 public void setJspBody(JspFragment arg0) { 27 System.out.println("setJspBody ... "); 28 } 29 30 @Override 31 public void setJspContext(JspContext arg0) { 32 System.out.println("setJspContext ... "); 33 34 } 35 36 @Override 37 public void setParent(JspTag arg0) { 38 System.out.println("setParent ... "); 39 } 40 41 }
2)编写标签库描述(tld)文件 xml 文件,在tld文件中对自定义中进行描述,放在 WEB-INF目录下
mytag.cld
1 <?xml version="1.0" encoding="UTF-8" ?> 2 3 <!-- ① 固定部分 --> 4 <taglib xmlns="http://java.sun.com/xml/ns/j2ee" 5 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 6 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" 7 version="2.0"> 8 9 <!-- ② 描述 tld 文件 --> 10 <description>jaosn‘s first DIY jsp tag</description> 11 <display-name>jason tag</display-name> 12 <tlib-version>1.0</tlib-version> 13 14 <!-- 建议在 JSP 页面上使用的标签的前缀 --> 15 <short-name>jason</short-name> 16 17 <!-- 作为 tld 文件的 id ,用来唯一标识当前的 tld 文件,多个 tld 文件的 uri 不能重复,通过 JSP 页面的 taglib 指令的 uri 属性引用 --> 18 <uri>http://www.jason.com/jason/diy/tag/core</uri> 19 20 21 22 <!-- ③描述自定义的 HelloSimpleTag 标签 --> 23 <tag> 24 <!-- 标签名字 --> 25 <name>hell</name> 26 27 <!-- 标签所在的全类名--> 28 <tag-class>com.jason.tag.mytag.MyTag</tag-class> 29 30 <!-- 标签体的类型 --> 31 <body-content>empty</body-content> 32 33 </tag> 34 35 </taglib>
3)在 JSP 页面中导入和使用自定义标签
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 4 <%@ taglib prefix="jason" uri="http://www.jason.com/jason/diy/tag/core" %> 5 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 6 <html> 7 <head> 8 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 9 <title>Insert title here</title> 10 </head> 11 <body> 12 13 <jason:hell/> 14 15 </body> 16 </html>