自定义标签实例

来源:互联网 发布:云图网络电视 编辑:程序博客网 时间:2024/06/08 02:53

(1) 撰写标签处理类


首先需要明确自定义标签所要实现的功能,然后进行标签处理类的编写。一般如果要实现一个标签处理类需要具备以下特性。

  • 继承TagSupport类或BodyTagSupport类或SimpleTagSupport类。
  • 对自定义标签中声明的属性提供相对应的变量,并提供相应的set方法。
  • doStart()、doAfterBody()、doEndTag()或doTag()方法内编写自定义功能的标签处理类代码,实现自定义标签想要实现的功能。

在这里将以传统标签为例实现输出“Hello World”的效果。具体编写的代码如下:

package com.tjgd.tag;import java.io.IOException;import javax.servlet.jsp.JspWriter;import javax.servlet.jsp.tagext.TagSupport;public class HelloWorld extends TagSupport{    public int doStartTag(){        JspWriter out=super.pageContext.getOut();   //获取页面输出流对象    try {out.println("<h1>Hello World!!</h1>");  //进行页面的输出} catch (IOException e) {e.printStackTrace();}return TagSupport.SKIP_BODY;             //表示不需要执行标签体    }}

HelloWorld类继承了TagSupport这个标签支持类,之后覆写了doStartTag()方法。此方法主要的作用是遇到标签起始标志时调用,之后通过TagSupport类中的pageContext属性取得当前页面的输出对象并进行了输出。由于此时开发的标签没有任何的标签主体,所以在程序的最后返回的是一个SKIP_BOYD的常量,表示不执行标签主体的内容。

(2)创建标签库描述文件

创建TLD文件,源码如下:

<?xml version="1.0" encoding="UTF-8"?><taglib version="2.1" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee web-jsptaglibrary_2_1.xsd">  <tlib-version>1.0</tlib-version><!—表示标签库的版本 --> <jsp-version>2.0</jsp-version><!—表示标签库所依赖的JSP版本 --> <short-name>mytaglib</short-name><!—表示标签库在TLD文件中的描述名称--><tag>    <name>helloworld</name>           <!-- 此标签的名称 -->    <tag-class>       com.tjgd.tag.HelloWorld           <!-- 此标签处理类的完整路径 -->    </tag-class>    <body-content>empty</body-content>   <!-- 指定标签的格式--> </tag></taglib>
可以在web.xml中声明(可选)

<?xml version="1.0" encoding="UTF-8"?><web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  <!—web.xml文件的头信息 <jsp-config>    <taglib><taglib-uri>tjgd</taglib-uri> <!-指定TLD文件的映射名称-><taglib-location>/WEB-INF/helloworldtag.tld</taglib-location>                                               <!--指定TLD文件的路径 --></taglib></jsp-config></web-app>

如上的web.xml文件中的配置是可选的,例如在JSP2.0后就可以不用声明TLD文件的位置,因为Web容器在开始建立<uri>和TLD文件映射时会首先在web.xml中查找,如果web.xml中做了这样的映射配置,则可以使用这些配置来建立映射;如果没有,会在WEB-INF目录以及它的tlds子目录下查找TLD文件,然后自动建立两者之间的映射关系。

(4)JSP页面中使用自定义标签

JSP文件具体代码如下:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>                                          <!—JSP页面的头文件信息<%@ taglib  prefix="mytag" uri="tjgd" %>  <!-- 引入自定义标签 --><html>  <body>    <mytag:helloworld/>                    <!-- 使用自定义标签进行输出 -->   </body></html>

在HelloWorld.jsp页面中,首先通过<%@taglib%>定义了一个标签的前缀名称“mytag”,之后通过这个前缀名称调用了helloworldtag.tld文件中定义的标签的名称“helloworld”。如果没有在web.xml中做相应的配置,则需要在JSP页面中做如下具体的引用:

<%@ taglib  prefix="mytag" uri="/WEB-INF/helloworldtag" %> 

开发完毕后的Web项目结构如所示。



如下总结了JSP自定义标签的一般处理过程。

(1)Web容器根据JSP页面中的标签库标签<mytag:helloworld/>中的mytag找到与之对应的引入标签库中的prefix ,如本例的<%@ taglib  prefix="mytag" uri="tjgd" %> ,并获取uri属性的值为“tjgd”。

(2)Web容器根据uri属性的值找出web.xml配置文件中对应的taglib元素,而后从中获取对应的<taglib-location>元素的值。如本实例定位到了WEB-INF目录下的helloworldtag.tld文件。如果uri属性值为TLD文件路径,那么Web容器会自动搜索TLD文件,并与uri建立起对应关系。

(3)在tld文件中找到与标签库标签<my:helloworld/>中“helloworld”对应的<tag>元素,并利用<tag>元素找到对应的<tag-class>元素。 

(4)Web容器根据<tag-class>元素的值创建相应的标签处理类的实例,然后调用类中的主要方法完成相应的处理,并将最终的值显示到JSP页面上。




























0 0
原创粉丝点击