Tiglib指令与自定义标签
<!--[if !supportLists]-->1. <!--[endif]-->taglib指令
在JSP页面中,可以直接使用JSP提供的一些动作元素标记来完成特定功能,如使用<jsp:include>包含一个文件。通过使用taglib指令,开发者就可以在页面中使用这些基本标记或自定义的标记来完成特殊的功能。
taglib指令的使用格式如下:
<%@ taglib uri="tagURI" prefix="tagPrefix" %>
参数说明
uri属性:该属性指定了JSP要在web.xml文件中查找的标签库描述符,该描述符是一个标签描述文件(*.tld)的映射。在tld标签描述文件中定义了该标签库中的各个标签名称,并为每个标签指定一个标签处理类。另外,通过uri属性直接指定标签描述文件的路径,而无需在web.xml文件中进性配置,同样可以使用指定的标记。
prefix属性:该属性指定一个在页面中使用由uri属性指定的标签库的前缀。但是前缀命名不能为:jsp、jspx、java、javax、sun、servlet和sunw开发者可以通过前缀来引用标签库中的标签。
如
一个简单的使用JSTL的代码:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<c:set var="name" value="hello"/>
上述代码通过<c:set>标签将“hello”值赋给了变量“name”。
引入strut2的标签:
<%@ tablig=”/struts-tag” prefix=”s”%>
2. 自定义标签
步骤如下
1) 实现自己的处理类,一般是从TagSupport,BodyTagSupport继承
2) 写自定义Tag的tld文件
3) web.xml中指定你的tld文件(现在的服务器可以不需要此步骤)
4) 在JSP页面使用自定义标签
Tag属性
Tag.EVAL_BODY_INCLUDE 包含主体内容
Tag.SKIP_BODY 不包含主体内容
Tag.EVAL_PAGE 包含后面的页面内容
Tag.SKIP_PAGE 不包含主体的内容
Tag的生命周期:
3 通过继承TagSupport来实现自定义标签
示例,一个简单的标签:
1)自定义类:
package mytag;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;
public class OutputTag extends TagSupport {
private static final long serialVersionUID = -1696650192224172611L;
@Override
public int doStartTag() throws JspException {
// TODO Auto-generated method stub
JspWriter out = this.pageContext.getOut();
try {
out.println("Hello World!");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return super.doStartTag();
}
}
2)自定义Tag的tld文
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "web-jsptaglibrary_1_2.dtd" >
<taglib>
<tlibversion>1.0</tlibversion> <!-- 你自定义标签的版本数 -->
<jsp-version>1.2</jsp-version> <!-- 指定你的JSP版本,扩张签是在JSP1.2之后兼容的 -->
<shortname>out</shortname> <!-- 标签的简写 -->
<tag>
<name>tags</name> <!-- 标签名字 -->
<tagclass>mytag.OutputTag</tagclass> <!-- 指定你的标签的类 -->
</tag>
</taglib>
其中,标签库元素<taglib>属性:表格如下
<taglib>属性表格</taglib> | |
属性 | 描述 |
tlib-version | 本标签库实现版本 |
jsp-version | 标签库依赖的JSP版本 |
short-name | 被JSP创作工具使用的一个短的默认名词 |
uri | 指定这个标签库的uri信息 |
display-name | 被工具使用的显示用的名字 |
small-icon | 被工具使用的小图标 |
large-icon | 被工具使用的大图标 |
description | 本标签的描述 |
validator | TLD验证信息 |
listener | 实践监听器规范 |
tag标签相关属性:
tag标签相关属性表 | |
属性 | 描述 |
name | tag标签唯一的名称 |
tag-class | tag标签的处理类 |
tei-class | tag标签的TagExtraInfo类 |
body-content | 标签主体的内容 |
display-name | 显示的名称 |
small-icon | 被工具使用的小图标 |
large-icon | 被工具使用的大图标 |
description | 本标签的描述 |
variable | 脚本变量的信息 |
attribute | 标签属性的信息 |
3)web.xml中指定你的tld文件
<jsp-config>
<taglib>
<!--设置自定义标签的uri(不一定存在,但是一定要唯一),为页面的部署做好准备 -->
<taglib-uri>http://test.com/mytag.tld</taglib-uri>
<!--定位你的tld文件的相对路径 -->
<taglib-location>/WEB-INF/mytag.tld</taglib-location>
</taglib>
</jsp-config>
4)在JSP页面中使用
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%-- <%@ taglib uri="/WEB-INF/mytag.tld" prefix="out" %> --%>
<%@ taglib uri="http://test.com/mytag.tld" prefix="out" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<out:tags/>
</body>
</html>
4.通过继承BodyTagSupport来实现自定义标签
BodyTagSupport的生命周期
<!--[endif]-->
BodyTagSupport的处理流程:
1) 当容器创建一个新的标签实例后,通过setPageContext来设置标签的页面上下文.
2) 使用setParent方法设置这个标签的上一级标签,如果没有上一级嵌套,设置为null.
3) 设置标签的属性,这个属性在标签库描述文件中定义,如果没有定义属性,就不调用此类方法.
4) 调用doStartTag方法,这个方法可以返回EVAL_BODY_INCLUDE和SKIP_BODY,当返回EVAL_BODY_INCLUDE时,就计算标签的body,如果返回SKIP_BODY,就不再计算标签的body.
5) 调用setBodyContent设置当前的BodyContent.
6) 调用doInitBody,如果计算BodyContent时需要进行一些初始化,就在这个方法中进行.
7) 每次计算完Body后调用doAfterBody,如果返回EVAL_BODY_AGAIN,表示继续计算一次Body,直到返回SKIP_BODY才继续往下执行.
8) 调用doEndTag方法,这个方法可以返回EVAL_PAGE或者SKIP_PAGE,当返回EVAL_PAGE时,容器将在标签结束时继续计算JSP页面其他的部分;如果返回SKIP_PAGE,容器将在标签结束时停止计算JSP页面其他的部分.
9) 调用release()方法释放标签程序占用的任何资源。
一个简单的示例
1)自定义类:
package mytag;
import javax.servlet.jsp.JspTagException;
import javax.servlet.jsp.tagext.BodyContent;
import javax.servlet.jsp.tagext.BodyTagSupport;
public class PrintBodyTag extends BodyTagSupport {
private int counts;
public PrintBodyTag() {
super();
}
public void setCounts(int counts) {
this.counts = counts;
}
public int doStartTag() throws JspTagException {
System.out.println("doStartTag...");
if (counts > 0) {
return EVAL_BODY_AGAIN;
} else {
return SKIP_BODY;
}
}
public void setBodyContent(BodyContent bodyContent) {
System.out.println("setBodyContent...");
this.bodyContent = bodyContent;
}
public void doInitBody() throws JspTagException {
System.out.println("doInitBody....");
}
public int doAfterBody() throws JspTagException {
System.out.println("do After body..." + counts);
if (counts > 1) {
counts--;
return EVAL_BODY_AGAIN;
} else {
return SKIP_BODY;
}
}
public int doEndTag() throws JspTagException {
System.out.println("do end Tag...");
try {
if (bodyContent != null) {
bodyContent.writeOut(bodyContent.getEnclosingWriter());
}
} catch (java.io.IOException e) {
throw new JspTagException("IO Error: " + e.getMessage());
}
return EVAL_PAGE;
}
}
2)自定义Tag的tld文
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "web-jsptaglibrary_1_2.dtd" >
<taglib>
<tlibversion>1.0</tlibversion> <!-- 你自定义标签的版本数 -->
<jsp-version>1.2</jsp-version> <!-- 指定你的JSP版本,扩张标签是在JSP1.2之后兼容的 -->
<shortname>out</shortname> <!-- 标签的简写 -->
<tag>
<name>tags</name> <!-- 标签名字 -->
<tagclass>mytag.OutputTag</tagclass> <!-- 指定你的标签的类 -->
</tag>
<tag>
<name>bodytags</name> <!-- 标签名字 -->
<tagclass>mytag.PrintBodyTag</tagclass> <!-- 指定你的标签的类 -->
<attribute>
<name>counts</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
3)在JSP页面中使用
<out:bodytags counts="5">HHHHHHHHHHH
<br/>
</out:bodytags>
4)执行效果
JSP页面的效果
HHHHHHHHHHH
HHHHHHHHHHH
HHHHHHHHHHH
HHHHHHHHHHH
HHHHHHHHHHH
<!--[endif]-->
控制打印的效果:
doStartTag...
setBodyContent...
doInitBody....
do After body...5
do After body...4
do After body...3
do After body...2
do After body...1
do end Tag...