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、电子书