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...
- 大小: 25 KB
- 大小: 28.8 KB
分享到:
相关推荐
JSP自定义标签JSP自定义标签JSP自定义标签JSP自定义标签JSP自定义标签JSP自定义标签
jsp、jstl自定义标签实现的分页,实现的还是比较好的,没有在request、session等范围保存过数据,在pageContext范围内保存过集合的数据, 实现的方法还是比较简单的,适用性还是比较广的,我是实在是没分了,平时也...
jsp自定义标签jsp自定义标签jsp自定义标签
JSP自定义标签-源码.rar
JSP应用开发-自定义标签的使用.pptx
jsp自定义标签jsp自定义标签jsp自定义标签jsp自定义标签
本人自行研究JSP自定义标签的学习笔记 目录如下: 目录 一、概述 1 1.1 使用简单标签机制 2 1.2 使用标签文件 3 二 、自定义标签简介 3 2.1 自定义标签概念 3 2.2 标签相关概念 3 2.3 如何创建自定义标签 3 三、自...
jsp案例---端午节jsp案例---端午节jsp案例---端午节jsp案例---端午节jsp案例---端午节jsp案例---端午节
jsp-api-2.2-sources.jar
jsp 自定义标签 一个简单的自定义标签实现
jsp自定义迭代标签 jsp自定义迭代标签
javax.servlet.jsp-api-2.3.1.jar
javax.servlet.jsp-api-2.3.2的jar包
import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.TagSupport; 所导致的无包报错解决jar包 注意导入jar包时应注意Servlet的版本,如果是Servlet 2.4 对应的应该是JSP 2.0 的jar包,如果是...
jsp-api-2.1.jar jspAPI文档欢迎下载
想要在 JavaServer Pages (JSP) 应用程序中添加自定义标签吗?本教程将为您展示如何用这些标签编写类似于 JSP 技术自带操作 —— 如 jsp:useBean、jsp:getProperty 和 jsp:forward —— 的自定义操作。介绍如何用...