JSP如何自定义标签

JSP如何自定义标签

自定义标签步骤:先定义标签处理类(如继承SimpleTagSupport类),再编写TLD文件(标签库描述库文件)。

定义标签类可以编写一个实现SimpleTag接口的类,

public class MyTag1 implements SimpleTag {
   private PageContext context;
   private JspFragment body;
   @Override
   public void doTag() throws JspException, IOException {
      context.getOut().print("这是一个自定义标签");
   }
   @Override
   public JspTag getParent() {
      return null;
   }
   //下面三个方法都在doTag方法之前被tomcat之前调用,所以在doTag方法中就可以使用传递过来的对象
   //设置标签体
   @Override
   public void setJspBody(JspFragment body) {
    this.body =body;
   }
    //设置jsp上下文对象,它子类是PageContext
   @Override
   public void setJspContext(JspContext context) {
      this.context = (PageContext) context;
   }
   //设置父标签
   @Override
   public void setParent(JspTag arg0) {
   }
}

上面代码中的doTag()的方法是每次执行标签都会调用的方法,在这个方法之前有setJspBody()setJspContext()以及setParent()方法都会比doTag先给Tomcat(服务器)调用,所以把传递过来的对象赋值给成员变量后,就可以在doTag方法里面就可以使用传过来的对象了(这里没有用到父标签所以setParent方法体没写代码),其中在doTag方法里面使用PageContext对象获取输出流输出了一句字符串。

编写好标签处理类后,还需要在配置tld文件。

一般tld文件都放在WEB-INF下,这样可以保证客户端访问不到

tld文件代码(其实是一个xml)

<?xml version="1.0" encoding="UTF-8" ?>
<taglib 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-jsptaglibrary_2_1.xsd"
version="2.1">
 
  <tlib-version>1.0</tlib-version><!-- 自定义标签库的版本号 -->
  <short-name>tag</short-name><!-- 自定义标签库的简称 -->
  <uri>http://www.tianye.cn/tag1.0</uri><!-- 自定义标签库的uri -->>
  <tag>
  <name>MyTag1</name><!—指定当前标签名称 -->
  <tag-class>cn.tianye.tag.MyTag1</tag-class><!—指定当前对应标签出处理类 -->
  <body-content>empty</body-content><!-- 标签体内容格式 -->
  </tag>
  </taglib>

上面需要这注意的是<body-content>元素的可选值有

empty:也就是没有标签体(如果在这里设置的是empty,那么在jsp页面上就不能有标签体。)

JSP:传统标签支持它,SimpleTag已经不支持使用<body-content>JSP</body-content>

(标签内容是可以有任何东西,比如EL,JSTL,HTML以及<%%>等)

scriptless:标签体内容不能是java脚本,可以是EL,JSTL,字符串等,在SimpleTag中需要标签体可以使用这选项。

tagdependent:标签体内容不作运算,全由标签处理类自行处理,无论标签体内容是EL,JSTL等,都不会作运算。(这个基本没有人会使用,因为用起来太麻烦,什么都要自己处理)

配置好tld文件后就可以在jsp页面上使用了,在使用自定义标签之前,需要先使用指令导入标签库。

使用taglib导入标签库,uri是tld文件的存放位置

<%@taglib prefix="t" uri="/WEB-INF/tlds/tianye.tag.tld" %>

使用自定义标签

<hr>
   <h1><t:MyTag1/></h1>
<hr>

效果

20190515214342540.png

Image placeholder
前端答疑
未设置
  55人点赞

没有讨论,发表一下自己的看法吧

推荐文章
PHP如何抓取https内容?记录一下。

课程推荐:PHP开发工程师--学习猿地精品课程 PHP里做一般的获取内容时,用自带的file_get_contents()函数基本就足够了。当然,这个函数只能抓一些简单的数据,如果是遇到需要登录的页面

HTML文本标签与格式标签笔记

用画图工具量出坐标,通过左上角的点和右下角的点相连

你知道如何自动保存 Spring Boot 应用进程号吗

1.前言 欢迎阅读SpringBoot2实战系列文章PID对于系统运维来说并不陌生,但是对于一些开发者特别是新手还是要简单介绍一下的。它是ProcessID的简称,是系统分配给一个进程的唯一标识符,

从Spring源码中学习如何查找自定义注解

课程推荐:https://my.oschina.net/u/3773302/blog/4702811 看几个基础的注解 @AliasFor@Retention(RetentionPolicy.RUNT

Spring Boot 中关于自定义异常处理的套路!

在SpringBoot项目中,异常统一处理,可以使用Spring中@ControllerAdvice来统一处理,也可以自己来定义异常处理方案。SpringBoot中,对异常的处理有一些默认的策略,我们

css设置span标签里text-indent不起作用?

css设置span标签里text-indent不起作用?span标签的text-indent不起作用是因为text-indent只能给块级元素设置,而span标签是行内元素。解决方法是设置span标签

HTML与CSS的dic、span和格式化标签

课程推荐:前端开发工程师--学习猿地精品课程 div和spandiv? 是一个块级元素,通常与css配合使用,用于布局。 ?标签可以把文档分割为独立的、不同的部分。它可以用作严格的组织工具,并且不使

Spring-SpringAOP原理,手写Spring事务框架

一、Spring核心知识Spring是一个开源框架,Spring是于2003年兴起的一个轻量级的Java开发框架,由RodJohnson在其著作ExpertOne-On-OneJ2EEDevelopm

css如何清除a标签的block属性

css如何清除a标签的block属性a标签默认是inline行内元素,不支持设置宽高等属性。为了让a标签支持宽高属性,我们可以设置a{display:block}将它变成块级元素同样的,清除a标签的b

GoWeb教程_13.2. 自定义路由器设计

HTTP路由 HTTP路由组件负责将HTTP请求交到对应的函数处理(或者是一个struct的方法),如前面小节所描述的结构图,路由在框架中相当于一个事件处理器,而这个事件包括: 用户请求的路径(pat

GORM 中文文档_5.2. 自定义 Logger

Logger Gorm建立了对Logger的支持,默认模式只会在错误发生的时候打印日志。 //开启Logger,以展示详细的日志 db.LogMode(true) //关闭Logger,不再展示任何

Laravel-自定义全局函数-ChinaCircle 优化版

看过很多关于helper辅助文件的教程我进行个进一步优化 很多教程都会说,你在composer.json这个文件中通过添加一个自动加载的文件,就可以实现这个需求。但我认为这不是一个好的方式,当你在he

使用Go语言在MacOS创建一个自定义的命令行工具

原文链接:https://idoubi.cc/posts/create-a-cli-tool-in-macos/ 使用MacOS做开发的朋友都知道,我们一般会使用Homebrew做软件包管理,经常会用

小知识-SQL 自定义排序

问题场景在一次写业务的过程中,发现在使用sql查询数据的时候,不是按照我希望的顺序进行排序的,而是根据系统顺序进行排序的.o(╥﹏╥)oSELECT*FROMtable_nameWHEREidin(3

自定义组件实现v-model双向数据绑定

我们都清楚v-model其实就是vue的一个语法糖,用于在表单控件或者组件上创建双向绑定。//表单控件上使用v-model {{name}} exportdefault{ data()

自定义列表

自定义列表: 一般用于对术语或者名词的揭示和描述. 格式: ........

javascript自定义类

课程推荐:学习猿地精品在线课--前端开发工程师--点击进入了解 1、创建自定义类 例1:使用原生Java语句定义一个人信息(姓名、年龄、婚否) 以上方法虽然可以定义一个人的相关信息,但是name、ag

Java 异常的处理方式与自定义异常

课程推荐:Java开发工程师--学习猿地精品课程 一、前言Java集合系列已经讲完了,接下来我们来讲异常与多线程。 Java基础语法;面向对象和封装;常用API第一部分;继承与多态;常用API第二部分

RTSP网络摄像头/海康大华硬盘录像机网页无插件直播方案EasyNVR如何实现RTMP/FLV/HLS/RTSP直播流分发

背景需求对于摄像机直播,客户反馈的最多就是实现web直播、摆脱插件,可以自定义集成等问题。我们熟悉的EasyNVR已经完美的解决了这些问题。然而对于web播放也存在一些问题,通常我们web播放RTMP

VIM教程_分屏与标签页

窗口分屏 工作中经常会遇到这种情况,就是需要参照其他文档编辑当前文档(场景:翻译),或者从另外一个文档copy代码到当前文档(场景:复制html元素类名到css文档),这时候就是你最需要分屏的时候。

Git教程_2.6 Git 基础 - 打标签

打标签 像其他版本控制系统(VCS)一样,Git可以给历史中的某一个提交打上标签,以示重要。比较有代表性的是人们会使用这个功能来标记发布结点(v1.0等等)。在本节中,你将会学习如何列出已有的标签、如

html5不常用标签应用场景

divpspanuldlollidtddstrongb现在都已经是9102年了,html5已经相当成熟标准了,为什么在布局的时候不用写html5提供的具有语义化的标签进行布局呢?我个人觉得是因为我们刚

link标签引入css不起作用怎么办?

link标签引入css不起作用怎么办?1、使用link标签引用CSS:2、link无效的问题:●原因多数是css路径写的不正确。路径分为相对路径和绝对路径。如果是相对路径要仔细检查路径是否和文件相对应