Servlet和JSP之标签文件学习
在上一篇文章中介绍了自定义标签的用法,接下来介绍标签文件的用法啦。
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("<"); }else if(c=='>'){ encodedTag.append(">"); }else if(c=='&'){ encodedTag.append("&"); }else if(c=='"'){ encodedTag.append("&qout"); }else if(c==' '){ encodedTag.append(" "); }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之标签文件学习的更多相关文章
- [Servlet&JSP] 标准标签
在JSP的规范中提供了一些标准标签(Standard Tag),全部的容器都支持这些标签,它能够协助编写JSP时降低Scriptlet的使用. 全部的标准标签都使用jsp:作为前置.这些标准标签是在J ...
- Servlet和JSP之自定义标签学习
此文章会讲述简单标签处理器,因为经典自定义标签处理器没有简单标签处理器方便使用,故在此不进行描述. 参考:慕课网的<JSP自定义标签>视频; <Servlet.JSP和Sprin ...
- javaweb学习总结(二十四)——jsp传统标签开发
一.标签技术的API 1.1.标签技术的API类继承关系 二.标签API简单介绍 2.1.JspTag接口 JspTag接口是所有自定义标签的父接口,它是JSP2.0中新定义的一个标记接口,没有任何属 ...
- Servlet和JSP之JSTL学习
JSTL JSTL就是JSP标准标签库(JavaServer Pages Standard Tag Library, JSTL)是一个定制标签库的集合,用来解决像遍历Map或集合.条件测试.XML处理 ...
- 重温JSP学习笔记--JSP动作标签
上一篇笔记写的是jsp的三个指令九个内置对象,这篇随笔开始写jsp的动作标签,动作标签是由服务器(Tomcat)来解释执行,与java代码一样,都是在服务器端执行的,jsp动作标签有十几多个,这里只写 ...
- jsp2.0+中的标签文件,JSP Fragment技术
刚进新公司不久,今天在看到项目中用到了.tag文件.刚开始我还以为这个是第三方类似freemarker的模板技术.问了下项目组的其他人员,原来这是jsp2.0以来就有的JSP Fragment技术.以 ...
- JavaWeb学习之JSP常用标签、EL表达式的运算符、JSTL标签库(6)
1.JSP常用标签 * 只要支持JSP文件,常用标签有可以直接使用 * 格式: jsp:xxxx * jsp:forward ,完成jsp页面的转发 * page属性:转发的地址 <% requ ...
- 1.4(学习笔记)JSP自定义标签
一.JSP自定义标签 JSP自定义标签,可以通过实现Tag接口.继承TagSupport类来设置标签功能. 后续通过配置文件将标签和具体的实现类关联. 二.自定义第一个标签(实现Tag接口) 自定义标 ...
- Servlet和JSP学习总结
目录 Jsp会被编译成servlet,在页面被第一次访问的时候 Jsp中可以在html页面中嵌入java代码或者引入jsp标签 可以在html中引入自定义标签 Web工程的目录结构 Jsp的注释 Js ...
随机推荐
- Linux : Linux命令
接触linux一段时间了,在网上搜罗了一些命令,以备后用.我有点爱上Linux了. 来自 :http://www.php100.com/html/webkaifa/Linux/2009/1106/34 ...
- 【217】◀▶ IDL 控制语句说明
参考:Statements Routines —— 控制语句关键字 01 FOR 循环语句. 02 FOREACH 循环语句. 03 WHILE...DO 循环语句. 04 IF... ...
- URAL 1996 Cipher Message 3
题目 神题. 记得当初DYF和HZA讲过一个FFT+KMP的题目,一直觉得很神,从来没去做. 没有真正理解FFT的卷积. 首先考虑暴力. 只考虑前7位 KMP 找出所有 B 串可以匹配 A 串的位置. ...
- linux中消息队列<一>
1 概念 (1)链表式结构组织,存放于内核. (2)通过队列标识来引用. (3)通过一个消息类型来索引指定的数据 2 创建消息队列 #include <sys/msg.h> int msg ...
- TypeScript完全解读(26课时)_3.TypeScript完全解读-Symbol
ts中symbol的支持是按照es6的标准来的,只要我们学会es6中的symbol,就可以直接在ts中使用了 创建symbol 在example文件夹下新建symbol.ts 然后在根目录的index ...
- AWS AutoScaling的一个ScaleDown策略问题以及解决方法
此文已由作者袁欢授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 1. AWS AutoScaling简介 AutoScaling是AWS的一个重要服务,用来弹性的自动创建(S ...
- Chrome开发者工具 debug 调试
Chrome 的开发者工具分为 8 个大模块,每个模块及其主要功能为: Element 标签页: 用于查看和编辑当前页面中的 HTML 和 CSS 元素. Network 标签页:用于查看 HTTP ...
- iOS图标去掉阴影和反光
在ios开发时, 程序的图标会被apple进行美化, 自动圆角, 加上阴影和反光效果: 如果有时候不想要阴影和反光,可以这样做: 在Info.plist中 添加一个Icon already inclu ...
- swipe轮播插件零基础实用
此篇博客整理了常用的轮播效果,适用于所有开发人员 swipe是当下相对而言较好用的轮播插件,下面是博主整理的demo源代码,可直接上手(备注:需自己手动swipe所需的j和css) 此段代码总共是有三 ...
- 搭建hustoj现场环境
所需:就用了台普通电脑作为web以及数据库端,两台数据库实验室提供的服务器拿来做评测机. 根据提示将三台都装上hustoj 当然我是用之前比赛遗留下来的judge { 可以用以下来代替 wget ht ...