• 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 变量保存到的作用域

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

  • 相关阅读:
    J2EE开发环境
    Java核心api
    SCJP (SUN认证Java程序员)
    蓝领”变“金领”
    阿飞正传
    高效项目的七个习惯转载
    写程序的一些感想和教训(转载)
    学习的过程也是迭代的过程
    管理的艺术
    怎样成为优秀的软件模型设计者?[精华]
  • 原文地址:https://www.cnblogs.com/cardiolith/p/9593860.html
Copyright © 2020-2023  润新知