JavaWeb(十三)简单标签

1、使用简单标签

(1)建一个index.jsp模拟Servlet中的操作

(2)testtag.jsp

(3)启动tomcat,访问index.jsp

(4)加入jstl的核心jar包和标准包到lib中

(5)加入标签库

(6)效果跟前面的一样

2、自定义标签

2.1、含义

用户定义的一种自定义的jsp标记 。当一个含有自定义标签的jsp页面被jsp引擎编译成servlet时,tag标签被转化成了对一个称为 标签处理类 的对象的操作。于是,当jsp页面被jsp引擎转化为servlet后,实际上tag标签被转化为了对tag处理类的操作。

2.2、标签库 API

2.3、传统标签和简单标签

开发自定义标签,其核心就是要编写处理器类,一个标签对应一个标签处理器类,而一个标签库则是很多标签处理器的集合。所有的标签处理器类都要实现 JspTag 接口,该接口中没有定义任何方法,主要作为 Tag 和 SimpleTag 接口的父接口。

在 JSP 2.0 以前,所有标签处理器类都必须实现 Tag 接口,这样的标签称为传统标签。

JSP 2.0 规范又定义了一种新的类型的标签,称为简单标签,其对应的处理器类要实现 SimpleTag 接口

2.4、标签的形式

(1)空标签:<hello/>

(2)带有属性的空标签:<max num1=“3” num2=“5”/>

(3)带有内容的标签:<greeting> hello</greeting>

(4)带有内容和属性的标签:<greeting name=“Tom”>hello</greeting>

2.5、自定义标签的开发与应用步骤

一:编写完成标签功能的 Java 类(标签处理器)

二:编写标签库描述(tld)文件,在tld文件中对自定义中进行描述

三:在 JSP 页面中导入和使用自定义标签

示例

(1)点击进去

(2)c.dtl

(3)创建一个标签处理器类:实现 SimpleTag 接口

(4) 在 WEB-INF 文件夹下新建一个mytag .tld(标签库描述文件) 为扩展名的 xml 文件. 并拷入固定的部分: 并对description, display-name, tlib-version, short-name, uri 做出修改,在 tld 文件中描述自定义的标签。

(5)在 JSP 页面上使用自定义标签

(6)setJspContext:一定会被 JSP 引擎所调用,先于 doTag, 把代表 JSP 引擎的 pageContext 传给标签处理器类。

private PageContext pageContext;

@Override

public void setJspContext(JspContext jspContext) {

pageContext = (PageContext) jspContext;

}

3、SimpleTag 接口

setJspContext 方法:该方法把代表 JSP 页面的 pageContext 对象传递给标签处理器对象。

setParent 方法:该方法把父标签处理器对象传递给当前标签处理器对象

getParent 方法:该方法用于获得标签的父标签处理器对象

setJspBody 方法:该方法用于把代表标签体的 JspFragment 对象传递给标签处理器对象

doTag 方法:该方法用于完成所有的标签逻辑。该方法可以抛出 javax.servlet.jsp.SkipPageException 异常,用于通知 web 容器不再执行 JSP 页面中位于结束标记后面的内容。

4、在 JSP 页面引用自定义标签

在 JSP 页面使用 taglib 指令引入标签库描述文件: <%@ taglib prefix=“” uri=“” %>。

uri属性用于指定所引入的标签库描述(tld)文件中所定义的 元素的内容;

prefix属性用于为引入的 tld 文件指定一个”引用代号”。prefix属性可以由 jsp 文件的作者任意指定,只要与其他 taglib 指令的 prefix 属性值不同就可以。

5、带属性的自定义标签

(1)先在标签处理器类中定义 setter 方法;建议把所有的属性类型都设置为 String 类型。

(2)在 tld 描述文件中来描述属性,其中rtexprvalue是runtime expression value。

(3)在页面中使用属性,属性名同 tld 文件中定义的名字。

(4)在MaxTag类中

(5)结果

6、SimpleTagSupport

(1)为简化简单标签处理器的编写工作,JSP API 中提供了SimpleTag接口的一个实现类SimpleTagSupport。SimpleTagSupport实现了SimpleTag接口中的方法,它内部以成员变量的形式保存了setJspContext方法和setJspBody方法传递进来的参数。此外,它还定义了如下两个方法、来返回这两个参数:

getJspContext方法:该方法用于返回代表调用页面的JspContext对象;

getJspBody方法:该方法用于得到代表标签体的JspFragment对象。

(2)把MaxTag修改成如下,结果一样

(3)通常情况下开发简单标签直接继承 SimpleTagSupport 就可以了. 可以直接调用其对应的 getter 方法得到对应的 API。

7、实现 SimpleTag 接口的标签处理器类的生命周期

(1)setJspContext:Jsp引擎将代表JSP页面的pageContext对象传递给标签处理器对象;

(2)setParent:.Jsp引擎将父标签处理器对象传递给当前标签处理器对象。只有存在父标签时,jsp引擎才会调用该方法;

(3)setXXX:设置标签属性,只有定义属性才调用该方法;

(4)setJspBody:若存在标签体, JSP 引擎将把标签体封装成一个 JspFragment对象,调用 setJspBody 方法将 JspFragment 对象传递给标签处理器对象。若标签体为空,这 setJspBody 将不会被JSP 引擎调用。

8、JspFragment 类

(1)该类的实例对象代表 JSP 页面中的一段符合 JSP 语法规范的 JSP 片段,这段 JSP 片段不能包含 JSP 脚本元素(<% … %>)

(2)JSP 引擎在处理简单标签的标签体时,会把标签体内容用一个 JspFragment 对象表示,并调用标签处理器对象的 setJspBody 方法把 JspFragment 对象传递给标签处理器对象。得到代表标签体的 JspFragment 对象后,标签开发者和就可以在标签处理器中根据需要调用 JspFragment 对象的方法,进而决定如何处理标签体。

(3)getJspContext 方法:该方法用于返回代表调用页面的 JspContext 对象

(4)Invoke 方法(java.io.Writer out):该方法用于执行 JspFragment 对象所代表的 JSP 代码片段。在 doTag() 方法中可以根据需要调用该方法。

①、该方法的参数 out 用于指定将 JspFragment 对象的执行结果写入到哪个输出流对象中。若传递参数 out 的值为 null,则将执行结果写入到 JspContext.geOut() 方法返回的输出流对象中;

②、若想在标签处理器中修改标签体内容:需在调用 invoke 方法时指定一个可取出结果数据的输出流对象(如:StringWriter),让标签体的执行结果输出到该输出流中,然后从该输出流对象中取出数据进行修改后在输出到目标设备。

9、标签库描述文件

(1)标签库描述(Tag Library Description)文件简称为 tld 文件,其扩展名为 .tld

(2)多个标签的集合就形成了一个标签库,标签库中的所有标签都必须在标签文件中进行描述

(3)Tld 文件可以放置在 web 应用程序的 WEB-INF 目录及其子目录中,但不能放置在 WEB-INF 目录下的 classes 和 lib 子目录中 。tld 文件也可以放置在 WEB-INF\lib 目录下的 jar 包的 META-INF 目录及其子目录中

(4)指定标签体的类型,可能取值有 3 种:

empty:没有标签体

scriptless:标签体可以包含 el 表达式和 JSP 动作元素,但不能包含 JSP 的脚本元素

tagdependent:表示标签体交由标签本身去解析处理。若指定 tagdependent,在标签体中的所有代码都会原封不动的交给标签处理器,而不是将执行结果传递给标签处理器

10、示例:带标签体的自定义标签

(1)ForEachTag

(2)myTag.tld

(3)Customer

(4)test.jsp

(5)输出结果

备注:

JspFragment 的 invoke(Writer) 方法: 把标签体内容从 Writer 中输出, 若为 null,则等同于 invoke(getJspContext().getOut()), 即直接把标签体内容输出到页面上,有时, 可以借助于 StringWriter, 可以在标签处理器类中先得到标签体的内容:利用 StringWriter 得到标签体的内容:①StringWriter sw = new StringWriter();②bodyContent.invoke(sw);

11、开发有父标签的标签

1). 父标签无法获取子标签的引用, 父标签仅把子标签作为标签体来使用.

2). 子标签可以通过 getParent() 方法来获取父标签的引用(需继承 SimpleTagSupport 或自实现 SimpleTag 接口的该方法):若子标签的确有父标签, JSP 引擎会把代表父标签的引用通过 setParent(JspTag parent) 赋给标签处理器

3). 注意: 父标签的类型是 JspTag 类型. 该接口是一个空接口, 但是来统一 SimpleTag 和 Tag 的. 实际使用需要进行类型的强制转换.

4). 在 tld 配置文件中, 无需为父标签有额外的配置. 但, 子标签是是以标签体的形式存在的, 所以父标签的需设置为 scriptless

5). 实现

①ChooseTag

②WhenTag

③OtherwiseTag

④tld文件

⑤jsp

⑥重启tomcat,访问这个jsp

12、EL函数

13、EL自定义函数

(1)EL 自定义函数:在 EL 表达式中调用的某个 Java 类的静态方法,这个静态方法需在 web 应用程序中进行配置才可以被 EL 表达式调用。

(2)EL 自定义函数可以扩展 EL 表达式的功能,让 EL 表达式完成普通 Java 程序代码所能完成的功能。

14、EL自定义函数开发步骤

(1)编写 EL 自定义函数映射的Java 类中的静态方法:这个 Java 类必须带有 public 修饰符,方法必须是这个类的带有 public 修饰符的静态方法

(2)编写标签库描述文件(tld 文件), 在 tld 文件中描述自定义函数

(3)在 JSP 页面中导入和使用自定义函数

原文发布于微信公众号 - Java后端生活(javaNotebook)

原文发表时间:2018-06-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏python爬虫实战之路

python操作Excel,你觉得哪个库更好呢?

每一个Excel数据文件从上至下分为三个层级的对象: workbook: 每一个Excel文件就是一个workbook。 sheet: 每一个workbook中...

7.1K30
来自专栏LIN_ZONE

jsp模板继承

20430
来自专栏一“技”之长

Java开发GUI之列表 原

    awt包中的List控件可以创建一个选择列表,此列表可以支持单选,也可以支持多选。

35420
来自专栏吴裕超

认识createDocumentFragment

今天在看vue源码解析时候发现一个api没有见过,一查是原生的,赶紧补漏。 DocumentFragments 是DOM节点。它们不是主DOM树的一部分。通常的...

27570
来自专栏河湾欢儿的专栏

Vue.js基础特性

计算属性 computed 与data,el,methods属性一样,都是vm实例的属性(选项) 理解其大致意思即可

15410
来自专栏PHP在线

jQuery学习笔记

jQuery大部分功能需要根据文档的DOM模型来工作,首先需要正确地解析到整个文档的DOM模型结构。使用jQuery需要在整个文档被浏览器完全加载后才开始进行。

11520
来自专栏别先生

jQuery/javascript实现网页注册的表单验证

1 <html> 2 <head> 3 <meta charset="utf-8"> 4 <title>注册表单验证</title> 5 <...

27560
来自专栏進无尽的文章

编码篇-OC跨多层UI事件传递处理

在 iOS 中,对象间的交互模式大概有这几种:直接 property 传值、delegate、KVO、block、protocol、多态、Target-Acti...

18130
来自专栏web前端-

rem和em小插曲

1.对em来说,它的大小是相对于父层font-size来改变,但是如果其自身有font-size属性的话,em会优先考虑自身的font-size;

9820
来自专栏Google Dart

AngularDart4.0 指南- 模板语法二 顶

Class绑定语法类似于属性(property)绑定。 以前缀类开始,可选地跟一个点(.)和一个CSS类的名字替代括号内的元素属性:[class.class-n...

12920

扫码关注云+社区

领取腾讯云代金券