在上一篇文章中介绍了自定义标签的用法,接下来介绍标签文件的用法啦。


  tag file指令

  tag file简介

  用tag file的方式,无需编写标签处理类和标签库描述文件,也可以自定义标签。tag file从两个方面简化了自定义标签的开发。首先,tag file无须提前编译,直到第一次调用才会编译;其次,标签库描述文件也不再需要了,使用tag file的方式,tag file名和action相同,因此不需要标签库描述文件了。

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

  tag文件必须放在应用路径的WEB-INF/tags目录下才能生效。和标签处理类一样,tag文件可以被打包到jar包里。

  以下是tag file中可用的隐藏对象(其实跟文章JSP隐藏对象类似):

对象

类型

说明

request

javax.servlet.http.HttpServletRequest

每当客户端请求一个JSP页面时,JSP引擎就会制造一个新的reuqest对象来代表这个请求。request对象提供了一系列方法来获取HTTP头信息、cookies、HTTP方法等等。

response

javax.servlet.http.HtpServletResponse

当服务器创建request对象时会同时创建用于响应这个客户端的response对象。response对象也定义了处理HTTP头模块的接口。通过这个对象,开发者们可以添加新的cookies、时间戳、HTTP状态码等等。

out

javax.servlet.jsp.JspWriter

out对象用来在response对象中写入内容。

session

javax.servlet.http.HttpSession

session对象用来跟踪在各个客户端请求间的会话。

application

javax.servlet.ServletContext

application对象在JSP页面的整个生命周期中都代表着这个JSP页面。这个对象在JSP页面初始化时被创建,随着jspDestory()的调用而被移除。通过向application中添加属性,则所有组成web应用的JSP文件都能访问到这些属性。

config

javax.servelt.ServletConfig

config对象允许开发者访问Servlet或者JSP引擎的初始化参数,比如文件路径等。

pageContext

javax.servlet.jsp.PageContext

pageContext对象主要用来访问页面信息,同时过滤大部分实现细节。该对象除了pageContext、page、exception对象的属性不能导出,其余内置对象的属性都能导出,而且该对象包含了传给JSP页面的指令信息,也定义了一些字段。

page

javax.servlet.jsp.HttpJspPage

page对象就是页面实例的引用,可以被看做是整个JSP页面的代表(与this对象同义)

exception

java.lang.Throwable

exception对象包装了从先前页面中抛出的异常信息,通常被用来产生对出错条件的适当响应。

   

  接下来是创建一个标签文件并且使用的例子:

  创建标签文件并使用只有两步:

  ① 编写标签文件.tag(例如firstTag.tag),记住要在/WEB-INF/tags中创建此文件哦。

<%@ tag import="java.util.Date"
    import="java.text.SimpleDateFormat"
    import="java.io.IOException"%>
<%
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd  HH:mm:ss");
    String dateStr = simpleDateFormat.format(new Date());
    JspWriter jspWriter = getJspContext().getOut();
    jspWriter.write(dateStr);
%>

  ② 编写jsp测试页面。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="easy" tagdir="/WEB-INF/tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    Today is <easy:firstTag/>
</body>
</html>

  出来的页面效果就跟自定义标签展现出来的样子是类似的哦。

  

  tag file指令

  tag file的指令不多,也就那么几个:

指令

说明

tag

作用与JSP页面中的page指令类似

include

用于将其他资源导入tag file中

taglib

用于将自定义标签库导入tag file中

attribute

用于将自定义标签库导入tag file中

variable

用于将自定义标签库导入tag file中

  看着有点懵?没事儿,接下来会挨个儿解释。

  ① tag指令

  语法<%@ tag attribute="value" attribute2="value2" %>

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

属性

描述

display-name

在XML工具中显示的名称。默认值是不包含后缀的tag file名

body-content

指定标签body的类型, body-content属性值有empty、tagdependent、scriptless,默认值是scriptless。

dynamic-attributes

指定tag file动态属性的名称。当dynamicattributes值被设定时,会产生一个Map来存放这些动态属性的名称和对应的值。

small-icon

指定一个图片路径,用于在XML工具上显示小图标。一般不会用到。

large-icon

制定一个图片路径,用于在XML工具上显示大图标。一般不会用到。

description

标签的描述信息。

example

标签使用实例的描述。

language

tag file中使用的脚本语言类型。当前版本的JSP中,该值必须设为”java”。

import

用于导入一个java类型,和JSP页面中的import相同。

pageEncoding

指定tag file使用的编码格式,可以使用“CHARSET”中的值。和JSP页面中pageEncoding相同。

  include指令

  tag file中的include指令和JSP页面中的include指令是一样的。可以使用这个指令来将外部文件导入到tag file中。当你有一个公共资源文件有可能用在多一个tag file中时,include指令将能够发挥它的作用。这个公共资源文件可以是静态文件(如HTML文件),也可以是动态文件(如tag file)。

  接下来是一个例子~(除了jsp页面文件,其余的文件都要放到tags文件夹中哦)。

  ① 创建一个tag file(如includeDemoTag.tag)。

Here is the content of included.html:
<%@ include file="included.html" %>
<br/>
<br/>
The second include directive includes another dynamic resource:
included.tagf.
<br/>
<%@ include file="included.tagf" %>

  

  ② 创建一个.html文件(如included.html),用于展示实现include导入,html等静态文件的功能

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<table>
    <tr><td><b>Menu</b></td></tr>
    <tr><td>CDs</td></tr>
    <tr><td>DVDs</td></tr>
    <tr><td>Others</td></tr>
</table>
</body>
</html>

  ③ 创建一个.tagf文件(如included.tagf),用于展示实现include导入.tagf等动态文件的功能

<%
    out.print("Hello from included.tagf");
%>

  ④ 创建一个.jsp页面文件用于测试include指令的作用

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="easy" tagdir="/WEB-INF/tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <easy:includeDemoTag/>
</body>
</html>

  出来的页面效果是这样子哒~

  taglib指令

  可以通过taglib指令在tag file中使用自定义标签。

  语法<%@ taglib uri="tagLibraryURI" prefix="tagPrefix" %>

  属性uri属性---用来指定与前缀相关联的标签库描述文件的绝对路径或相对路径;prefix属性---用来定义自定义标签的前缀。

  使用taglib指令,既可以使用不包含content body的自定义标签:

<prefix:tagName/>

  也可使用包含content-body的自定义标签:

<prefix:tagName>body</prefix:tagName>

  使用taglib指令的例子如下:

  ① 先创建一个.tag的文件(如taglibDemo.tag,此例中会用到上述的第一个例子中的firstTag.tag文件)

<%@ taglib prefix="simple" tagdir="/WEB-INF/tags"%>
The server's date : <simple:firstTag/>

  ② 然后再创建一个.jsp(如taglibDemoTest.jsp)页面文件,用来测试taglib指令。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="easy" tagdir="/WEB-INF/tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <easy:taglibDemo/>
</body>
</html>

  测试出来的效果是这样的。

  attribute指令

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

  语法<%@ attribute attribute1="value1" attribute2="value2" %>

  属性(这些属性中,只有name属性是必选的):

属性

描述

name

用于设定该属性的名称,在一个tag file中,每个属性的名称必须是唯一的。

required

用于设定该属性是否是必须的。值可以去true或false,默认值为false。

fragment

用于设定该属性是否是fragment。默认值为false。

rtexprvalue

用于设定该属性的值是否在运行时被动态计算。值可以取true或false,默认值为true。

type

用于设定该属性的类型,默认值为java.lang.String。

description

用于设定该属性的描述信息。

  以下是关于attribute指令的例子~

  ① 创建一个.tag文件(如encode.tag)

<%@ attribute name="input" required="true"%>
<%!
    private String encodeHtmlTag(String tag){
        if(tag==null){
            return null;
        }
        int length = tag.length();
        StringBuilder encodedTag = new StringBuilder(2*length);
        for(int i=0;i<length;i++){
            char c = tag.charAt(i);
            if(c=='<'){
                encodedTag.append("&lt");
            }else if(c=='>'){
                encodedTag.append("&gt");
            }else if(c=='&'){
                encodedTag.append("&amp");
            }else if(c=='"'){
                encodedTag.append("&qout");
            }else if(c==' '){
                encodedTag.append("&nbsp");
            }else{
                encodedTag.append(c);
            }
        }
        return encodedTag.toString();
    }
%>
<%=encodeHtmlTag(input)%>

  

  ② 创建一个.jsp页面进行测试(如encodeTagTest.jsp)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="easy" tagdir="/WEB-INF/tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <easy:encode input="<br/> means changing line."/>
</body>
</html>

  

  完成上述的步骤之后,得到的效果就是这样的:

  variable指令

  tag file中的variable指令是用于定义那些需要传递到JSP页面的变量。

  tag file支持多个variable指令,这意味着可以传递多个值到JSP页面。相对而言,attribute指令的作用与variable相反,它用于将值从JSP页面传递到tag file。

  语法<%@ variable attribute1="value" attribute2="value2" %>

  属性

属性

描述

name-given

变量名。在JSP页面的脚本和EL表达式中,可以使用该变量名。如果指定了name-from-attribute属性,那么name-given属性就不能出现了,反之亦然。name-given的值不能和同一个tag file中的属性名重复。

name-from-attribute

和name-given属性类似,由标签属性的值来决定变量的名称。如果name-from-attribute和name-given属性同时出现h或者都不出现的话会出现错误。

alias

设定一个用来接收变量值的局部范围。

variable-class

变量的类型。默认为java.lang.String。

declare

设定该变量是否声明。默认值是false。

scope

用于指定该变量的范围。可取的值为AT_BEGIN、AT_END和NESTED。默认值为NESTED。

description

用于描述变量。

  

  以下是对variable指令的示例:

  ① 创建.tag文件(如varDemo.tag)

<%@ tag import="java.util.Date" import="java.text.DateFormat"%>
<%@ variable name-given="longDate" %>
<%@ variable name-given="shortDate"%>
<%
    Date now = new Date(System.currentTimeMillis());
    DateFormat longFormat = DateFormat.getDateInstance(DateFormat.LONG);
    DateFormat shortFormat = DateFormat.getDateInstance(DateFormat.SHORT);
    jspContext.setAttribute("longDate", longFormat.format(now));
    jspContext.setAttribute("shortDate", shortFormat.format(now));
%>
<jsp:doBody/>

  ② 创建一个用于测试的.jsp页面(如varDemoTest.jsp)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="tags" tagdir="/WEB-INF/tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    Today's date:
    <br/>
    <tags:varDemo>
        In long format:${longDate }
        <br/>
        In short format:${shortDate }
        <br/>
    </tags:varDemo>
</body>
</html>

  

  通过以上的步骤得到的页面效果就是下图所示啦:

  

  doBody

  doBody动作元素只能在tag file中使用,它用来调用一个标签的本体内容。doBody动作元素也可以有属性。你可以通过这些属性来指定某个变量来接收主体内容,如果不使用这些指令,那么doBody动作元素会把主体内容写到JSP页面的JspWriter上。

  doBody动作元素的属性如下(这些属性都是非必须的哦):

属性

描述

var

用于保存标签主体内容的变量值,主体内容就会以java.lang.String的类型保存这个变量内。var和varReader属性只能出现一个。

varReader

用于保存标签主体内容的变量值,主体内容就会以java.io.Reader的类型保存这个变量内。var和varReader属性只能出现一个。

scope

变量保存到的作用域。

  

  接下来是doBody动作元素的例子:

  ① 创建一个.tag文件(如doBodyDemo.tag)。

<jsp:doBody var="referer" scope="session"></jsp:doBody>
<!-- 意思是,一个doBody动作元素,指定了一个叫做referer的session属性来保存标签本体内容 -->

  

  ② 创建一个.jsp文件(如main.jsp),用于加载头信息并且对referer变量的值进行赋值。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="tags" tagdir="/WEB-INF/tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    Your referer header:${header.referer }
    <br/>
    <tags:doBodyDemo>
        ${header.referer }
    </tags:doBodyDemo>
    <a href="viewReferer.jsp">View</a> the referer as a Session attribute.
</body>
</html>

  ③ 创建一个.jsp页面(如viewReferer,jsp),用于把在main.jsp存储的referer值打印出来。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
The referer header of the previous page is ${sessionScope.referer }
</body>
</html>

  ④ 创建一个.html页面(如searchEngine.html),用于打开main,jsp页面查看测试结果。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
Please click <a href="main.jsp">here</a>
</body>
</html>

  

  接下来是测试结果的展示~

  ① searchEngine.html

  ② main.jsp

  ③ viewReferer.jsp

  invoke动作元素

  invoke动作元素和doBody类似,在tag file中,可以使用它来调用一个fragment。invoke动作元素中有多个属性,其中只有fragment属性是必须的。

  invoke动作标签的属性

  

属性

描述

fragment

要调用的fragment的名称。

var

用于保存片段主体内容的变量值,主体内容就会以java.lang.String的类型保存这个变量内。var和varReader属性只能出现一个。

varReader

用于保存标签主体内容的变量值,主体内容就会以java.io.Reader的类型保存这个变量内。var和varReader属性只能出现一个。

scope

变量保存到的作用域。

  接下来是关于invoke动作元素的例子:

  ① 创建一个.tag文件(如invokeDemo.tag)。

<%@ attribute name="productionDetails" fragment="true" %>
<%@ variable name-given="productName" %>
<%@ variable name-given="description" %>
<%@ variable name-given="price" %>
<%
    jspContext.setAttribute("productName", "Pelesonic DVD Player");
    jspContext.setAttribute("description", "Dolby Digital output through coaxial digital-audio jack,"+
        "500 lines horizontal resoluction-image digest viewing");
    jspContext.setAttribute("price", "65");
%>
<jsp:invoke fragment="productionDetails"></jsp:invoke>

  ② 创建一个.jsp文件(如invokeTest.jsp)。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="easy" tagdir="/WEB-INF/tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <easy:invokeDemo>
        <jsp:attribute name="productionDetails">
            <table width="220" border="1">
            <tr>
                <td><b>Product Name</b></td>
                <td>${productName }</td>
            </tr>
            <tr>
                <td><b>Description</b></td>
                <td>${description }</td>
            </tr>
            <tr>
                <td><b>Price</b></td>
                <td>${price }</td>
            </tr>
            </table>
        </jsp:attribute>
    </easy:invokeDemo>
</body>
</html>

  以上代码编写完之后,测试的结果是:

  好啦,以上就是关于JSP的标签文件,谢谢大家。

Servlet和JSP之标签文件学习的更多相关文章

  1. [Servlet&amp;JSP] 标准标签

    在JSP的规范中提供了一些标准标签(Standard Tag),全部的容器都支持这些标签,它能够协助编写JSP时降低Scriptlet的使用. 全部的标准标签都使用jsp:作为前置.这些标准标签是在J ...

  2. Servlet和JSP之自定义标签学习

      此文章会讲述简单标签处理器,因为经典自定义标签处理器没有简单标签处理器方便使用,故在此不进行描述. 参考:慕课网的<JSP自定义标签>视频; <Servlet.JSP和Sprin ...

  3. javaweb学习总结(二十四)——jsp传统标签开发

    一.标签技术的API 1.1.标签技术的API类继承关系 二.标签API简单介绍 2.1.JspTag接口 JspTag接口是所有自定义标签的父接口,它是JSP2.0中新定义的一个标记接口,没有任何属 ...

  4. Servlet和JSP之JSTL学习

    JSTL JSTL就是JSP标准标签库(JavaServer Pages Standard Tag Library, JSTL)是一个定制标签库的集合,用来解决像遍历Map或集合.条件测试.XML处理 ...

  5. 重温JSP学习笔记--JSP动作标签

    上一篇笔记写的是jsp的三个指令九个内置对象,这篇随笔开始写jsp的动作标签,动作标签是由服务器(Tomcat)来解释执行,与java代码一样,都是在服务器端执行的,jsp动作标签有十几多个,这里只写 ...

  6. jsp2.0+中的标签文件,JSP Fragment技术

    刚进新公司不久,今天在看到项目中用到了.tag文件.刚开始我还以为这个是第三方类似freemarker的模板技术.问了下项目组的其他人员,原来这是jsp2.0以来就有的JSP Fragment技术.以 ...

  7. JavaWeb学习之JSP常用标签、EL表达式的运算符、JSTL标签库(6)

    1.JSP常用标签 * 只要支持JSP文件,常用标签有可以直接使用 * 格式: jsp:xxxx * jsp:forward ,完成jsp页面的转发 * page属性:转发的地址 <% requ ...

  8. 1.4(学习笔记)JSP自定义标签

    一.JSP自定义标签 JSP自定义标签,可以通过实现Tag接口.继承TagSupport类来设置标签功能. 后续通过配置文件将标签和具体的实现类关联. 二.自定义第一个标签(实现Tag接口) 自定义标 ...

  9. Servlet和JSP学习总结

    目录 Jsp会被编译成servlet,在页面被第一次访问的时候 Jsp中可以在html页面中嵌入java代码或者引入jsp标签 可以在html中引入自定义标签 Web工程的目录结构 Jsp的注释 Js ...

随机推荐

  1. 关于git被误删除的分支还原问题

    在开发过程中, 有可能会将正在开发的本地分支误删, 本地分支被删除时, 如果已经将本地分支的变更推送到了远端, 还没有问题, 如果被删除的本地分支只提交了没有推送到远端, 就悲剧了, 相当于在你上一次 ...

  2. MPTCP in Wireshark(转)

    最新的wireshark可以直接识别出mptcp. Wireshark is a widely used network analyzer that can capture network traff ...

  3. 08.IdentityServer4登录中心

    08.IdentityServer4登录中心 IdentityServer就是一套Framework,实现了OAuth的授权 理解OAuth流程,学会怎么使用他 http://ruanyifeng.c ...

  4. Oracle中的集合运算

    前言:在实际项目中对多表进行集合运算使用非常广泛,以下是对集合操作的部分总结. 一,建表,插入测试数据 create table a( numbers integer ) create table b ...

  5. CSS3 制作魔方 - 相关立体样式

    最好的实践,就是给定一个实践的目标去实践. 目标:利用 CSS3 的一些特性,绘制一个魔方,要可以玩转的那种,即上下左右每一层都可以独立旋转.效果如下: 为了完成此效果,将使用到以下相关概念和样式:坐 ...

  6. CodeForces 665B 【水-暴力】

    题意(来自网络): 现在有k件商品,每个商品的位置已经告诉你了 现在有n个人,每个人有m个需求,每个需求就是要把第a[i][j]个物品拿到第一个位置来 他的代价是pos[a[i][j]] 问你所有代价 ...

  7. hdu1847(sg函数&yy)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1847 题意:中文题诶- 思路:直接sg函数打表即可,观察打表的结果发现是有规律的,sg函数的值只为0, ...

  8. AttributedString 图片间距问题

    1.NSMutableAttributedString如何显示图片 NSMutableAttributedString *vipStr = [[NSMutableAttributedString al ...

  9. Visual Studio 2015、2013、2012、2010、2008、2005各版本下载+有效密钥激活

    Visual Studio是微软发布的一个集成开发工具,业内一般简称为VS,广泛应用于Windows软件开发.网站开发等,是目前十分流行的windows应用程序的集成开发工具,如果大家不了解,可以简单 ...

  10. 可以提升3倍开发效率的 Intellij IDEA快捷键大全汇总(2019)

    整理了一下IDEA的常用快捷键,可以打印出来或者弄成图片设置为桌面,为广大的程序员们节省更多的时间去谈恋爱. 常用快捷键1 Ctrl+Shift + Enter,语句完成 “!”,否定完成,输入表达式 ...