第3章 —————— Tag文件与Tag标记

Tag文件是扩展名为.tag的文本文件,包含HTML标记、特殊指令和Java代码,用于代码复用。Tag文件需保存在WEB-INF/tags目录或其子目录中,且需指定正确编码。JSP页面通过Tag标记调用Tag文件,先用taglib指令引入标记库。Tag标记的运行原理涉及Tomcat服务器的编译和执行过程。Tag文件中的指令如attribute和variable用于传递和处理数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


目录

         3.1 Tag文件的结构

         3.2 Tag标记

3.2.1 Tag标记与Tag文件

3.2.2 Tag标记的使用

3.2.3 Tag标记的运行原理

3.3 Tag文件中的常用指令

3.3.1 Tag标记

3.3.2 include指令

3.3.3 attribute指令

3.3.4 variable指令 

3.3.5 Taglib指令标记

总结


3.1 Tag文件的结构

3.1.1 Tag文件的结构

    所谓Tag文件就是该文件的扩展名为.tag的文本文件。一个基本的Tag文件中包括:HTML标记符、某些特殊的标记指令、成员变量声明和方法的定义、JAVA程序片和JAVA表达式。

    创建一个负责计算100以内所有奇数代数和的Tag文件:

<%@tag pageEncoding="GB2312" %>
<p>这是一个Tag文件,负责计算1~100内的奇数之和</p>
<%
    int sum=0,
            i=1;
    for (i=1;i<=100;i++)
    {
        if(i%2==1){
        sum=sum+i;
    }
    }
    out.println(sum);

%>

3.1.2  Tag文件的保存

(1)Tag文件所在目录

    Tag文件可以实现代码的复用,也就是说Tag文件可以被许多JSP页面使用。所以需要将Tag文件放到Tomcat服务器指定的目录中,即如果某个Web服务目录下的JSP页面准备调用一个Tag文件,那么必须在该Web服务目录下,建立如下的目录结构:

Web服务目录\WEB-INF\tags

例如:

ch3\WEB-INF\tags

注:WEB-INF和tags都是固定的目录名称,而tags下的子目录的名称可由用户给定。

    一个Tag文件必须保存到tags目录或其下的子目录中。例如上图中的tag文件被保存在:

ch3\WEB-INF\tags

(2)Tag文件的编码

    保存Tag文件时按照Tag文件指定的编码保存,例如Tag文件使用tag指令:

<%@page pageEncoding = "utf-8"%>

指定的编码是UTF-8,因此需要按照UTF-8编码保存Tag文件。

3.2 Tag标记

3.2.1 Tag标记与Tag文件

    某个Web服务目录下的Tag文件只能由该Web服务目录中的JSP页面调用,JSP页面必须通过Tag标记来调用一个Tag文件。

    Tag标记的名字和Tag文件的名字一致,即当我们编写了一个Tag文件并保存到特定目录后,也就给出了一个Tag标记,该标记格式为:

<Tag - - 文件的名字 - - />

<Tag - - 文件的名字 - - >  内容  </Tag 文件的名字>

    一个Tag文件对应着一个Tag标记,把全体Tag标记称之为一个自定义标记库或简称为标记库。

3.2.2 Tag标记的使用

    一个JSP页面通过使用Tag标记来调用一个Tag文件。Web服务目录下的一个JSP页面在使用Tag标记来调用一个Tag文件之前,必须首先使用taglib指令标记引入该Web服务目录下的标记库,只有这样JSP页面才可以使用Tag标记调用相应的Tag文件。

    taglib指令的格式如下:

<%@ taglib tagdir = "标记库的位置" prefix = “前缀”%>

    例如:

<%@ taglib tagdir = "/WEB-INF/tags" prefix = “computer” %>

    引入标记库后,JSP页面就可以使用带前缀的Tag标记调用相应的Tag文件,其中的前缀由<taglib>指令中的prefix属性指定。例如JSP使用如下Tag标记调用相应的Tag文件:

<computer:oddNumberSum/>

注:JSP页面使用Tag标记时,冒号:的左右不要有空格。

例:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib tagdir ="/WEB-INF/tags/lib1" prefix="computer"%>
<html>
<body>
<h1>调用Tag文件计算100內的奇数和:</h1>
<computer:addSum /> <%-- 使用Tag标记 --%>
</body>
</html>

输出结果:

3.2.3 Tag标记的运行原理

  • 如果该Tag标记对应的Tag文件是首次被JSP页面调用,那么Tomcat服务器会将Tag文件转译成一个Java文件,并编译这个Java文件生成字节码文件,然后执行这个字节码文件。
  • 如果该Tag文件已经被转编译为字节码文件,Tomcat服务器将直接执行这个字节码文件。
  • 如果对Tag文件进行了修改,那么Tomcat服务器会重新将Tag文件转译成一个Java文件,并编译这个Java文件生成字节码文件,然后执行这个字节码文件。

3.3 Tag文件中的常用指令

    与JSP文件类似,Tag文件中也有一些常用指令,这些指令将影响Tag文件的行为。Tag文件中经常使用的指令有tag、taglib、include、attribute、variable。

3.3.1 Tag标记

编写了一个Tag文件会对应生成一个Tag标记,Tag标记的格式为:

<Tag 文件名字/>

<Tag 文件名字>

         标记体

</Tag 文件名字>

    当JSP页面希望向Tag文件传递相应的信息时,可以使用标记体来传递,在Tag文件中通过<jsp:doBody/>来调用标记体。

    一个Tag文件对应一个Tag标记,那么该目录下有若干个Tag文件就行成了一个库,在JSP页面要调用Tag文件,就要通过taglib指令来引入相应目录下的一个标记库,只有这样JSP页面才能调用相应的Tag文件并动态执行该Tag文件。

<%@taglib prefix="前缀" tagdir="自定义标记库的位置"%>

注意:使用前缀可以区别不同标记库下相同名字的标记文件。

    如:调用/WEB-INF/tags/math/random.tag文件就可以在JSP页面中这样写:

<%@taglib prefix="math" tagdir="/WEB-INF/tags/math/"%>来引入标记库

之后可以<math:random/>或者<math:random>标记体</math:random>来调用了并执行相应tag文件。

3.3.2 include指令

    在Tag文件中也有和JSP文件类似的include指令标记,其使用方法和作用与JSP文件中的include指令标记类似。

3.3.3 attribute指令

    Tag文件充当着代码复用的角色,如果能像include动作一样向Tag文件传递数据,这会让Tag文件的功能更加强大,这当然是可以的,在Tag文件中有attribute指令,其语法格式如下:

<%attribute name="对象名字" required="true"|"false" type="对象的类型"%>

    attribute指令中name属性是必须的,该属性是引用一个对象的名字.required为true时必须给其传值,为false时可以传可以不传,type为该对象的类型,默认为java.lang.String类型,可以改为其他类型,但要注意的是,必须对象类型必须带有包名,如不能简写为type="Integer"必须是type="java.lang.Integer"

注:在Tag文件中不可以再定义和attribute指令中name属性指定的对象具有相同名字的变量,否则将隐藏attribute指令中的对象,使其失效(可以通过观察源码发现,attribute中的变量其实在Tag文件中一个成员变量)

下面是使用attribute指令的一个例子计算三角形面积的例子:

JSP页面:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib tagdir="/WEB-INF/tags/lib3" prefix="getTrangleArea" %>
<html>
<head>
    <title>triangle</title>
</head>
<body bgcolor="#6495ed">
<p style="font-family: 宋体;font-size: 36px;color: crimson">
<%--------use tag signal---------%>
    <getTrangleArea:triangle sideA="15" sideB="16" sideC="20"/>
</p>
</body>
</html>

Tag页面:

<%@ tag pageEncoding="UTF-8" %>
<%@ attribute name="sideA" required="true" %>
<%@ attribute name="sideB" required="true" %>
<%@ attribute name="sideC" required="true" %>
<%!
    public String getArea(double A,double B,double C){
        if(A+B>C&&A+C>B&&B+C>A){
            double p = (A+B+C)/2.0;
            double area = Math.sqrt(p*(p-A)*(p-B)*(p-C));
            String result = String.format("%.2f",area);
            return "<br>trangle area:"+result;
        }
        else{
            return "error";
        }
    }
%>
<%
out.println("<br> sides:"+sideA+"-"+sideB+"-"+sideC);
double a = Double.parseDouble(sideA);
    double b = Double.parseDouble(sideB);
    double c = Double.parseDouble(sideC);
    out.println(getArea(a,b,c));
%>

输出结果:

3.3.4 variable指令 

    Tag文件通过使用attribute指令JSP页面可以向Tag文件传递数据.在某些Web设计中,不仅需要向其传递数据,还需要他返回某些数据进行特殊处理.比如多个JSP页面需要Tag文件处理一些数据,但是不需要显示,因为每个JSP页面需要特殊的显示,这时候就可以使用variable指令,variable指令语法格式如下:

<%variable name-given="对象名字" variable-class="对象类型" scope="有效范围"%>

name-given:用来指定对象的名字,要符合命名规则

variable-class:指定的类型,注意需要打全包名,不能进行简写

scope中有三个属性值:

                AT_BEGIN,在使用JSP页面标记的时候就可以使用该对象

                NESTED,只能在标记体中使用该对象

                AT_END,只能在标记体结束后使用该对象

    Tag通过jspContext.setAttribute("对象的名字",对象的引用);把对象名字和对象引用存储到内置对象 jspContext中,JSP页面才能使用该对象。

3.3.5 Taglib指令标记

    taglib指令格式如下:

<%@ taglib tagdir = "自定义标记库的位置" prefix = "前缀"%>

    一个Tag文件也可以使用多个taglib指令标记引入若干个标记库,例如:

<%@ taglib tagdir = "自定义标记库的位置1" prefix = "自定义前缀1"%>

<%@ taglib tagdir = "自定义标记库的位置2" prefix = "自定义前缀2"%>

总结:

    以上为Tag指令标记的用法介绍。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值