SimpleTag标签

定义了五个方法:setJspContext、setJspBody、setParent和getParent以及最重要的doTag方法(完成了所有的业务逻辑);

  • setJspContext方法:将JSP页面的pageContext对象传递给标签处理器对象
  • setJspBody方法:将代表标签体的JspFragment对象传递给标签处理器对象
  • setParent方法:将父标签处理器对象传递给当前标签处理器
  • getParent方法:获取当前标签的服标签处理器对象
  • doTag方法:用于完成所有的标签逻辑,包括输出、迭代、修改标签体内容等

SimpleTag接口提供了一个默认的实现类SimpleTagSupport,因此在编写时继承和扩展该类即可,再根据业务重写doTag方法;

范例:是否输出jsp页面的某一部分

标签处理器类:()

 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); }

提供了两种方法输出标签体内容;而标签体内容如下:

<%@taglib uri="/xxx" prefix="ttt" %>
<ttt:tagname>
xiao兆
</ttt:tagname>

进行多次输出:

public void doTag() throws JspException, IOException {
// 得到代表jsp标签体的JspFragment
JspFragment jspFragment = this.getJspBody();
for (int i = ; i < ; i++) {
// 将标签体的内容输出到浏览器
jspFragment.invoke(null);
}
}

修改标签体的内容:

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);
}

需要将结果写入一个自定义的缓冲区中,再将缓冲区的内容进行修改后进行输出即可;

控制余下的jsp页面是否执行:

 public void doTag() throws JspException, IOException {
//抛出一个SkipPageException异常就可以控制标签余下的Jsp不执行
throw new SkipPageException();
}

jsp页面范例:

 <body>
<h1>xiao兆</h1>
<%--在jsp页面中使用自定义标签 --%>
<ttt:tagname/>
<!-- 这里的内容位于 <ttt:tagname/>标签后面,因此不会输出到页面上 -->
<h1>learn</h1>
</body>

 标签库

我们在编写标签库时,标签有一个子元素<body-content>,表示标签体的内容,有四种类型:empty、JSP、scriptless、tagdependent;

而在编写简单标签时是不允许设置JSP类型的;

其各自代表的含义是:

empty:表示没有标签体;

scriptless:表示有标签体,且标签体不可以是java代码;

JSP:表示有标签体,且标签体可以是java代码,不过使用java代码的话其实就失去了自定义标签的意义了;

tagdependent:表示该标签体的内容是给标签处理器使用的,用的比较少;

注意标签库的uri不能设置相同的,所以在设置时候最好带上tld文件的所在目录,降低uri重复的可能性;

JspFragment类

web容器在处理简单标签时,会把标签体内容用一个JspFragment对象表示,并调用setJspBody方法把其传递给标签处理器对象,JspFragment类中只定义了两种方法:

getJspContext方法:返回调用页面的JspContext对象;

invoke方法:控制是否执行输出、迭代标签体内容或修改后输出,如没调用,则相当于忽略标签体内容;

带属性的标签体:

<ttt:tagname count = "">
xiao兆
</ttt:tagname>

类似上面这种,包含count属性的标签体,其中count可在标签处理器充当一个变量,并通过Jsp页面中的标签体属性赋值给它,如果是8种基本数据类型,在JSP传递字符串时会自动改成相应的类型,不过如同date之类的复合数字类型,则不会进行自动转换,可通过表达式的方式给复合属性赋值,如:

<%
Date d = new Date();
request.setAttribute("date", d);
%> <gacl:demo6 date="${date}"/>

自定义标签的每个属性都要对应一个<attribute>元素,位于<tag>元素里面,<attribute>元素也有多个子元素,用于描述每个属性:

java_第一年_JavaWeb(12)的更多相关文章

  1. java_第一年_JavaWeb(14)

    EL :EL表达式主要用于获取数据.执行运算.获取对象.调用java方法: 获取数据 语法:"${标识符}" 会调用pageContext.findAttribute方法,从pag ...

  2. java_第一年_JavaWeb(13)

    JSTL标签库——核心标签库 为了弥补html标签的不足,为了更加方便地在jsp页面中使用java逻辑代码,JSTL标签库因运而生,而其中的佼佼者,被恩宠最多的就是核心标签库了: 核心标签库从功能上可 ...

  3. java_第一年_JavaWeb(11)

    自定义标签:主要是用来移除JSP页面中的java代码. 先从一个简单的案例了解其怎么移除代码: 一个正常的jsp页面: <%@ page language="java" pa ...

  4. java_第一年_JavaWeb(6)

    会话 会话:浏览器从打开一个进程访问服务器到该浏览器关闭,我们称之为一个会话: 在浏览器和服务器交互期间,会不可避免地产生一些数据,而为了为每个用户保存其对应的数据,可使用两种技术:Cookie和Se ...

  5. java_第一年_JavaWeb(15)

    Filter过滤器,Servlet API 中提供了一个Filter接口,用于实现用户在访问某个目标资源前对其进行拦截: 拦截原理:web服务器通过Filter接口调用doFilter方法,会传递一个 ...

  6. java_第一年_JavaWeb(10)

    JavaWeb的两种开发模式 JSP+JavaBean框架:JavaBean负责封装数据.提供方法,JSP负责处理用户请求和显示数据:只能开发较为简单的业务: JSP+JavaBean+Servlet ...

  7. java_第一年_JavaWeb(9)

    JavaBean是一个遵循某种特定写法的Java类,有以下特点: 必需具有一个无参的构造函数 属性必需私有化 私有化的属性必需通过public类型的方法暴露给其它程序,其方法命名也有一定的规范 范例: ...

  8. java_第一年_JavaWeb(8)

    前面说到,JSP在运行时会被编译成Servlet源代码,通过_jspServlet方法处理请求,此时该方法会传递和提供9个与web开发相关的对象进行使用,开发人员在JSP页面通过对这些变量即可引用这9 ...

  9. java_第一年_JavaWeb(7)

    JSP执行过程 客户端发出请求访问JSP文件 JSP Container将要访问的JSP文件转译为Servlet的源代码(转译时期),并将其编译成.class文件(编译时期): 执行编译后的.clas ...

随机推荐

  1. redis面试题集錦

    1为什么Redis需要把所有数据放到内存中? Redis为了达到最快的读写速度将数据都读到内存中,并通过异步的方式将数据写入磁盘.所以Redis具有快速和数据持久化的特性.如果不将数据放到内存中,磁盘 ...

  2. 【LuoguP3241】[HNOI2015] 开店

    题目链接 题意 给出一棵边带权的树,多次在线询问一个点到一个区间内的点的距离和. Sol 分块过不了的 一个 trick ,都知道要算两点之间距离可以拆成到根的距离和他们的 LCA 到根的距离 ,其实 ...

  3. springSecurity安全框架

    一.是什么 是一种基于 Spring AOP 和 Servlet 过滤器的安全框架,对访问权限进行控制 二.作用 1.认证 用户名和密码认证,核对是否正确 2.授权 若正确,给予登录用户对应的访问权限 ...

  4. 2019年开发App记录

    Pod 制作私有库参考 https://www.jianshu.com/p/f903ecf8e882 Pod私有库的升级 改代码部分,到Example文件夹执行pod install ,修改XXX.s ...

  5. php array_push()函数 语法

    php array_push()函数 语法 作用:向第一个参数的数组尾部添加一个或多个元素(入栈),然后返回新数组的长度.博智达 语法:array_push(array,value1,value2.. ...

  6. 有关于TreeSet的自我理解

    TreeSet是依靠TreeMap来实现的. TreeSet是一个有序集合,TreeSet中的元素将按照升序排列,缺省是按照自然排序进行排列,意味着TreeSet中的元素要实现Comparable接口 ...

  7. Swift权限控制

    最后更新:2017-03-20 private: 只能在当前类里面访问 fileprivate: 只能在当前文件内访问 internal:internal访问级别所修饰的属性或方法在源代码所在的整个模 ...

  8. 使用vue技术应当使用的技术和兼容性选择

    假如你的前端框架使用了vue,那你可以大胆地使用以下技术,并忽略其他js和css的兼容性问题,因为 关于vue的兼容性 官方给出了规定 Vue 不支持 IE8 及以下版本,因为 Vue 使用了 IE8 ...

  9. Hadoop 服务SYS CPU过高导致宕机问题

    最近某hadoop集群多次出现机器宕机,现象为瞬间机器的sys cpu增长至100%,机器无法登录.只能硬件重启,ganglia cpu信息如下: 首先怀疑有用户启动了比较奇葩的job,导致不合理的系 ...

  10. 通过Hadoop jmx收集Namenode,Jobtracker相关信息

    经常会有一些Hadoop监控的需求,例如datanode节点掉线,Tasktracker blacklist的数量,以及Namenode,Jobtracker的内存GC信息等. 之前采用Hadoop ...