JavaWeb学习——标签文件

JSP 标签文件(tag file)


 

    前言:在之前我们介绍了自定义标签,通过写无脚本的JSP文件,可以促进分工,页面设计者可以和后台逻辑编码者同时进行工作。但是,编写自定义标签太过冗长琐碎。从JSP2.0开始,通过 tag file 的方式,无须编写标签处理类和标签描述文件,也能够自定义标签。   

一、tag file简介

    tag file 从两个方面简化了自定义标签的开发。首先,tag file 无须提前编译,直到第一次被调用才会编译。除此之外,仅仅使用JSP语法就可以完成标签的扩展定义。

    其次,标签库描述文件也不再需要了。

    JSP容器提供多种方式将 tag file 编译成Java的标签处理类。例如Tomcat将 tag file 翻译成继承于 javax.servlet.jsp.tagext.SimpleTag接口的标签处理类。

    一个 tag file 和JSP页面一样,拥有指令,脚本,EL表达式,动作元素以及自定义的标签。一个tag file以 tag 或者 tagx 为后缀,它们可以包含其他资源文件。一个被其他文件包含的 tag file 应该以 tagf 为后缀。

    tag file 中也有一些隐藏对象,通过脚本或者EL表达式可以访问这些隐藏对象。这些对象与JSP中的隐藏对象相似。

对象             类型                    
request javax.servlet.http.HttpServletRequest             
response javax.servlet.http.HttpServletResponse
out javax.servlet.jsp.JspWriter
session javax.servlet.http.HttpSession
appliction javax.servlet.ServletContext
config javax.servlet.ServletConfig
jspContext javax.servlet.jsp.JspContext

二、第一个 tag file

    下面这个例子包含一个 tag 文件和一个使用这个tag文件的JSP页面。这个tag file的名称是firstTag.tag,代码清单如下:

    firstTag.tag

<%@ tag import="java.util.Date" import="java.text.DateFormat"%>
<% 
     DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.LONG);
     Date now = new Date(System.currentTimeMillis());
     out.print(dateFormat.format(now));
%>

    firstTagTest.jsp 页面

<%@ taglib prefix="easy" tagdir="/WEB-INF/tags"%>
Today is <easy:firstTag/>

    效果如下:

三、tag file 指令

    和JSP页面一样,tag file 可以使用指令来指挥JSP容器如何编译这个tag file。

    除了page指令,其他所有的JSP指令都可以用于tag file。在tag file 中,可以使用tag指令代替page指令。 另外,你还可以使用两个新指令:attribute 和 variable。

tag file指令
 指令                    描述                                           
tag 作用与JSP页面中的page指令类似
include 用于将其他资源导入tag file
taglib 用于将自定义标签库导入tag file
attribute 用于将自定义标签库导入tag file
variable 用于将自定义标签库导入tag file

1. tag指令

    tag指令与JSP中的page指令类似。以下是属性表。

属性     描述
display-name 在XML工具中显示的名称。默认值是不包含后缀的tag file
body-content 指定标签body的类型,body-content属性值有empty、tagdependent、scriptless,默认值是scriptless 
dynamic-attributes   指定tag file动态属性的名称。当dynamiattributes值被设定时,会产生一个Map来存放这些动态属性的名称和对应的值 
small-icon 指定一个图片路径,用于在XML上显示小图标
large-icon 指定一个图片路径,用于在XML上显示大图标
description 标签的描述信息
example 标签使用实例的描述
language tag file 中使用的脚本你语言类型。必须设为“java”
import  用于导入一个java类型,和JSP页面中的import相同
pageEncoding 指定tag file使用的编码格式

    除了import属性,其他所有的属性在一个tag指定或一个tag file 中都只能出现一次。

2. include指令

    tag file 中的include指令和JSP页面中的include是一样的。

3. taglib指令

    可以通过taglib指令在tag lib中使用自定义标签。taglib指令的语法如下:

<%@ taglib uri="taglibraryURI" prefix="tagPrefix" %>

4. attribute指令

    attribute 用于设定tag file中的标签的属性。它与标签库描述文件中的attribute元素等效。

    attributr 指令的的属性如下,其中只有name属性是必须的。

属性     描述
name 用于设定该属性的名称。在一个tag file中,每个属性的名称是唯一的   
required 用于设定该属性是否是必须的。值可以取TRUE和FALSE 
fragment 用于设定该属性是否是fragment。
rtexprvalue    用于设定该属性的值是否在运行时被动态计算
type 用于设定该属性的类型
description 用于设定该属性的描述信息

5. variable指令

    通过variable 可以将tag file 中的一些值传递到JSP页面。variable指令的语法如下:

<% variable (attribute="value")* %>

    variable 指令的属性参见下表:

属性     描述
name-given 变量名。
name-from-attribute   和name-given属性类似,由标签属性的值来决定变量的名称。如果两者属性同时出现或都不出现会出现错误  
alias 设定一个用来接收变量值的局部范围
variable-class 变量的类型
declare 设定该变量是否声明
scope 用于指定该变量的范围
description 用于描述该变量

    与JspWriter对比:JspWriter只能简单地将一个String传递到JSP页面,灵活性很差。

四、doBody

    doBody动作元素只能在tag file中使用,它用来调用一个标签的本体内容。

    doBody动作元素也可以有属性。你可以通过这些属性来指定某个变量来接收主题内容,如果不适用这些指令,那么doBody动作会把主体内容写到JSP页面的JspWriter上。

    doBody动作元素的属性如下表:

属性     描述     
var 用于保存标签主体内容的变量值,主体内容就会以String的类型保存这个变量内。var和varReader只能出现一个  
varReader 用于保存标签主体内容的变量值,主体内容就会以Reader的类型保存在这个变量内
scope 变量保存的作用域

五、invoke

    invoke动作元素和doBody类似,在tag file中,可以使用它来调用一个fragment。invoke动作元素的属性:

属性     描述       
fragment 要调用的fragment名称     
var 用于保存片段主体内容的变量值,主题内容就会以String类型保存在这个变量中,var和varReader属性只能出现一个  
varReader 用于保存片段主体内容的变量值,主题内容就会以Reader类型保存在这个变量中,var和varReader属性只能出现一个
scope 变量保存到的作用域

------   天若有情天亦老,人间正道是沧桑   ------

原文地址:https://www.cnblogs.com/cardiolith/p/9593860.html