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


目录

         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指令标记的用法介绍。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值