Tag文件和Tag标记的用法详解
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标记的用法详解相关推荐
- scp 保留文件属组_SCP命令用法详解-hdparm工具参数详解-改变文件组命令chgrp和改变文件属主命令chown_169IT.COM...
scp命令跟cp命令类似,只不过cp命令是在同一台机器上用的,scp是在两台机器上复制传输数据的命令.scp实质相当于利用SSH协议来传输数据的cp命令. 用法举例: 1.复制远程服务器的文件到本地: ...
- python引用文件 mode写在后面还是前面,python3 文件操作常用mode参数用法详解
python3:常用mode参数 t 文本模式 (默认). #假设我们有一个本地文件名为:demo.text,文件编码格式为:utf-8 #文件内容为:python工程狮 f = open('demo ...
- C++文件类(文件流类)及用法详解
<C++输入输出流>一章中讲过,重定向后的 cin 和 cout 可分别用于读取文件中的数据和向文件中写入数据.除此之外,C++ 标准库中还专门提供了 3 个类用于实现文件操作,它们统称为 ...
- Gorm之Tag标签用法详解
目录 Gorm之Tag标签用法详解 1.Tag标签 1.1CURD权限标签 1.2字段标签 1.3关联标签 2.主键标签 2.1默认主键 2.2自定义主键 Gorm之Tag标签用法详解 1.Tag标签 ...
- 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标记的运行原理 ...
- Tag文件与Tag标记
目录: 1.Tag文件 2.Tag标记 3.Tag文件中的常用指令 1.1Tag文件的结构 Tag文件 的拓展名为.Tag的文本文件,其结构与JSP文件类似.一个Tag文件可以有普通的HTML标记符. ...
- java 生成dump_java dump文件怎么生成和分析-JMAP用法详解
jmap是java自带的工具 1. 查看整个JVM内存状态 jmap -heap [pid] 2. 查看JVM堆中对象详细占用情况 jmap -histo [pid] 3. 导出整个JVM 中内存信息 ...
- fileinput 时间_JavaScript_Bootstrap Fileinput文件上传组件用法详解,最近时间空余,总结了一些关...
最近时间空余,总结了一些关于bootstrap fileinput组件的一些常见用法,特此分享到phpstudy平台,供大家参考,同时也方便以后的查找.本文写的不好还请见谅. 一.效果展示 1.原始的 ...
- python读取json格式文件大量数据,以及python字典和列表嵌套用法详解
1.Python读取JSON报错:JSONDecodeError:Extra data:line 2 column 1 错误原因: JSON数据中数据存在多行,在读取数据时,不能够单单用open(), ...
最新文章
- PCM复用设备和PDH设备的区别介绍
- javascript-字典形态对象与数组形态对象
- instr和substr函数
- mysql hy000 死锁_mysql 数据库死锁-解决
- Java的数据类型转换
- WireGuard 的使用与配置详解
- 用Far制作chm的简易教程
- 简单聊聊Long Short Term Memory Network (LSTM)和 Gated Recurrent Unit (GRU)两种强大的RNN变体
- 8. SpringBoot基础学习笔记
- Springboot3.0整合swagger,废弃Springfox改用Springdoc
- ae输出quicktime设置_详解AE输出设置及解析原因
- 数模混合监控,视频如何联动报警、消防、门禁?
- 使用python读取网络视频流或者本地视频进行RTMP流的生成,并对视频源的每一帧做剪切处理
- 变革中的思索之重读《孙子兵法》
- PHP SDK for sinaweibo
- tomcat原理简要分析,java
- 04DeepLab-01论文背景、研究成果及意义
- Java实现(直接)插入排序
- 南邮Android Studio应用高德地图API获取SHA1码
- 通过CE认证的企业如何获取国家补贴?建材欧盟CE认证补贴申请?