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视频教程

欢迎关注作者微信公众号【Java后端生活】,公众号回复“Java”关键词就可以获取所有相关视频教程:java、html 、css、javascript、jQuery、ajax、bootstrap、linux、mysql、oracle、jdbc、JavaWeb、struts2、hibernate、spring、ssh、svn、springmvc、springData、redis、maven、shiro、mybatis、springboot、springcloud、git、jenkins、电子书


猜你喜欢

转载自blog.csdn.net/leeqico/article/details/80683314