《Head First Servlets & JSP》-10-定制标记开发

标记文件:很想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-定制标记开发

时间: 2024-10-21 04:29:36

《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应用的WEB-INF/lib目录,即每个Web应用都需要JSTL的一个副本. 不用脚本实现一个循环--c:forEach servlet代码: 使用脚本实现,很不好 若想要在JSP页面中显示其中的各个元素,使用脚本的方式如下: 使用JSTL c:forEach实现 c:forEach标记提供了一种简单的方法来

《Head First Servlets & JSP》-12-Web应用安全

serlvet安全的4大要素 认证.授权.机密性和数据完整性. 容器完成认证和授权的过程 代码中不要有安全信息 大多数Web应用,大多数情况下Web应用的安全约束都应该以声明方式处理,即在部署描述文档中指定.原因如下: 谁不想更多地采用XML呢 通常能自然地映射到公司IT部门现有的任务角色 你可以用更灵活的方式使用以前servlet 应用开发人员可以重servlet不用去碰源代码 随着应用的扩展,可以减少可能的维护 还有一点,这正好能体现容器的价值 支持基于组件的开发思想 谁来实现Web应用中的

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

以前servlet和JSP交互的代码 servlet代码示例: JSP代码示例: 若属性不是一个String而是一个Bean呢? 一个简单的JavaBean servlet代码示例: JSP代码示例: 或者这么写: JSP中不要出现脚本 使用标准动作的JSP 标准动作jsp:useBean详解 scope默认是page作用域,那么在上述示例代码中可能出现问题:找不到person对象! 标准动作jsp:getProperty详解 jsp:useBean还可以创建一个bean 以下标准动作标记: 会

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

学习的知识点 JSP,最后会变成一个servlet JSP最终或变成一个完整的servlet在Web应用中运行,只不过这个servlet类会由容器写好. JSP中的scriptlet 所谓scriptlet就是放在<%-%>标记中的java代码.如: <% out.println(com.inspur.Counter.getCount()); %> JSP中的指令 JSP指令和scriptlet区别在于:多了一个@符号.注意中间无空格. 使用page指令导入包 导入一个包: <

【软帝学院】10个java开发工具,所有java开发人员都应该了解的工具

10个java开发工具,所有java开发人员都应该了解的工具 1.Groovy Groovy 是 用于Java虚拟机的一种敏捷的动态语言,它是一种成熟的面向对象编程语言,既可以用于面向对象编程,又可以用作纯粹的脚本语言. 为Java开发者提供了 现代最流行的编程语言特性,而且学习成本很低,支持DSL和其它简洁的语法,让代码变得易于阅读和维护. Groovy拥有处理原生类型,面向对象以及一个Ant DSL,使得创建Shell Scripts变得非常简单. 大大提高了开发者的效率. 2.Rest-a

10个java开发工具,所有java开发人员都应该了解的工具

10个java开发工具,所有java开发人员都应该了解的工具1.GroovyGroovy 是 用于Java虚拟机的一种敏捷的动态语言,它是一种成熟的面向对象编程语言,既可以用于面向对象编程,又可以用作纯粹的脚本语言.为Java开发者提供了 现代最流行的编程语言特性,而且学习成本很低,支持DSL和其它简洁的语法,让代码变得易于阅读和维护. Groovy拥有处理原生类型,面向对象以及一个Ant DSL,使得创建Shell Scripts变得非常简单. 大大提高了开发者的效率.2.Rest-assur

《Head First Servlets & JSP》-13-过滤器和包装器

过滤器是什么 与servlet非常类似,过滤器就是java组件,请求发送到servlet之前,可以用过滤器截获和处理清求,另外 servlet结束工作之后,在响应发回给客户之前,可以用过滤器处理响应. 容器根据DD中的声明来确定何时调用过滤器.在DD中,部署人员要建映射.明确对于哪个请求URL模式要调用哪些过滤器.所以,要由部署人员(而不是程序员)来确定哪些请求或响应应当由哪些过滤器处理. 过滤器要做的事情 只有一个过滤器接口:Filter,根据使用方式,可完成诸如以下工作: 请求过滤器可以完成

《Head First Servlets & JSP》-2-概述

什么是容器 Servlet没有main()方法,他们受控于另一个Java应用,这个java应用称为容器(Container). Web服务器应用(如Apache)得到一个指向Servlet的请求(如何判断是一个Servlet请求而不是一个静态HTML页面请求?)时,服务器不是把这个请求交给Servlet本身,而是交给部署该Servlet的容器.由容器向Servlet提供HTTP请求和响应,而且要由容器调用Servlet的方法(如doPost()或deGet()). 注意,我们目前使用Tomcat

《Head First Servlets & JSP》-11-Web应用部署

Web目录 WAR文件 WAR文件只是Web应用结构的一个快照,采用了一种更可移植的压缩形式. 建立WAR文件时,就是把整个Web应用结构(去掉Web应用上下文目录,就是把WEB-INF之上的一级目录去掉)压缩起来,给定一个.war扩展名. 容器如何知道Web应用的名字/上下文呢?Tomcat中,WAR文件名就是了! 在一个WAR文件中,可以在META-INF/MANIFEST.MF文件中声明库依赖性(和直接放在WEB-INF/lib下有何区别?后文见分晓). 部署后的WAR文件的样子 使静态内