1.背景

  1)自定义标签可以降低 jsp 开发的复杂度和维护量,从 html 角度来说,可以使 html 不用去过多的关注那些比较复杂的商业逻辑(业务逻辑);

可以软件开发人员和页面设计人员合理分工:页面设计人员可以把精力集中在使用标签(HTML,XML或者JSP)创建网站上,而软件开发人员则可以将精力集中在实现底层功能上面,如国际化等,

    从而提高了工程生产力;

  3)将具有共用特性的tag库应用于不同的项目中,体现了软件复用的思想。

2.什么是自定义标签

用户定义的一种自定义的jsp标记

     实际上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,描述

 

      

java 文件打标签 java web标签_Customer

 

 

1)SimpleTag 接口

  ① setJspContext 方法:该方法把代表 JSP 页面的 pageContext 对象传递给标签处理器对象

  ② setParent 方法:该方法把父标签处理器对象传递给当前标签处理器对象

  ③ getParent 方法:该方法用于获得标签的父标签处理器对象

  ④ setJspBody 方法:该方法用于把代表标签体的 JspFragment 对象传递给标签处理器对象

  ⑥ doTag 方法:该方法用于完成所有的标签逻辑。该方法可以抛出 javax.servlet.jsp.SkipPageException 异常,用于通知 web 容器不再执行 JSP 页面中位于结束标记后面的内容

 

2)实现 SimpleTag 接口的标签处理器类的生命周期

    

java 文件打标签 java web标签_java_02

 

  

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>