javaweb学习6——自定义标签
声明:本文只是自学过程中,记录自己不会的知识点的摘要,如果想详细学习JavaWeb,请到孤傲苍狼博客学习,JavaWeb学习点此跳转
本文链接:https://www.cnblogs.com/xdp-gacl/p/3916946.html
https://www.cnblogs.com/xdp-gacl/p/3916968.html
https://www.cnblogs.com/xdp-gacl/p/3917714.html
传统标签接口中的各个方法可以返回的返回值说明:
下图列举了Tag接口、IterationTag接口和BodyTag接口中的主要方法及它们分别可以返回的返回值的说明。
在JSP API中也提供了IterationTag接口的默认实现类TagSupport、IterationTag接口的默认实现类TagSupport和BodyTag接口的实现类BodyTagSupport,我们在编写自定义标签的标签处理器类时,可以继承和扩展TagSupport类、IterationSupport类和BodyTagSupport类。
开发简单标签实现页面逻辑
1.控制jsp页面某一部分内容是否执行
编写一个类继承SimpleTagSupport,然后再重写doTag方法,在doTag方法里面是否调用jspFrament.invoke方法来控制标签是否执行。
- package me.gacl.web.simpletag;
- import java.io.IOException;
- import javax.servlet.jsp.JspException;
- import javax.servlet.jsp.PageContext;
- import javax.servlet.jsp.tagext.JspFragment;
- import javax.servlet.jsp.tagext.SimpleTagSupport;
- /**
- * @author gacl
- * SimpleTagSupport类实现了SimpleTag接口,
- * SampleTagDemo1类继承SimpleTagSupport
- */
- public class SimpleTagDemo1 extends SimpleTagSupport {
- /* 简单标签使用这个方法就可以完成所有的业务逻辑
- * @see javax.servlet.jsp.tagext.SimpleTagSupport#doTag()
- * 重写doTag方法,控制标签体是否执行
- */
- @Override
- public void doTag() throws JspException, IOException {
- //得到代表jsp标签体的JspFragment
- JspFragment jspFragment = this.getJspBody();
- //得到jsp页面的的PageContext对象
- //PageContext pageContext = (PageContext) jspFragment.getJspContext();
- //调用JspWriter将标签体的内容输出到浏览器
- //jspFragment.invoke(pageContext.getOut());
- //将标签体的内容输出到浏览器
- jspFragment.invoke(null);
- }
- }
2.控制jsp页面内容重复执行
编写一个类继承SimpleTagSupport,然后再重写doTag方法,在doTag方法里面重复调用jspFrament.invoke方法即可。
- package me.gacl.web.simpletag;
- import java.io.IOException;
- import javax.servlet.jsp.JspException;
- import javax.servlet.jsp.tagext.JspFragment;
- import javax.servlet.jsp.tagext.SimpleTagSupport;
- /**
- * @author gacl
- * SimpleTagSupport类实现了SimpleTag接口,
- * SampleTagDemo2类继承SimpleTagSupport
- */
- public class SimpleTagDemo2 extends SimpleTagSupport {
- /* 简单标签使用这个方法就可以完成所有的业务逻辑
- * @see javax.servlet.jsp.tagext.SimpleTagSupport#doTag()
- * 重写doTag方法,控制标签执行5次
- */
- @Override
- public void doTag() throws JspException, IOException {
- // 得到代表jsp标签体的JspFragment
- JspFragment jspFragment = this.getJspBody();
- for (int i = 0; i < 5; i++) {
- // 将标签体的内容输出到浏览器
- jspFragment.invoke(null);
- }
- }
- }
3.修改jsp页面内容输出
编写一个类继承SimpleTagSupport,然后再重写doTag方法,在doTag方法调用jspFrament.invoke方法时,让执行结果写一个自定义的缓冲中即可,然后开发人员可以取出缓冲的数据修改输出。
- package me.gacl.web.simpletag;
- import java.io.IOException;
- import java.io.StringWriter;
- import javax.servlet.jsp.JspException;
- import javax.servlet.jsp.PageContext;
- import javax.servlet.jsp.tagext.JspFragment;
- import javax.servlet.jsp.tagext.SimpleTagSupport;
- /**
- * @author gacl
- * SimpleTagSupport类实现了SimpleTag接口,
- * SampleTagDemo3类继承SimpleTagSupport
- */
- public class SimpleTagDemo3 extends SimpleTagSupport {
- /* 简单标签使用这个方法就可以完成所有的业务逻辑
- * @see javax.servlet.jsp.tagext.SimpleTagSupport#doTag()
- * 重写doTag方法,修改标签体里面的内容,将标签体的内容转换成大写
- */
- @Override
- public void doTag() throws JspException, IOException {
- // 得到代表jsp标签体的JspFragment
- JspFragment jspFragment = this.getJspBody();
- StringWriter sw = new StringWriter();
- //将标签体的内容写入到sw流中
- jspFragment.invoke(sw);
- //获取sw流缓冲区的内容
- String content = sw.getBuffer().toString();
- content = content.toUpperCase();
- PageContext pageContext = (PageContext) this.getJspContext();
- //将修改后的content输出到浏览器中
- pageContext.getOut().write(content);
- }
- }
4.控制整个jsp页面是否执行
编写一个类继承SimpleTagSupport,然后再重写doTag方法,在doTag方法抛出SkipPageException异常即可,jsp收到这个异常,将忽略标签余下jsp页面的执行。
示例代码如下:
- package me.gacl.web.simpletag;
- import java.io.IOException;
- import javax.servlet.jsp.JspException;
- import javax.servlet.jsp.SkipPageException;
- import javax.servlet.jsp.tagext.SimpleTagSupport;
- /**
- * @author gacl
- * SimpleTagSupport类实现了SimpleTag接口,
- * SampleTagDemo4类继承SimpleTagSupport
- */
- public class SimpleTagDemo4 extends SimpleTagSupport {
- /* 简单标签使用这个方法就可以完成所有的业务逻辑
- * @see javax.servlet.jsp.tagext.SimpleTagSupport#doTag()
- * 重写doTag方法,控制标签余下的Jsp不执行
- */
- @Override
- public void doTag() throws JspException, IOException {
- //抛出一个SkipPageException异常就可以控制标签余下的Jsp不执行
- throw new SkipPageException();
- }
- }
tld文件中标签体类型设置细节
- <tag>
- <!-- 标签名 -->
- <name>demo2</name>
- <!-- 标签处理器类-->
- <tag-class>me.gacl.web.simpletag.SimpleTagDemo2</tag-class>
- <!-- 标签体允许的内容 ,scriptless表示标签体的内容不允许是java脚本代码-->
- <body-content>scriptless</body-content>
- </tag>
开发好一个标签后,在tld文件中使用<tag>来描述一个标签,描述的内容包括标签名(name),标签处理器类(tag-class),标签体的内容(body-content)。
tld文件中有四种标签体(body-content)类型 :empty、scriptless、JSP、tagdependent
empty:表示该标签没有标签体
scriptless:表示该标签是有标签体的,但是标签体的内容不能是java代码
JSP:表示该标签是有标签体的,并且标签体的内容可以是任意的,包括java代码
tagdependent:表示标签体里面的内容是给标签处理器类使用的(tagdependent用得比较少,了解一下即可)
简单标签标签体的细节注意问题:
在简单标签(SampleTag)中标签体body-content的值只允许是empty、scriptless、tagdependent,不允许设置成JSP,如果设置成JSP就会出现异常:
- The TLD for the class me.gacl.web.simpletag.SimpleTagDemo1 specifies an invalid body-content (JSP) for a SimpleTag
tld文件中用于描述标签属性的<attribute>元素说明
<tag>元素的<attribute>子元素用于描述自定义标签的一个属性,自定义标签所具有的每个属性都要对应一个<attribute>元素
java类:
- package me.gacl.web.tag;
- import java.io.IOException;
- import javax.servlet.jsp.JspException;
- import javax.servlet.jsp.tagext.JspFragment;
- import javax.servlet.jsp.tagext.SimpleTagSupport;
- public class SimpleTagDemo2 extends SimpleTagSupport{
- private int count;
- public void setCount(int count){
- this.count = count;
- }
- @Override
- public void doTag() throws JspException, IOException {
- JspFragment jspFragment = this.getJspBody();
- for (int i = 1; i <= count; i++){
- jspFragment.invoke(null);
- }
- }
- }
tld代码
- <tag>
- <!-- 标签名 -->
- <name>demo5</name>
- <!-- 标签处理器类-->
- <tag-class>me.gacl.web.simpletag.SimpleTagDemo5</tag-class>
- <!-- 标签体允许的内容-->
- <body-content>scriptless</body-content>
- <!-- 标签的属性描述 -->
- <attribute>
- <description>描述标签的count属性</description>
- <!-- 标签的count属性 -->
- <name>count</name>
- <required>true</required>
- <!-- rtexprvalue用来指示标签的属性值是否可以是一个表达式,
- 一般设置为true,true就表示允许标签的属性值可以是一个表达式-->
- <rtexprvalue>true</rtexprvalue>
- </attribute>
- </tag>
<attribute>元素的子元素说明:
javaweb学习6——自定义标签的更多相关文章
- Web学习之自定义标签
1.编写一个实现Tag接口的Java类(标签处理器类) package me.gacl.web.tag; import java.io.IOException; import javax.servle ...
- JavaWeb基础—JSP自定义标签入门
自定义标签的作用:替换JSP页面的java代码 步骤:1.标签处理类(标签是一个对象,那也就需要先有类) 2.tld文件 它是一个xml(可以向c标签里借),一般放到WEB-INF下,不让客户端浏览器 ...
- Spring 源码学习(1) —— 自定义标签
Spring 工作流程是先加载解析xml配置文件:配置文件中存在默认的标签,也可以自定义标签.解析默认标签调用: private void parseDefaultElement(Element el ...
- Angular 学习笔记——自定义标签
<!DOCTYPE HTML> <html ng-app="myApp"> <head> <meta http-equiv="C ...
- javaweb回顾第八篇如何创建自定义标签
前言:在javaweb开发中自定义标签的用处还是挺多的.今天和大家一起看自定义标签是如何实现的. 1:什么是标签 标签是一种XML元素,通过标签可以使JSP页面变得简介易用,而且标签具有很好的复用性. ...
- JSP自定义标签——传统标签
同JSP标签一样,自定义标签主要用于移除JSP页面中的Java代码,可以看到我们在JSP中其实是禁止使用Java脚本的,任何要想通过Java代码实现的功能都必须以标签形式来处理,可以使用JSP标签,J ...
- JSP自定义标签就是如此简单
tags: JSP 为什么要用到简单标签? 上一篇博客中我已经讲解了传统标签,想要开发自定义标签,大多数情况下都要重写doStartTag(),doAfterBody()和doEndTag()方法,并 ...
- Jsp2.0自定义标签(第二天)——自定义循环标签
今天是学习自定义标签的第二天,主要是写一个自定义的循环标签. 先看效果图: 前台页面Jsp代码 <%@ page language="java" contentType=&q ...
- Jsp2.0自定义标签(第一天)——一个简单的例子
今天是学习自定义标签的第一天 Jsp2.0以来,自定义标签的实现比传统标签的实现容易了很多,一般只要extends类SimpleSupport重写doTag()方法即可. 先看最简单的例子,输出一个H ...
随机推荐
- spring-springmvc-hibernate项目小结
1. web.xml中别忘记加入spring监听器 <listener> <listener-class>org.springframework.web.context.Con ...
- 【转载】MySQl 数据库插入加锁分析
http://yeshaoting.cn/article/database/mysql%20insert%E9%94%81%E6%9C%BA%E5%88%B6/
- JAVA 泛型通配符 ? EXTENDS SUPER 的用法
1. <? extends Hero> ArrayList heroList<? extends Hero> 表示这是一个Hero泛型或者其子类泛型heroList 的泛型可能 ...
- python第七课——循环结构 while
while循环: 2.1.有四要素组成: ①.初始化条件(执行一次)一个起始数据/起点,一般使用变量来进行存储 ②.循环条件(可能执行多次)循环合适结束全靠它,执行结果为True,那么循环继续,反之, ...
- 【转】[置顶] 在Android中显示GIF动画
gif图动画在Android中还是比较常用的,比如像新浪微博中,有很多gif图片,而且展示非常好,所以我也想弄一个.经过我多方的搜索资料和整理,终于弄出来了,其实github上有很多开源的gif的展示 ...
- openstack镜像制作思路、指导及问题总结
一.思路就4步:1.创建镜像文件2.用nova-compute自带的kvm,启动.iso文件,用vncviewer完成OS的安装过程3.OS安装完毕,停止虚拟机,kvm重启镜像,安装必要的软件4.后续 ...
- java中抽象的(abstract)方法是否可同时是静态的(static),是否可同时是本地方法(native),是否可同时被synchronized修饰
1.abstract与static what abstract:用来声明抽象方法,抽象方法没有方法体,不能被直接调用,必须在子类overriding后才能使用. static:用来声明静态方法,静态方 ...
- Python的编码注释【转】
格式有多种,但必须有coding:[编码]或者coding=[编码],如: # -*- coding:utf-8 -*- # coding:utf-8 # coding=utf-8 转自:https ...
- [NOIp2009] $Hankson$の趣味题
\(23333\)这是最近第二份在时间上吊打\(yjk\)的代码--啊哈哈哈哈哈哈哈 嗯,其实遇到这种单纯的\(gcd \ \ or \ \ lcm\)的题,我们都可以用一种比较简单的方法分析:唯一分 ...
- CentOS 7中为Yum设置代理
公司给的Linux机器,默认没给联网,然后安装Docker时流程走不下去,找IT半天没人回,然后我就自己折腾,各种配置系统代理,结果并没有成功,最后发现yum可以单独为yum设置代理,方式如下: YU ...