(一) 没有正文的JSP自定义标签实现
(1):定义JSP自定义标签处理类
- import java.io.IOException;
- import java.util.Date;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.jsp.JspException;
- import javax.servlet.jsp.JspWriter;
- import javax.servlet.jsp.tagext.Tag;
- import javax.servlet.jsp.tagext.TagSupport;
- //无正文标签类继承的是TagSupport类 实现的接口是Tag。 如果有正文的标签类继承的是BodyTagSupport类 实现的接口是BodyTag
- public class DateTagNoBody extends TagSupport {
- @Override
- public int doStartTag() throws JspException {
- HttpServletRequest request;
- // 是TagSupport类中定义的一个属性,它是javax.servlet.jsp.PageContext的对象
- request = (HttpServletRequest) pageContext.getRequest();
- java.text.SimpleDateFormat formater = new java.text.SimpleDateFormat("yyyy-MM-dd");
- String date = formater.format(new Date());
- JspWriter out = pageContext.getOut();
- try {
- out.print(date);
- } catch (IOException e) {
- e.printStackTrace();
- }
- // doStartTag() 方法返回 SKIP_BODY 。当然其原因是我们的简单日期标记没有正文。
- return Tag.SKIP_BODY;
- }
- }
(2) 定义tld文件
- <?xml version="1.0" encoding="UTF-8"?>
- <taglib>
- <tlibversion>1.0</tlibversion>
- <jspversion>1.1</jspversion>
- <tag>
- <name>displayDate</name>
- <tagclass>cn.com.chenlly.tag.DateTagNoBody</tagclass>
- <bodycontent>empty</bodycontent>
- </tag>
- </taglib>
(3) JSP页面动态引用
- <%@ page language="java" pageEncoding="UTF-8"%>
- <%@ taglib uri="/WEB-INF/datetag.tld" prefix="c"%>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- </head>
- <body>
- <c:displayDate/>
- </body>
- </html>
注意:动态引用和静态引用的区别。
为了进行静态引用,首先必须将下面的项加入到web.xml 文件中:
- <?xml version="1.0" encoding="ISO-8859-1" ?>
- <Web-app>
- <taglib>
- <taglib-uri>myTags</taglib-uri>
- <taglib-location>/WEB-INF/lib/DateTagLib.tld</taglib-location>
- </taglib>
- </Web-app>
然后,将JSP 声明加入到所有需要使用自定义标记库的页面中:
- <%@ taglib uri="myTags" prefix="c" %>
指定的uri 属性与在web.xml 文件中指定的taglib-uri 值相匹配。
在进行标记库的静态引用时,JSP 声明必须查询 web.xml 文件以执行库查询。这意味着如果移动或者重命名了库,或者希望在 web.xml 文件中加入更多的库,就必须停止服务器、更新 web.xml 文件、然后重新启动服务器。动态方法让JSP页直接指向 TLD 位置,因而是在解释JSP页面时进行处理。
(二) 没有正文的但带有属性的JSP自定义标签标签实现
(1):定义JSP自定义标签处理类
- import java.io.IOException;
- import java.util.Date;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.jsp.JspException;
- import javax.servlet.jsp.JspWriter;
- import javax.servlet.jsp.tagext.Tag;
- import javax.servlet.jsp.tagext.TagSupport;
- //无正文标签类继承的是TagSupport类 实现的接口是Tag。 如果有正文的标签类继承的是BodyTagSupport类 实现的接口是BodyTag
- public class DateTagNoBody extends TagSupport {
- private String pattern;
- @Override
- public int doStartTag() throws JspException {
- HttpServletRequest request;
- // 是TagSupport类中定义的一个属性,它是javax.servlet.jsp.PageContext的对象
- request = (HttpServletRequest) pageContext.getRequest();
- java.text.SimpleDateFormat formater = new java.text.SimpleDateFormat(pattern);
- String date = formater.format(new Date());
- JspWriter out = pageContext.getOut();
- try {
- out.print(date);
- } catch (IOException e) {
- e.printStackTrace();
- }
- // doStartTag() 方法返回 SKIP_BODY 。当然其原因是我们的简单日期标记没有正文。
- return Tag.SKIP_BODY;
- }
- //必须实现setXX()方法
- public void setPattern(String pattern){
- this.pattern = pattern;
- }
- }
(2) 定义tld文件
- <?xml version="1.0" encoding="UTF-8"?>
- <taglib>
- <tlibversion>1.0</tlibversion>
- <jspversion>1.1</jspversion>
- <tag>
- <name>displayDate</name>
- <tagclass>cn.com.chenlly.tag.DateTagNoBody</tagclass>
- <bodycontent>empty</bodycontent>
- <!-- 定义属性 -->
- <attribute>
- <name>pattern</name> <!-- 属性名字 -->
- <type>String</type> <!-- 属性类型 -->
- <requried>false</requried> <!-- 是否必须 -->
- <rtexprvale>false</rtexprvale> <!-- 表示是否可以使用JSP表达式 -->
- </attribute>
- </tag>
- </taglib>
(3)JSP页面动态引用
- <%@ page language="java" pageEncoding="UTF-8"%>
- <%@ taglib uri="/WEB-INF/datetag.tld" prefix="c"%>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- </head>
- <body>
- <c:displayDate pattern='yyyy-MM-dd'/>
- </br>
- <c:displayDate pattern='MM/dd HH:mm:ss'/>
- </body>
- </html>
(三) 有正文的且带有属性的JSP自定义标签实现
(1):定义JSP自定义标签处理类
- import java.io.IOException;
- import java.util.Date;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.jsp.JspException;
- import javax.servlet.jsp.JspWriter;
- import javax.servlet.jsp.tagext.BodyContent;
- import javax.servlet.jsp.tagext.BodyTagSupport;
- public class BodyTag extends BodyTagSupport {
- private int count;
- private HttpServletRequest reqeust;
- private JspWriter out;
- public void init() {
- reqeust = (HttpServletRequest) pageContext.getRequest();
- out = pageContext.getOut();
- }
- @Override
- public int doStartTag() throws JspException {
- init();
- return this.EVAL_BODY_INCLUDE;
- }
- //设置当前标签体
- @Override
- public void setBodyContent(BodyContent bodyContent) {
- this.bodyContent = bodyContent;
- System.out.println("setBodyContent...");
- }
- //需要初始化bodyContent
- @Override
- public void doInitBody() throws JspException {
- System.out.println("init.....");
- }
- @Override
- public int doAfterBody() throws JspException {
- if (count >= 1) {
- try {
- out.println(count);
- out.println("<Br>");
- } catch (IOException e) {
- e.printStackTrace();
- }
- count --;
- return this.EVAL_BODY_AGAIN;
- } else {
- return this.SKIP_BODY;
- }
- }
- @Override
- public int doEndTag() throws JspException {
- java.text.SimpleDateFormat formater = new java.text.SimpleDateFormat(
- "yyyy-MM-dd");
- String date = formater.format(new Date());
- try {
- out.print(date);
- } catch (IOException e) {
- e.printStackTrace();
- }
- return this.EVAL_PAGE;
- }
- // 必须实现setXX()方法
- public void setCount(int count) {
- this.count = count;
- }
- }
(2) 定义tld文件
- <?xml version="1.0" encoding="UTF-8"?>
- <taglib>
- <tlibversion>1.0</tlibversion>
- <jspversion>1.1</jspversion>
- <tag>
- <name>iterator</name>
- <tagclass>cn.com.chenlly.tag.BodyTag</tagclass>
- <bodycontent>jsp</bodycontent>
- <!-- 定义属性 -->
- <attribute>
- <name>count</name> <!-- 属性名字 -->
- <type>int</type> <!-- 属性类型 -->
- <requried>false</requried> <!-- 是否必须 -->
- <rtexprvale>false</rtexprvale> <!-- 表示是否可以使用JSP表达式 -->
- </attribute>
- </tag>
- </taglib>
(3) jsp 页面动态引用
- <%@ page language="java" pageEncoding="UTF-8"%>
- <%@ taglib uri="/WEB-INF/bodytag.tld" prefix="c"%>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- </head>
- <body>
- <c:iterator count="10">HelloWorld!</c:iterator>
- <%
- out.println("Bye Bye");
- %>
- </body>
- </html>
效果图:
执行顺序
doStartTag()->setBodyContent()->doInitBody()->doAfterTag()->doEndTag()
如果doStartTag()返回的是EVAL_BODY_INCLUDE执行doAfterTag()方法,
如果它返回SKIP_BODY就执行doEndTag()方法。
setBodyContent()方法用于设置标签体内容,如果在计算BodyContent时需要进行一些初始化工作,
则在doInitBody()方法中完成。标签体内容执行完后,会调用doAfterBody()方法
在doAfterTag()方法中返回EVAL_BODY_AGAIN来重复执行doAfterTag()方法
返回SKIP_BODY值则执行doEndTag()方法。
在doEndTag()方法中返回EVAL_PAGE值,则执行此标签的后的其它代码,
返回SKIP_PAGE则不执行此页面的其它代码。
相关推荐
2. **实现标签处理类**:创建一个Java类来实现自定义标签的行为。这个类需要继承`javax.servlet.jsp.tagext.TagSupport`或实现`javax.servlet.jsp.tagext.Tag`接口。在`doStartTag()`和`doEndTag()`方法中编写处理...
使用jsp自定义标签的功能实现权限的控制。(如果用户没有某个模块的删除权限,就不现实这个删除按钮) 在整个项目中所有的页面都可以引入自定义的标签去做到权限的控制。 自定义标签文件 删除 可以控制页面中的每...
首先,`UserListTag.java` 是自定义标签的核心类,它继承了`javax.servlet.jsp.tagext.TagSupport` 或 `javax.servlet.jsp.tagext.SimpleTagSupport` 类,实现了自定义标签的功能。在这个类中,你需要定义处理标签...
2. **实现标签处理类(Tag Handler)**:每个自定义标签对应一个Java类,该类需要实现`javax.servlet.jsp.tagext.Tag`或其子接口,如`SimpleTag`。在这个类中,我们可以编写处理标签逻辑的代码。 3. **在JSP页面中...
自定义标签是JSP的一种扩展,它允许开发者定义自己的标签库,实现特定的功能,这些标签可以在多个JSP页面中重复使用,提高代码复用率。 2.2 标签相关概念 自定义标签通常由三部分组成:标签处理类、TLD(Tag ...
jsp自定义标签jsp自定义标签jsp自定义标签jsp自定义标签
2. **实现标签处理类** 标签处理类是Java类,它实现了`javax.servlet.jsp.tagext.Tag`或`javax.servlet.jsp.tagext.SimpleTag`接口。当JSP页面解析到自定义标签时,会调用这些类中的方法来执行相应的逻辑。 3. **...
在这个场景中,"使用JSP自定义标签实现EMP分页"是一个具体的应用实例,旨在提升代码的可读性和可维护性,对比传统的Servlet方法,自定义标签能让分页处理更加简洁。 首先,我们要了解JSP自定义标签的基本结构和工作...
本文将深入讲解JSP自定义标签的相关概念、格式、处理过程以及创建和使用自定义标签库的基本步骤。 1. 基本概念: - **标签**:JSP标签是XML元素,用于简化JSP页面,使其更易读且支持多语言版本。标签名和属性区分...
总的来说,理解和解决`Java.lang.NoClassDefFoundError: JspException`异常需要对JSP自定义标签的工作原理、项目结构以及打包过程有深入的了解。遵循正确的项目配置和打包步骤,能够有效地避免这类问题,保证自定义...
本篇文章将深入探讨如何在JSP中实现自定义标签,特别是创建一个自动完成框的功能。这个功能常见于许多网站的搜索栏,能根据用户输入的内容提供实时的建议。 首先,我们要理解JSP自定义标签的概念。自定义标签是JSP...
在JavaServer Pages (JSP) 技术中,自定义标签是实现页面逻辑和视图分离的一种重要方式,它允许开发者创建可重用的组件,提高代码的可维护性和复用性。本教程将深入探讨JSP自定义标签的实例与详细讲解。 一、JSP...
它可能涵盖了从创建TLD文件,编写标签处理类,到在JSP页面上实际使用自定义标签的全过程。同时,这个文档可能会提供一些实际的例子,帮助读者理解自定义标签的工作原理。 而"test1.tld"文件则是对一个自定义标签库...
自定义标签是JSP的一种扩展,它不是Java内置的标签,而是由开发者自己定义并实现的。它们通常由三部分组成:标签库描述符(TLD)、标签处理类(Tag Handler)和标签库文档(Tag Library Documentation)。TLD是XML...
编写自定义标签时,我们需要创建一个Java类,继承自`javax.servlet.jsp.tagext.TagSupport`或`javax.servlet.jsp.tagext.SimpleTagSupport`,并实现必要的方法。例如,`doStartTag()`可以用来初始化分页所需的数据,...
在JavaServer Pages (JSP) 开发中,为了提高代码的可维护性和重用性,开发者经常使用自定义标签库。本主题将深入探讨“jsp自定义分页标签”,这是一种在网页展示大量数据时非常实用的功能,它可以有效地帮助用户浏览...
jsp、jstl自定义标签实现的分页,实现的还是比较好的,没有在request、session等范围保存过数据,在pageContext范围内保存过集合的数据, 实现的方法还是比较简单的,适用性还是比较广的,我是实在是没分了,平时也...
在JavaServer Pages (JSP) 技术中,自定义标签是实现页面逻辑和视图分离的一种重要方式,它允许开发者创建可重用的、封装的组件,提高代码的可维护性和可读性。本资源“jsp自定义标签大全.rar”提供了一套全面的JSP...
【jsp自定义标签库注意事项】 在Java服务器页面(JSP)开发中,自定义标签库是一种强大的工具,它能够帮助开发者创建可重用的代码片段,提高代码的可读性和可维护性。以下是对JSP自定义标签库的详细解释和使用注意...
学习自定义标签的过程中,会涉及到如何创建处理程序类、编写TLD文件、在JSP页面中使用自定义标签等多个步骤。通过实际项目练习,可以更好地掌握这些技能。 9. **与其他技术的结合** 自定义标签可以与Servlet、...