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. 在目标端重建sequence的脚本

    select 'create sequence '||SEQUENCE_OWNER||'.'||sequence_name|| ' minvalue '||min_value|| ' maxvalue ...

  2. JConsole和VisualVM远程访问JMX

    1.jvisualvm监控tomcat 修改tomcat的bin目录下的 catalina.sh文件,搜索JAVA_OPTS="",在引号中添加参数 JAVA_OPTS=" ...

  3. Oracle RAC业务bug导致部分数据丢失处理

    问题描述:业务部门在10月26日发现某张基础表中丢失部分数据,系为9月份录入系统的基础数据丢失 Oracle RAC环境做的RMAN备份,10月18日做过expdp数据泵备份,丢失数据表名为T_GL_ ...

  4. EQS 自定义Context 如何用Testing Pawn 进行测试?

    比如自定义了一个玩家的Context, 那么需要把这个玩家直接放置到场景中 在Context中override Provide Single Actor函数,按类型获取所有的Actor,其中第一个作为 ...

  5. es之java索引操作

    1.7.1: 创建索引 /** * 创建索引 * */ @Test public void createIndex(){ // 创建索引 CreateIndexResponse blog2 = cli ...

  6. UVALive 6858 Frame (模拟)

    Frame 题目链接: http://acm.hust.edu.cn/vjudge/contest/130303#problem/D Description http://7xjob4.com1.z0 ...

  7. Spring Boot 集成 Spring Security 使用自定义的安全数据源

    编写一个类自定义实现 UserDetailsService 接口 @Service("customUserDetailService") public class CustomUs ...

  8. IDEA简单破解激活操作流程(我在用的)

    其实简单的,你需要下一个包,将他放入你的IDEA安装目录的bin下,如下下图 下载地址:https://pan.baidu.com/s/1aJDefDGmfYGrkcJCpZYccA 看到红线的地方了 ...

  9. 阶段1 语言基础+高级_1-3-Java语言高级_1-常用API_1_第4节 ArrayList集合_16-ArrayList练习一_存储随机数

    循环6次就是6.fori 循环子在外部+1就是得到的1到33的数字 list.fori遍历集合 自动生for循环的代码

  10. 接口开发01--mock接口

    开发接口的常见场景: 1.mock接口,模拟一些接口,在别的接口没有开发好的时候,你需要测试,可以先模拟一个假接口来测试.比如常见 2.若需要调用第三方接口时,比如支付接口. 3.查看数据,比如开放数 ...