JSP自定义标签开发(一)—— HelloWorld 采用Tag接口实现开发

来源:互联网 发布:淘宝天猫后台操作流程 编辑:程序博客网 时间:2024/05/21 00:49

传统的标签必须实现javax.servlet.jsp.tagext.Tag接口,在Tag接口中,主要定义的是和标签生命周期相关的方法,比如:doStartTag(),doEndTag()等。在Tag中,可以通过PageContext对象来访问JSP页面的上下文。结合标签的生命周期标签的处理过程:

1当容器创建一个新的标签实例后,通过setPageContext()来设置标签的页面上下文。

2使用setParent方法设置这个标签的上一级标签,如果没有上一级嵌套,设置为null。

3设置标签的属性,这个属性在标签库描述文件中定义,如果没有定义属性,就不用调用此类方法。

4调用doStartTag方法,这个方法可以返回EVAL_BODY_INCLUDE和SKIP_BODY,当返回EVAL_BODY_INCLUDE时,就计算标签的Body,如果返回SKIP_BODY,就不计算标签的Body。

5调用doEndTag方法,这个方法可以返回EVAL_PAGE或者SKIP_PAGE,当返回EVAL_PAGE时,容器将在标签结束时继续计算JSP页面其他的部分;如果返回SKIP_PAGE,容器将在标签结束时停止计算JSP页面其他的部分。

6调用release方法释放标签程序占用的任何资源。

开发标签时可以有两种选择:一种是实现原始的Tag接口,另一种是从TagSupport类继承。

一)实现Tag接口

按照下面的步骤进行:

 1)开发标签实现类

 2)编写标签描述文件,tld为扩展名。

 3)在Web.xml中映射标签库的使用。

 4)在JSP网页中调用标签。

1开发实现类(HelloTag_Interface.java

package com.wsy.tag;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspTagException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.Tag;

public class HelloTag_Interface implements Tag {
private PageContext pageContext;
private Tag parent;

public HelloTag_Interface() {
super();
}

/*
* (non-Javadoc) 结束标签的操作

* @see javax.servlet.jsp.tagext.Tag#doEndTag()
*/
@Override
public int doEndTag() throws JspException {
try {
pageContext.getOut().write("Hello world! 你好,世界!");
} catch (IOException e) {
throw new JspTagException("IO Error" + e.getMessage());
}
return EVAL_PAGE;
}

/*
* (non-Javadoc) 开始标签的操作

* @see javax.servlet.jsp.tagext.Tag#doStartTag()
*/
@Override
public int doStartTag() throws JspException {
return SKIP_BODY;// 不计算标签体
}


@Override
public Tag getParent() {
return parent;
}

/*
* (non-Javadoc) 释放标签体程序所占用的空间,比如使用了数据库,那么应该关闭这个连接

* @see javax.servlet.jsp.tagext.Tag#release()
*/
@Override
public void release() {
}

/*
* (non-Javadoc) 设置标签页面上下文

* @see
* javax.servlet.jsp.tagext.Tag#setPageContext(javax.servlet.jsp.PageContext
* )
*/
@Override
public void setPageContext(PageContext pageContext) {
this.pageContext = pageContext;
}

/*
* (non-Javadoc) 设置上一级标签

* @see javax.servlet.jsp.tagext.Tag#setParent(javax.servlet.jsp.tagext.Tag)
*/
@Override
public void setParent(Tag parent) {
this.parent = parent;
}
}


2编写标签库描述(mytag.tld文件;路径:/WEB-INF/tlds/mytag.tld

<?xml version="1.0" encoding="gb2312" ?>
<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" version="2.0">
<tlib-version>2.0</tlib-version>
<short-name>examples</short-name>
<uri>/demotag</uri>
<tag>
<name>hello_int</name>
<tag-class>com.wsy.tag.HelloTag_Interface</tag-class>
<body-content>empty</body-content>
</tag>
</taglib>


3 在Web.xml中映射标签库的使用。

<web-app>
...

<taglib>
<taglib-uri>/demotag</taglib-uri>
<taglib-location>/WEB-INF/tlds/mytag.tld</taglib-location>
</taglib>

...
</web-app>


4 在JSP网页中调用标签

<%@ taglib uri="/demotag" prefix="hello" %>
<%@ page contentType="text/html; charset=gb2312" language="java" %>
<html>
<head>

<title>first cumstomed tag</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>

<body>
<p>以下的内容从Taglib中显示:</p>
<p><i><hello:hello_int/></i></p>
</body>
</html>

 运行结果如下图所示。



0 0