自定义标签技术自sun公司发布以来,便一向很受欢迎!下面我就来谈一谈如何实现自定义标签,以及如何使用自定义标签。


如何实现自定义标签

首先我们应该知道原理,不管是标签还是JSP,本身实际上都会被JSP Complier翻译成Servlet,然后才会被执行。那么在Java这门面向对象的语言中,标签就应该是一个特殊的类。之所以说它特殊,仅仅是它出现的地方,以及实现的功能与我们平时见到的普通的类有些不一样罢了。我们完全可以将标签视为一个简单的java类。就是这样!下面我们就来看一看要怎么写出这样一个类吧


  • 首先这个类要实现一个特殊的接口,那就是Tag接口,实现里面的方法。
  • 在WEB-INF目录下新建一个tld文件,名称随意,然后按照相关的xml约束进行声明即可
  • 在需要引入的jsp页面添加命令<%@ taglib uri="/summer" prefix="summer"%>,然后我们就可以使用自定义的标签了。

实现的步骤就是这样,下面我们一起来看一个小例子吧,这样印象会更加的深刻!

小案例:检测客户机的IP地址


首先是创建一个实现了Tag接口的实现类:

package web.tag;import java.io.IOException;import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.Tag;public class ViewIPTag implements Tag {PageContext pageContext=null;public ViewIPTag() {// TODO Auto-generated constructor stub}@Overridepublic int doEndTag() throws JspException {// TODO Auto-generated method stubreturn 0;}@Overridepublic int doStartTag() throws JspException {// TODO Auto-generated method stubString ip = pageContext.getRequest().getRemoteAddr();try {pageContext.getOut().write(ip);} catch (IOException e) {// TODO Auto-generated catch blockthrow new RuntimeException(e);}return 0;}@Overridepublic Tag getParent() {// TODO Auto-generated method stubreturn null;}@Overridepublic void release() {// TODO Auto-generated method stub}@Overridepublic void setPageContext(PageContext arg0) {// TODO Auto-generated method stubthis.pageContext = arg0;}@Overridepublic void setParent(Tag arg0) {// TODO Auto-generated method stub}}

再是在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>JSTL 1.1 XML library</description><display-name>JSTL XML</display-name><tlib-version>1.1</tlib-version><short-name>x</short-name><uri>/summer</uri><!-- 返回客户机的IP地址的自定义标签 --><tag><name>viewIP</name><tag-class>web.tag.ViewIPTag</tag-class><body-content>empty</body-content></tag></taglib>

注意:里面的uri是一个命名空间,可以自定义,随意设置,但是在需要引用的jsp页面上需要一致,这样才能获得自定义的标签使用


最后是在页面上引用自定义标签:

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<%@taglib uri="/summer"  prefix="sumer"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>输出客户机的IP地址!</title>
</head>
<body>您的IP地址是:
<sumer:viewIP></sumer:viewIP></body>
</html>

测试结果:



自定义标签之manipulate篇


自定义标签可以实现如下功能:

  • 控制jsp页面某一部分(一般认为是标签体)是否执行(编写一个实现了Tag接口的类,控制doStartTag方法的返回值,Tag.EVAL_BODY_INCLUDE时执行标签体,返回Tag.SKIP_BODY时不执行标签体)
  • 控制整个页面是否执行(编写一个实现Tag接口的类,控制doStartTag方法的返回值,返回Tag.EVAL_PAGE,则执行下面的jsp页面,返回Tag.SKIP_PAGE则不执行后续的jsp页面,如果设置在页面头部,则服务器不会向浏览器发送jsp页面)
  • 控制标签页面标签内容重复执行(编写一个实现IterationTag接口的实现类,控制doAfterBody方法的返回值,返回值为BodyTag.EVAL_BODY_AGAIN时重复执行,一直到该方法的返回值为BodyTag.SKIP_PAGE时停止重复执行)
  • 修改jsp标签内容再输出(需要编写一个实现BodyTag接口的实现类,然后控制doStartTag,控制返回值为BodyTag.EVAL_BODY_BUFFERED时,就可以在doEndTag 方法中获得bodyContent对象的实例,这一切由complier来执行。然后就可以实现自己的逻辑了)。

下面来看一个小例子吧。

实现标签内容大写输出的自定义标签

第一步,编写实现了BodyTag接口的实现类:

package web.tag;import java.io.IOException;import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;
import javax.servlet.jsp.tagext.Tag;/*** 修改标签体内容的自定义标签(转换成大写的形式)* @author Summer**/
public class TagBodyModify extends BodyTagSupport {/*** 设置标签体被执行的返回值,残能实现后续操作* 在返回值为BodyTagSupport.EVAL_BODY_BUFFERED时会通知JSP Complier自动生成一个BodyContent对象* 用于后续的操作所用*/@Overridepublic int doStartTag() throws JspException {// TODO Auto-generated method stubreturn BodyTagSupport.EVAL_BODY_BUFFERED;}/*** 在doStartTag方法中已经获得了一个bodyContent对象,这样我们就可以在doStartTag或者doEndTag方法中* 进行对标签体内容的加工的操作*/@Overridepublic int doEndTag() throws JspException {// TODO Auto-generated method stubString content = bodyContent.getString();String result = content.toUpperCase();try {this.pageContext.getOut().write(result);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}return Tag.EVAL_PAGE;//BodyTagSupport(父类)会默认返回这个方法}}

第二步:在tld文件中进行声明,相关信息:

<!--Manipulate操作标签体内容的的自定义的标签  --><tag><name>TagBodyModify</name><tag-class>web.tag.TagBodyModify</tag-class><body-content>JSP</body-content></tag>

第三步:在jsp页面添加引用。

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<%@taglib uri="/summer" prefix="summer"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>控制标签体内容转换成大写的测试页面</title>
</head>
<body><summer:TagBodyModify>I am Summer !</summer:TagBodyModify></body>
</html>

测试结果:


总结:

  • 官方文档对这些方法的调用过程及使用方法做了详细的介绍,应该对文档熟练阅读并理解
  • 代码逻辑很清晰,按照流程就不容易出错
  • 自定义标签的出现便是为了消除jsp页面中的java代码,应学会其与el表达式的配合!

JSP自定义标签必知必会相关推荐

  1. JSP自定义标签之简单标签入门

    在sun官方文档上有下面这样一段话. 官方文档声明 public interface SimpleTag extends JspTag Interface for defining Simple Ta ...

  2. jsp自定义标签(taglib)编写的原理和实现

    jsp自定义标签(taglib)编写的原理和实现 转:http://www.javaeye.com/topic/157737 个tag就是一个普通的java类,它惟一特别之处是它必须继承TagSupp ...

  3. MySQL必知必会学习历程(一)

    MySQL必知必会学习历程(一) 前言 第1章 了解SQL 1.1 关键术语介绍 1.2 数据表解释实例 第2章 MySQL简介 2.1 关键术语介绍 2.2 安装mysql命令行实用程序(可选) 2 ...

  4. MySQL“必知必会”的知识点

    MySQL"必知必会"的知识点 From 2017-02-16 陈小兵 51CTO博客 MySQL 是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在 ...

  5. 脑残式网络编程入门(三):HTTP协议必知必会的一些知识

    为什么80%的码农都做不了架构师?>>>    本文原作者:"竹千代",原文由"玉刚说"写作平台提供写作赞助,原文版权归"玉刚说&q ...

  6. asp sql ip地址排序_SQL必知必会读书笔记,30分钟入门SQL!

    点击上方SQL数据库开发,关注获取SQL视频教程 SQL专栏 SQL数据库基础知识汇总 SQL数据库高级知识汇总 来源:https://segmentfault.com/p/1210000011760 ...

  7. GitHub#SQL#:SQL必知必会

    https://github.com/CyC2018/Interview-Notebook 一.基础 二.创建表 三.修改表 四.插入 五.更新 六.删除 七.查询 八.排序 九.过滤 十.通配符 十 ...

  8. java面试必知必会

    java面试必知必会 面向对象 成员变量成员方法 Integer相关 double 和 Double相关 多态,向上转型 hashcode.==.equals比较 java中子类继承父类时是否继承构造 ...

  9. JSON必知必会 学习笔记

    JSON必知必会 读书笔记 术语 可移植性 平台和系统间传输信息的兼容性. JSON JavaScript Object Notation 对象表示法.这里主要是对象表示法,是一种数据交换格式,比XM ...

  10. MySQL必知必会 代码+说明 全书整理

    前不久收获一本<mysql必知必会>实体书,这周得空将整本书再次回顾了下. 整理了书中全部的代码,加上了必要的语句说明. 我所使用的软件版本:mysql workbench 8.0.15 ...

最新文章

  1. 英特尔10nm至强CPU发布,对标AMD“米兰”EPYC,然而结果尴尬了
  2. python人脸识别毕业设计-基于Python的人脸识别系统研究.docx
  3. 台式计算机属于,pc机属于什么型计算机
  4. Unity插件Gaia使用介绍
  5. 前端学习(2501):动态绑定样式
  6. 为啥用mencoder执行格式转换不退出_kindle|什么?calibre还能这么用?
  7. python互斥锁原理_Linux 互斥锁的实现原理(pthread_mutex_t)
  8. NAT技术代理服务器
  9. 如何设置CentOS 7开机自动获取IP地址详解
  10. 形式语义学-JLU-ZHH
  11. 解决body设置height:100%无效问题
  12. 转载GIT 学习--活灵活现用Git(二)
  13. 诺基亚N9—刷机教程
  14. 上知天文,下知地理,还能替人写脚本!人工智能的进阶ChatGPT
  15. 瘦,是一种信仰。轻,是一种理想
  16. 图片批量OCR识别--支持各种图片
  17. 《高性能MySQL》(第三版)之一:MySQL架构与基础
  18. 小程序项目-后台交互(首页)
  19. 简易爬取巨潮网年度审计报告
  20. 2021年中国种子安全研究报告【附下载链接】

热门文章

  1. 测试代码执行效率的几种方法比较
  2. ROS轨迹保存为tum格式,并用evo轨迹绘制
  3. 消费升级下中国功能食品市场新增千亿规模,行业亟待洗牌和变革
  4. 洛谷P1784数独 题解
  5. 老笔记本安装ESXI和群晖,不再吃灰
  6. C++(标准库):45---并发之(底层接口thread()、promise、packaged_task)
  7. Fragstats土地利用景观格局分析
  8. scipy.spatial.qhull.QhullError: QH7023 qhull option warning: unknown ‘Q‘ qhull option ‘Qn‘, skip to
  9. python保存图片到指定路径_用 Python 识别图片中的文字
  10. iOS 最新App图标和启动画面尺寸