标记文件:很想include,但是比include更好

  • 建立和使用标记文件的最简方法
  1. 取一个被包含文件(如Header.jsp),把它重命名为带有一个.tag扩展名(Header.tag);

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

  3. 在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个位置查找标记文件:
  1. 直接在WEB-INF/tags目录中查找
  2. 在WEB-INF/tags的子目录中查找
  3. 在WEB-INF/lib下的JAR文件的META-INF/tags目录中查找
  4. 在WEB-INF/lib下的JAR文件的META-INF/tags的子目录中查找

    注意,如果标记文件部署在一个JAR中,这个标记文件必须有个TLD;若直接凡在Web应用中,就不需要TLD。

如果标记文件还不够,有时还需要Java

到目前为止,利用标记文件,非Java程序员也能建立定制标记。因为无涉及Java类来处理标记的功能,也不涉及为标记文件建立TLD。

但是,若想要自己编写的标记文件可被别人以JAR的形式调用,那么必须要有TLD,甚至标记处理器(Java类)。

  • 标记处理器

    标记处理器不同于标记文件,他是完成标记工作的Java类,与EL函数有些相似,但是更强大更灵活。

    EL函数只是一些静态方法,而标记处理器类可以访问标记属性、标记体,甚至能访问页面上下文,从而得到作用域属性和请求及响应。
  • 定制标记处理器的两种类型:简单和传统

    一般来说,简单类型几乎能满足所有需要。

建立一个简单标记处理器

  • 一般步骤
  1. 编写一个扩展SimpleTagSupport的类
  2. 实现doTag()方法
  3. 为标记创建一个TLD
  4. 部署标记处理器和TLD
  5. 编写一个使用标记的JSP

  • 一个例子







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

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

停止页面处理——SkipPageException

停止页面处理,不仅仅是抛出异常,而是希望页面已经处理的前一部分作为响应出现,但是不会出现因为某些原因停止处理的后一部分。





可见标记以后的页面信息(Back in the page ….)没有输出!

若从一个被包含页面调用标记,会发生什么情况?

SkipPageException只是停止直接调用标记的页面,外层页面会仍然继续执行。

简单标记的要点

简单标记和传统标记的区别

传统标记对比简单标记可以看看:

《Head First Servlets & JSP》-10-定制标记开发的更多相关文章

  1. 《Head First Servlets & JSP》-9-使用JSTL

    安装JSTL1.1的说明 JSTL1.1不是JSP2.0规范的一部分,能访问servlet和JSP API并不意味着能访问JSTL. 使用JSTL之前,需要将jstl.jar文件安装到Web应用的WE ...

  2. Head First Servlets & JSP 学习笔记 第九章 —— 使用JSTL

    JSTL1.1 不是JSP2.0规范的一部分!你能访问Servlet和JSP API 不意味着你能访问JSTL! 使用JSTL之前,需要将两个文件("jstl.jar" 和 &qu ...

  3. 《深入浅出Windows 10通用应用开发》

        <深入浅出Windows 10通用应用开发>采用Windows 10的SDK进行重新改版,整合了<深入浅出Windows Phone 8.1应用开发>和<深入解析 ...

  4. 《Head First Servlets & JSP》-7-使用JSP

    学习的知识点 JSP,最后会变成一个servlet JSP最终或变成一个完整的servlet在Web应用中运行,只不过这个servlet类会由容器写好. JSP中的scriptlet 所谓script ...

  5. 《Head First Servlets & JSP》-8-无脚本的JSP

    以前servlet和JSP交互的代码 servlet代码示例: JSP代码示例: 若属性不是一个String而是一个Bean呢? 一个简单的JavaBean servlet代码示例: JSP代码示例: ...

  6. 《Head First Servlets & JSP》-1-前言

    <Head First Servlets & JSP>(中文版) BB,KS & BB著, 苏钰函,林剑译,中国电力出版社 数据交互 Web浏览器和Web服务器:通过Htt ...

  7. springmvc学习笔记(10)-springmvc注解开发之商品改动功能

    springmvc学习笔记(10)-springmvc注解开发之商品改动功能 标签: springmvc springmvc学习笔记10-springmvc注解开发之商品改动功能 需求 开发mappe ...

  8. 深入分析JavaWeb Item23 -- jsp自己定义标签开发入门

    一.自己定义标签的作用 自己定义标签主要用于移除Jsp页面中的java代码. 二.自己定义标签开发和使用 2.1.自己定义标签开发步骤 1.编写一个实现Tag接口的Java类(标签处理器类) 要编写一 ...

  9. kettle系列-4.kettle定制化开发工具类

    要说的话这个工具类还是比较简单的,每个方法体都比较小,但用起来还是可以的,把开发中一些常用的步骤封装了下,不用去kettle源码中找相关操作的具体实现了. 算了废话不多了,直接上重点,代码如下: im ...

随机推荐

  1. Cheapest Palindrome(区间DP)

    个人心得:动态规划真的是够烦人的,这题好不容易写出了转移方程,结果超时,然后看题解,为什么这些题目都是这样一步一步的 递推,在我看来就是懵逼的状态,还有那个背包也是,硬是从最大的V一直到0,而这个就是 ...

  2. LeetCode 362. Design Hit Counter

    原题链接在这里:https://leetcode.com/problems/design-hit-counter/description/ 题目: Design a hit counter which ...

  3. Java程序员如何在竞争中保持优势

    Java程序员入门容易,进阶很难,想要在竞争中保持优势,脚踏实地的同时也要仰望星空规划自己的未来.时间在流逝,年龄在增加,你期望的薪水也在不断增多,你总得让自己能力持续增加以配得上想要的收入吧. 从初 ...

  4. flask之flask_socketio

    js客户端发送 {'op':'descrip', 100} python服务端收到的为 dict, 回复客户端可以用emit(str(json.dumps(dict)), room=roomname) ...

  5. [转】LTE整体架构和协议架构概述

    1.1 LTE整体架构 LTE(Long Term Evolution,长期演进)是由3GPP(The 3rd Generation Partnership Project,第三代合作伙伴计划)组织制 ...

  6. java添加背景图片

    总结:我们通常实现添加背景图片很容易,但是再添加按钮组件就会覆盖图片.原因是: 有先后啊.setlayout();与布局有很大关系 请调试代码的时候,仔细揣摩.我晕了 还可以添加文本框,密码框 fra ...

  7. python web框架 Django进阶

    django 进阶 基础中,一些操作都是手动创建连接的非主流操作,这样显得太low,当然也是为了熟悉这个框架! 实际中,django自带连接数据库和创建app的机制,同时还有更完善的路由系统机制.既然 ...

  8. ks8基础(1) etcd安装

    下载安装 https://github.com/coreos/etcd/releases 在这网页,可以看到有多个版本共选择. 下载3.25 解压后, cd etcd-v3.2.5-linux-amd ...

  9. 解决Xcode在debug时不在断点处停止的方法<转>

    搞了老半天不知道为什么 后来查了一下才解决问题,多谢原创作者的贡献. 新年后的第一发! -------------------------------- 前几天在开发的时候,Xcode设置断点后依然无 ...

  10. oracle系统函数(日期函数)

    oracle系统函数(日期函数) 调用日期函数时,首先要明确两个概念,时间戳和日期是不同的,日期中包括年月日但不包括小时分钟秒,时间戳包括年月日小时分钟秒.在oracle中,一般情况下,函数中包含da ...