Tag文件和Tag标记


目录

1.为什么要使用Tag文件

2.Tag文件的结构

3.Tag文件的存储目录

4.Tag标记

5.Tag文件中常用的指令

1)tag指令

2)attribute指令

3)variable指令

4)taglib指令

5)include指令

6.Tag文件的嵌套


1.为什么要使用Tag文件

1) 在Web应用中许多JSP页面都有相同的信息,如都需要相同的导航栏和尾页等。如果能把相同的信息都形成一种特殊的文件,而且各个JSP页面都可以使用这种特殊的文件,那么就能实现代码的复用,维护性就比较好了

2)实现代码复用还有另外两种方式,include指令和include动作,那就来说说他们的不足吧,首先不论是include指令还是include动作处理的都是单一 的JSP文件,用户可以通过输入地址栏的方式来访问响应的JSP文件,这时候用户访问的JSP文件可能只是一个导航栏,这不是设计者希望看到的.include指令的耦合性太大,include动作虽然耦合性较小但是能放在Web服务目录的任意子目录中,不仅显的杂乱无章,还不利于管理和维护.

3)使用tag文件就能很好的解决这一缺点,tag文件不仅能实现动态加载实现代码复用,还不能让用户直接访问,tag文件放在指定 的目录下,维护起来会比较方便(很多时候会让tag文件去处理数据,而JSP页面只是去显示数据,实现数据显示和数据处理分离,这样就比较便于维护了)


2.Tag文件的结构

Tag文件是扩展名为.tag的文件,其实与JSP文件差不多.在Tag文件中可以使用HTML标签,可以使用java脚本以及JSP动作和指令,还可以使用某些特殊的指令(后面会讲)


3.Tag文件的存储目录

Tag文件必须存在/WEB-INF/tags 文件夹下(不然会报错),存放目录如下图所示:


4.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文件了


5.Tag文件中常用的指令

1)tag指令

1.body-content属性

body-content属性的值有empty、tagdependent、scriptless,其默认值是scriptless

empty:当body-content属性的属性值为empty时,JSP页面中必须使用没有标记体的tag标记,<Tag 文件名字>

tagdependent:当body-content属性的属性值为tagdepentdent时,JSP页面通过标记体传来的信息全部按纯文本处理

scriptless:当body-content属性的属性值为scriptless时,标记体中不能使用Java程序块,可以使用文本,EL表达式,一个自定义标记,一个动作

2.language属性

其属性值只支持java

3.import属性

引入java核心类包,可以在Tag文件中使用某些类,跟导包没什么区别就不说了

4.pageEncoding属性

Tag文件的编码属性,其默认值是ISO-8859-1

2)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 language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib prefix="kai" tagdir="/WEB-INF/tags/geng" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><base href="<%=basePath%>"><title>My JSP 'MyJsp.jsp' starting page</title><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0">    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"><!--<link rel="stylesheet" type="text/css" href="styles.css">--></head><body><form action="" method="post">边长A: <input type="text" value="" name="a"><br>边长B: <input type="text" value="" name="b"><br>边长C: <input type="text" value="" name="c"><br><input type="submit" value="Enter"></form><br><%if((request.getParameter("a")!=null && request.getParameter("a")!="")&& (request.getParameter("b")!=null && request.getParameter("b")!="")&& (request.getParameter("c")!=null && request.getParameter("c")!="") ){%><kai:Addsum a="<%=Double.valueOf(request.getParameter(\"a\"))%>" b="<%=Double.valueOf(request.getParameter(\"b\"))%>" c="<%=Double.valueOf(request.getParameter(\"c\"))%>"></kai:Addsum><%}%></body>
</html>

tag文件:

<%@tag import="java.text.DecimalFormat"%>
<%@tag pageEncoding="UTF-8" body-content="scriptless"%>
<%@attribute name="a" required="false" type="java.lang.Double"%>
<%@attribute name="b" required="false" type="java.lang.Double"%>
<%@attribute name="c" required="false" type="java.lang.Double"%>
<html><head></head><body>以下是调用Tag文件的效果:<br>这是一个Tag文件,负责计算三角形的面积.<br>JSP页面传递过来的三条边:<%=a%>,<%=b%>,<%=c%><br><%DecimalFormat format = new DecimalFormat("0.00");if(a+b>c && a+c>b && b+c>a){double p = (a+b+c)/2;out.print("三角形的面积: "+format.format(Math.sqrt(p*(p-a)*(p-b)*(p-c))));}else{out.print("<br>"+a+" "+b+" "+c+" 不能构成三边");}%></body>
</html>

3)variable指令

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

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

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

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

scope中有三个属性值:

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

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

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

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

4)taglib指令

和JSP页面一样,Tag文件中也可以使用taglib指令来调用其他的tag文件,操作一样

5)include指令

其用法与JSP页面中的include指令差不多,这里就不说了


6.Tag文件的嵌套

在使用Tag标记时,可以带有标记体,标记体还可以是一个Tag标记,这就实现了Tag标记的嵌套


转载请注明出处

Tag文件和Tag标记的用法详解相关推荐

  1. scp 保留文件属组_SCP命令用法详解-hdparm工具参数详解-改变文件组命令chgrp和改变文件属主命令chown_169IT.COM...

    scp命令跟cp命令类似,只不过cp命令是在同一台机器上用的,scp是在两台机器上复制传输数据的命令.scp实质相当于利用SSH协议来传输数据的cp命令. 用法举例: 1.复制远程服务器的文件到本地: ...

  2. python引用文件 mode写在后面还是前面,python3 文件操作常用mode参数用法详解

    python3:常用mode参数 t 文本模式 (默认). #假设我们有一个本地文件名为:demo.text,文件编码格式为:utf-8 #文件内容为:python工程狮 f = open('demo ...

  3. C++文件类(文件流类)及用法详解

    <C++输入输出流>一章中讲过,重定向后的 cin 和 cout 可分别用于读取文件中的数据和向文件中写入数据.除此之外,C++ 标准库中还专门提供了 3 个类用于实现文件操作,它们统称为 ...

  4. Gorm之Tag标签用法详解

    目录 Gorm之Tag标签用法详解 1.Tag标签 1.1CURD权限标签 1.2字段标签 1.3关联标签 2.主键标签 2.1默认主键 2.2自定义主键 Gorm之Tag标签用法详解 1.Tag标签 ...

  5. JSP实用教程-第三章Tag文件与Tag标记

    目录 3.1 Tag文件 3.1.1Tag文件的结构 3.1.2Tag文件的保存 3.2 Tag标记 3.2.1 Tag文件和Tag标记 3.2.2 Tag标记的使用 3.2.3 Tag标记的运行原理 ...

  6. Tag文件与Tag标记

    目录: 1.Tag文件 2.Tag标记 3.Tag文件中的常用指令 1.1Tag文件的结构 Tag文件 的拓展名为.Tag的文本文件,其结构与JSP文件类似.一个Tag文件可以有普通的HTML标记符. ...

  7. java 生成dump_java dump文件怎么生成和分析-JMAP用法详解

    jmap是java自带的工具 1. 查看整个JVM内存状态 jmap -heap [pid] 2. 查看JVM堆中对象详细占用情况 jmap -histo [pid] 3. 导出整个JVM 中内存信息 ...

  8. fileinput 时间_JavaScript_Bootstrap Fileinput文件上传组件用法详解,最近时间空余,总结了一些关...

    最近时间空余,总结了一些关于bootstrap fileinput组件的一些常见用法,特此分享到phpstudy平台,供大家参考,同时也方便以后的查找.本文写的不好还请见谅. 一.效果展示 1.原始的 ...

  9. python读取json格式文件大量数据,以及python字典和列表嵌套用法详解

    1.Python读取JSON报错:JSONDecodeError:Extra data:line 2 column 1 错误原因: JSON数据中数据存在多行,在读取数据时,不能够单单用open(), ...

最新文章

  1. PCM复用设备和PDH设备的区别介绍
  2. javascript-字典形态对象与数组形态对象
  3. instr和substr函数
  4. mysql hy000 死锁_mysql 数据库死锁-解决
  5. Java的数据类型转换
  6. WireGuard 的使用与配置详解
  7. 用Far制作chm的简易教程
  8. 简单聊聊Long Short Term Memory Network (LSTM)和 Gated Recurrent Unit (GRU)两种强大的RNN变体
  9. 8. SpringBoot基础学习笔记
  10. Springboot3.0整合swagger,废弃Springfox改用Springdoc
  11. ae输出quicktime设置_详解AE输出设置及解析原因
  12. 数模混合监控,视频如何联动报警、消防、门禁?
  13. 使用python读取网络视频流或者本地视频进行RTMP流的生成,并对视频源的每一帧做剪切处理
  14. 变革中的思索之重读《孙子兵法》
  15. PHP SDK for sinaweibo
  16. tomcat原理简要分析,java
  17. 04DeepLab-01论文背景、研究成果及意义
  18. Java实现(直接)插入排序
  19. 南邮Android Studio应用高德地图API获取SHA1码
  20. 通过CE认证的企业如何获取国家补贴?建材欧盟CE认证补贴申请?

热门文章

  1. 做软件测试工程师如何突破月薪20k?
  2. 【2023秋招】9月京东校招题目
  3. 【HDU 6656】Kejin Player
  4. python之函数深析
  5. matlab查看俯视图,关于matlab:校准图像以获取位于同一平面上的点的俯视图
  6. PowerPC的嵌入式Linux培训大纲
  7. linux中grep -E参数,linux中grep命令
  8. Google AppSheet: 无需编程构建零代码应用
  9. C语言程序编译过程 2
  10. ios 旋转屏幕试图切换_iOS屏幕旋转及其基本适配方法