自定义标签:
自定义标签的出现是为了替代jsp脚本的。jsp标签最终会被翻译完一段java代码,所以使用标签就是以标签的形式去调用Java代码
比对:
/**
jsp脚本:
<%request.getRequestDispatcher("").forward(request, response); %>
jsp标签:
<jsp:forward page=""></jsp:forward>
*/
===================
代码结构:
使用步骤:
1、创建一个Java类,该类是标签处理类,实现SimpleTag接口
2、编写一个tld文件(实际上是一个xml文件)
MyTag.java
package com.atguigu.taglib;
import java.io.IOException;
import javax.servlet.jsp.JspContext;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.JspTag;
import javax.servlet.jsp.tagext.SimpleTag;
/**
* 自定义标签的HelloWorld
* 这个标签让他再页面中输出一个简单的内容
* <h1>这是我的第一个自定义标签</h1>
* @author lilichao
*
*/
public class MyTag implements SimpleTag {
private JspContext context;
/**
* doTag()在标签执行时被调用
*/
@Override
public void doTag() throws JspException, IOException {
//获取out对象
JspWriter out = context.getOut();
//通过out对象向页面输出一个内容
out.print("<h1>这是我的第一个自定义标签</h1>");
//在控制台输出一个内容
System.out.println("Hello Tag!");
}
@Override
public void setParent(JspTag parent) {
}
@Override
public JspTag getParent() {
return null;
}
//我们有JspContext,该类其实就是PageContext的父类,通过该方法可以为我们自己创建的context进行赋值,之后就可以通过context对象去获得输出流对象
//设置当前页面的上下文,这个JspContext就是PageContext,可以用来获取页面中的其他隐含对象
@Override
public void setJspContext(JspContext pc) {
this.context = pc;
}
//设置标签体的内容,这个方法由服务器调用, 服务器通过该方法将标签体传入到处理器类中,我们自己不能调用,没有JspFragment.
@Override
public void setJspBody(JspFragment jspBody) {
}
}
atguigu-taglib.tld
<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xml="http://www.w3.org/XML/1998/namespace" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd ">
<tlib-version>1.0</tlib-version>
<short-name>a</short-name>
<uri>http://www.atguigu.com/taglib/a</uri>
<tag>
<name>MyTag</name>
<tag-class>com.atguigu.taglib.MyTag</tag-class>
<body-content>empty</body-content>
</tag>
</taglib>
1.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="a" uri="http://www.atguigu.com/taglib/a" %>
<!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>
<a:MyTag/>
</body>
</html>
附图:创建tld文件
new–folder–tlds
tlds–右键–new xml file–atguigu-taglib.tld–next–create xml file from 勾选schema约束–next–select xml schema file勾选catalog entry,选择web-jsptaglibrary_2_0.xsd
tip1:
1.jsp引入自定义标签使用taglib指令,prefix的值是任意写的,一般为
<short-name>a</short-name>
里定义的。我们也可以自己写成:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="abcd" uri="http://www.atguigu.com/taglib/a" %>
<!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>
<abcd:MyTag/>
</body>
</html>
tip2:创建自定义标签处理类,有点和创建servlet类似,比对:
创建一个servlet需要实现Servlet,而servlet类需要让服务器知道并加载就必须在web.xml中配置。
创建自定义标签的前提就是先要有自定义标签处理类,再创建自定义标签引进自定义标签处理类,之后我们才能够在jsp页面中通过taglib指令引进来后才能使用自定义标签。而自定义标签处理类同样需要实现一个SimpleTag接口,同样也需要配置才能够让tomcat服务器知道有这样的一个标签处理类,不同的是自定义标签处理类并没有在web.xml中配置,而是需要自己手动编写一个tld文件。
=========================
未完待续!