《Head First Servlets & JSP》-10-定制标记开发
标记文件:很想include,但是比include更好
- 建立和使用标记文件的最简方法
- 取一个被包含文件(如Header.jsp),把它重命名为带有一个.tag扩展名(Header.tag);

- 把标记文件(Header.tag)放在WEB-INF目录下一个名为tags的目录中;

- 在JSP中放一个taglib指令(有一个tagdir属性),并调用这个标记;

如何向标记文件发送参数?
对于标记文件,发送的不是请求参数,而是标记属性!
在JSP中调用标记:
在标记文件中使用属性:

如何定义标记文件中所需要的属性——使用attribute指令
attribute指令只能由标记文件使用,它与定制TLD中的tag部分的attribute子元素有些相似。
若属性值很大,则把属性从标记文件中取出来,作为体。即在标记文件中不要attribute指令了:

- 如果没有TLD,那么如何声明体中的内容?——tag指令
标记文件中不但有attribute指令,还有tag指令,tag指令有body-content属性可以声明标记文件的体内容的类型。body-content属性的值有以下三种:
| scriptless(default) | tagdependent | empty |
|---|---|---|
| 不允许脚本 | 标记体看作纯文本 | 标记体中什么也没有 |
实际上,标记文件标记的体中绝对不允许有scriptlet脚本(可以有EL表达式)。

- 容器在哪里查找标记文件?
容器会在4个位置查找标记文件:
- 直接在WEB-INF/tags目录中查找
- 在WEB-INF/tags的子目录中查找
- 在WEB-INF/lib下的JAR文件的META-INF/tags目录中查找
- 在WEB-INF/lib下的JAR文件的META-INF/tags的子目录中查找
注意,如果标记文件部署在一个JAR中,这个标记文件必须有个TLD;若直接凡在Web应用中,就不需要TLD。
如果标记文件还不够,有时还需要Java
到目前为止,利用标记文件,非Java程序员也能建立定制标记。因为无涉及Java类来处理标记的功能,也不涉及为标记文件建立TLD。
但是,若想要自己编写的标记文件可被别人以JAR的形式调用,那么必须要有TLD,甚至标记处理器(Java类)。
- 标记处理器
标记处理器不同于标记文件,他是完成标记工作的Java类,与EL函数有些相似,但是更强大更灵活。
EL函数只是一些静态方法,而标记处理器类可以访问标记属性、标记体,甚至能访问页面上下文,从而得到作用域属性和请求及响应。 - 定制标记处理器的两种类型:简单和传统
一般来说,简单类型几乎能满足所有需要。
建立一个简单标记处理器
- 一般步骤
- 编写一个扩展SimpleTagSupport的类
- 实现doTag()方法
- 为标记创建一个TLD
- 部署标记处理器和TLD
编写一个使用标记的JSP
一个例子

简单标记处理器的生命周期

自己定制一个有属性简单标记(类似c:forEach?)

停止页面处理——SkipPageException
停止页面处理,不仅仅是抛出异常,而是希望页面已经处理的前一部分作为响应出现,但是不会出现因为某些原因停止处理的后一部分。
可见标记以后的页面信息(Back in the page ….)没有输出!
若从一个被包含页面调用标记,会发生什么情况?
SkipPageException只是停止直接调用标记的页面,外层页面会仍然继续执行。
简单标记的要点

简单标记和传统标记的区别
传统标记对比简单标记可以看看:

《Head First Servlets & JSP》-10-定制标记开发的更多相关文章
- 《Head First Servlets & JSP》-9-使用JSTL
安装JSTL1.1的说明 JSTL1.1不是JSP2.0规范的一部分,能访问servlet和JSP API并不意味着能访问JSTL. 使用JSTL之前,需要将jstl.jar文件安装到Web应用的WE ...
- Head First Servlets & JSP 学习笔记 第九章 —— 使用JSTL
JSTL1.1 不是JSP2.0规范的一部分!你能访问Servlet和JSP API 不意味着你能访问JSTL! 使用JSTL之前,需要将两个文件("jstl.jar" 和 &qu ...
- 《深入浅出Windows 10通用应用开发》
<深入浅出Windows 10通用应用开发>采用Windows 10的SDK进行重新改版,整合了<深入浅出Windows Phone 8.1应用开发>和<深入解析 ...
- 《Head First Servlets & JSP》-7-使用JSP
学习的知识点 JSP,最后会变成一个servlet JSP最终或变成一个完整的servlet在Web应用中运行,只不过这个servlet类会由容器写好. JSP中的scriptlet 所谓script ...
- 《Head First Servlets & JSP》-8-无脚本的JSP
以前servlet和JSP交互的代码 servlet代码示例: JSP代码示例: 若属性不是一个String而是一个Bean呢? 一个简单的JavaBean servlet代码示例: JSP代码示例: ...
- 《Head First Servlets & JSP》-1-前言
<Head First Servlets & JSP>(中文版) BB,KS & BB著, 苏钰函,林剑译,中国电力出版社 数据交互 Web浏览器和Web服务器:通过Htt ...
- springmvc学习笔记(10)-springmvc注解开发之商品改动功能
springmvc学习笔记(10)-springmvc注解开发之商品改动功能 标签: springmvc springmvc学习笔记10-springmvc注解开发之商品改动功能 需求 开发mappe ...
- 深入分析JavaWeb Item23 -- jsp自己定义标签开发入门
一.自己定义标签的作用 自己定义标签主要用于移除Jsp页面中的java代码. 二.自己定义标签开发和使用 2.1.自己定义标签开发步骤 1.编写一个实现Tag接口的Java类(标签处理器类) 要编写一 ...
- kettle系列-4.kettle定制化开发工具类
要说的话这个工具类还是比较简单的,每个方法体都比较小,但用起来还是可以的,把开发中一些常用的步骤封装了下,不用去kettle源码中找相关操作的具体实现了. 算了废话不多了,直接上重点,代码如下: im ...
随机推荐
- 第八篇 web开发学习资源
互联网时代,最好的资源都在网上,好好利用网络学起来! 偶然才发现好资源,很多是E文的,看来努力的路还很长! 1)下面是一个老外收集的PHP资源,确实要为此分享点赞. https://github.co ...
- 除了IE浏览器能识别之外,其他浏览器都不能识别的html写法
最近写html页面的时候发现顶部边界margin-top用了定位之后,IE的跟其他浏览器不同,所以用到了把IE跟其他浏览器区分开来的写法 <!--[if !IE]> <div cla ...
- 解决sql脚本文件太大无法打开的问题
as we known,sql数据库高版本向低版本还原是不太可能但是又经常会碰到的事,今天实测了一种方法 步骤:任务—>生成脚本—> 下一步->高级,选择数据库版本和编写脚本数据类型 ...
- OracleParameter中参数名必须是DB中已有字段:【 ORA-01745: 无效的主机/绑定变量名】
错误例子: 错误原因:查询的变量是自己随便命名的,不是数据库表中已有的字段, 因此,在进行OracleParameter(":rownum",10)时,在数据库中无法自动进行字段匹 ...
- 一个分类,两个问题之ArrayList
前段时间,在做一个商品的分类,分类有3级,类似于以下这种形式的: ---食物 ---蔬菜 ---白菜 ---材料 ---鸡肉 ....... 而我需要做的是将取得的一个商品的字符串类型的分类ID集,然 ...
- java代码。从键盘输入次数。可控制的
总结:把一碗水端平,本来水就不多. package com.b; import java.util.Scanner; //想办法用数组.一次性,多个的输出分解质因数 public class fa4 ...
- explain之三:MYSQL EXPLAIN语句的extended 选项学习体会,分析诊断工具之二
MySQL 的explain命令有一个extended选项,我想可以很多人都没有注意,因为它对命令的输出结果没有任何改变,只是增加了一个warning.这个 warning中显示了MySQL对SQL的 ...
- c# 遍历目录
public static List<string> TraverseDirector(string dir, bool isTraveSubDirFlag, bool isFilterS ...
- 单片机RS485通信接口、控制线、原理图及程序实例
RS232 标准是诞生于 RS485 之前的,但是 RS232 有几处不足的地方: 接口的信号电平值较高,达到十几 V,使用不当容易损坏接口芯片,电平标准也与TTL 电平不兼容. 传输速率有局限,不可 ...
- SRW锁的使用
SRWLock的目的和关键段相同:对一个资源进行保护,不让其它线程访问它.但是,与关键段不同的是,SRWLock允许我们区分哪些想要读取资源的值 的线程(读取者线程)和想要更新资源的值的线程(写入者线 ...