自定义标签开发
来源:互联网 发布:心动网络 面试时间 编辑:程序博客网 时间:2024/04/29 06:08
一、概述
JSP中的标签库技术可以让我们定制自己的标签,自定义标签实际上是一个实现了特定接口的Java类,封装了一些常用的功能,运行时标签被相应的代码所代替。本文将对自定义标签的开发进行简单的介绍和总结。
二、标签库
开发自定义标签库,核心就是要编写标签处理器类,所有的标签处理器类都要实现JspTag接口。标签又分传统标签和简单标签。下图为标签库中主要的接口及类的继承实现关系。
使用标签大致可以实现以下四种基本功能:
- 控制页面内容(标签体)是否输出
- 用标签控制整个jsp是否输出
- 控制标签体重复执行
- 用标签修改jsp页面内容
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><%@ taglib uri="/com.cn" prefix="com"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head> <title>在此处插入标题</title> </head> <body> <com:demo2> <!--此处为自定义标签 --> aaaa </com:demo2> </body></html>
下面分别针对这两种标签实现上述功能的方法进行介绍:
传统标签:
- 控制页面内容(标签体)是否输出
首先jsp代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><%@ taglib uri="/com.cn" prefix="com"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head> <title>在此处插入标题</title> </head> <body> <com:demo2> <!--此处为自定义标签 --> aaaa </com:demo2> </body></html>
想要控制标签体内的内容(aaaa)是否输出,则要编写相应的标签处理类:
public class Demo2 extends TagSupport{ public int doStartTag() throws JspException { /* 返回EVAL_BODY_INCLUDE,表示标签体要被执行 返回SKIP_BODY,表示忽略标签体 */ return EVAL_BODY_INCLUDE ; }}
- 用标签控制整个jsp是否输出
对应的jsp代码为:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><%@ taglib uri="/com.cn" prefix="com"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><com:demo3/> <!-- 自定义标签,标签体为空 --><html> <head> <title>在此处插入标题</title> </head> <body> aaaa </body></html>
要控制整个jsp页面是否输出,对应的标签处理器类如下:
public class Demo3 extends BodyTagSupport{ public int doEndTag() throws JspException { /* 返回值为EVAL_PAGE,表示JSP页面的余下部分将继续执行 返回值为SKIP_PAGE,表示忽略JSP页面的余下部分 */ return SKIP_PAGE; }}
- 控制标签体重复执行
这个标签处理器类要实现IterationTag接口,它增加一个方法和一个用作返回值得常量,用于控制对标签体的重复处理。
对应的标签处理器类代码如下:
public class Demo4 extends TagSupport{ private int i; @Override public int doStartTag() throws JspException { i=0; return EVAL_BODY_INCLUDE; } public int doAfterBody() throws JspException { i++; if(i<5) return EVAL_BODY_AGAIN; //请求重复执行标签体 else return SKIP_BODY; //不在执行标签体 }}
上述处理器类将控制执行标签体内容5遍。
- 用标签修改JSP页面内容(将标签体修改为大写输出)
此标签处理器类要实现BodyTag接口,它增加一个方法和一个用作返回值得常量,用于控制对标签体的重复处理。
public class Demo5 extends BodyTagSupport{ public int doEndTag() throws JspException { BodyContent bc=this.getBodyContent(); String content=bc.getString(); content=content.toUpperCase(); try { this.pageContext.getOut().write(content); } catch (IOException e) { throw new RuntimeException(e); } return EVAL_PAGE; }}
简单标签:
简单标签要实现的接口是SimpleTag,其标签处理器类的生命周期为:
PS:简单标签的标签处理实例不会被缓存而重复使用,每当遇到标签时,容器就会创建一个新的标签处理器实例。
为了实现前面提到的四个功能,见下面的示例代码:
public class Demo1 extends SimpleTagSupport { @Override public void doTag() throws JspException, IOException { JspFragment jf=this.getJspBody(); StringWriter sw=new StringWriter(); jf.invoke(sw); String content = sw.toString(); content=content.toUpperCase(); this.getJspContext().getOut().write(content); }}
三、标签库描述符
编写好标签处理器类后,还需要在标签库描述文件中配置标签的相关信息。标签库描述符是一个XML文档,包含标签名字‘标签处理器类和标签的属性信息。其文件扩展名为tld,文件存放位置为META-INf目录下。
一个tld文件的示例代码如下:
<?xml version="1.0" encoding="UTF-8" ?><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 http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0"> <description>A tag library exercising SimpleTag handlers.</description> <tlib-version>1.0</tlib-version> <short-name>test</short-name> <uri>/test.cn</uri> <tag> <name>demo1</name> <tag-class>com.test.simple.tag.Demo1</tag-class> <body-content>scriptless</body-content> </tag> <tag> <name>demo2</name> <tag-class>com.test.simple.tag.Demo2</tag-class> <body-content>scriptless</body-content> <attribute> <name>name</name> <required>true</required> </attribute> </tag> </taglib>
- 自定义标签开发
- struts自定义标签开发
- jsp自定义标签开发
- JSP自定义标签开发
- 自定义标签开发总结
- 自定义标签库开发
- 自定义标签库开发
- 自定义标签库开发
- 自定义标签库开发
- 自定义标签开发步骤:
- Dedecms 自定义标签开发
- 自定义标签开发入门
- 自定义标签库开发
- 自定义标签库开发
- 【jsp】开发自定义标签
- JSP自定义标签开发
- JSP自定义标签开发
- JSP自定义标签开发
- meanshift算法
- 静态代码块的执行顺序(类中含有本类对象)
- C语言文件路径问题(一)
- [leetcode] Valid Palindrome
- 花生壳域名ping不通怎么办
- 自定义标签开发
- [转载]深入理解java异常处理机制
- Mac 安装GCC(不使用Xcode)MacPort
- LeetCode_Convert Sorted Array to Binary Search Tree
- OCulus Rift 游戏开发六原则
- 极致简单的二维码条形码扫描工具
- java学习之旅47--模拟Servlet的service和doGet方法
- Codeforces 555B Case of Fugitive 搭桥
- UITextView 文字上留有一大片空白