- 定制标签概述
定制标签的实现成为标签处理器(Tag Handler),简单的标签处理器是指实现SimpleTag接口的标签处理器。 - 简单的标签处理器的生命周期
(1) JSP容器通过吊桶无参构造器来创建一个简单的实例。所以,简单的标签处理器必须有一个无参构造器。
(2) Jsp容器调用JspContext方法,同时传递一个JspContext对象,其中最重要的方法是getOut,它返回一个响应到客户端。
(3) 如果标签处理器的定制标签是另一个标签的子标签,JSP容器就会调用setParent方法。
(4) JSP容器会给该标签的每个属性都调用设置方法setter
(5)如果标签有主体内容,JSP就会调用SimpleTag接口中的setJspBody方法,把主体的内容作为JspFragment传递。
(6) JSP调用doTag方法。所有的变量在doTag方法返回时进行同步。 - 例子
MyFirstTag类
public class MyFirstTag implements SimpleTag{
JspContext jspContext;
@Override
public void doTag() throws JspException, IOException {
// TODO Auto-generated method stub
System.out.println("doTag");
jspContext.getOut().print("this is my first tag");
}
@Override
public JspTag getParent() {
// TODO Auto-generated method stub
System.out.println("getParent");
return null;
}
@Override
public void setJspBody(JspFragment arg0) {
// TODO Auto-generated method stub
System.out.println("setJspBody");
}
@Override
public void setJspContext(JspContext jspContext) {
// TODO Auto-generated method stub
System.out.println("setJspContext");
this.jspContext = jspContext;
}
@Override
public void setParent(JspTag parent) {
// TODO Auto-generated method stub
System.out.println("setParent");
}
}
mytags.tld
<?xml version="1.0" encoding="ISO-8859-1"?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" verson="2.0">
<description>Simple tag examples</description>
<tlib-version>1.0</tlib-version>
<jspversion>2.3</jspversion>
<short-name>My First Taglib Example</short-name>
<tag>
<name>firstTag</name>
<tag-class>tag.MyFirstTag</tag-class>
<body-content>empty</body-content>
</tag>
</taglib>
如果要使标签里面有内容 里面的值应该为scriptless
使用标签
jsp文件:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ taglib uri="/WEB-INF/mytags.tld" prefix="easy" %>
<!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=ISO-8859-1">
<title>First Tag</title>
</head>
<body>
Hello!
<easy:firstTag></easy:firstTag>
</body>
</html>
访问页面:
控制台输出:
在调用jsp页面时,JSP会调用标签处理器的setJspContext方法。由于标签中没有主体内容,jsp不会在调用doTag方法之前调用setJspBody方法。JSP容器也没有调用setParent方法,因为该标签没有嵌套在另一个标签里面。
错误解决:
1.
type Exception report
message Mandatory TLD element jsp-version missing or empty in TLD /WEB-INF/funcation.tld
description The server encountered an internal error that prevented it from fulfilling this request.
在tld文件中,设置的jsp版本不正确
在tomcat的lib中找到jsp-api.jar。
查看里面的META-INF/MANIFEST.MF
标记部分就是jsp的版本。查看servlet的版本也一样(servlet-api.jar中)