JSP 标签文件

定制JSP标签可以实现一些JSTL和EL没有提供的功能,基本步骤就是编写标签处理器然后注册标签。从JSP2.0以后,可以直接编写标签文件(.tag)来代替定制JSP标签。

相比定制JSP标签,标签文件无需编写Java代码,无需注册标签,只需要在tag文件中写代码逻辑即可。

一个简单的例子:

在WEB-INF下创建tags文件夹,然后在里面新建一个firstTag.tag文件:

1
2
3
4
5
6
<%@tag import="java.util.Date"%>
<%@tag import="java.text.SimpleDateFormat"%>
<%
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
out.print(sdf.format(new Date()));
%>

然后在firstTagTest.jsp页面中使用它:

1
2
<%@ taglib prefix="mt" tagdir="/WEB-INF/tags"%>
Today is:<mt:firstTag/>

部署到Tomcat中,启动服务,访问该jsp,页面显示:

outputImagefileId58e623fcab6441770f003177.png

That’ all.

标签文件中的隐式对象:

对象类型
requestjavax.servlet.http.HttpServletRequest
responsejavax.servlet.http.HttpServletResponse
outjavax.servlet.jsp.JspWriter
sessionjavax.servlet.http.HttpSession
applicationjavax.servlet.ServletContext
configjavax.servlet.ServletConfig
jspContextjavax.servlet.jsp.JspContext

和Jsp的隐式对象类似。

标签文件指令

tag指令

tag指令常用属性:

属性描述
display-name通过XML工具显示的简称,默认为标签名
body-content标签主体内容的信息,可以为empty,tagdependent或scriptless(默认)
import导入Java类型
pageEncoding指定编码
isELIgnoreds是否使用EL表达式

include指令

该指令可以引入静态文件(HTML文件)或动态文件(另一个标签文件)。

如有静态HTML文件included.html:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<table border=1>
<tbody>
<tr>
<td style="text-align: center;"><strong>object</strong></td>
<td style="text-align: center;"><strong>type</strong></td>
</tr>
<tr>
<td>request</td>
<td>javax.servlet.http.HttpServletRequest</td>
</tr>
<tr>
<td>response</td>
<td>javax.servlet.http.HttpServletResponse</td>
</tr>
<tr>
<td>out</td>
<td>javax.servlet.jsp.JspWriter</td>
</tr>
<tr>
<td>session</td>
<td>javax.servlet.http.HttpSession</td>
</tr>
<tr>
<td>application</td>
<td>javax.servlet.ServletContext</td>
</tr>
<tr>
<td>config</td>
<td>javax.servlet.ServletConfig</td>
</tr>
<tr>
<td>jspContext</td>
<td>javax.servlet.jsp.JspContext</td>
</tr>
</tbody>
</table>

included.tag文件:

1
2
3
4
<%@tag pageEncoding="utf-8" %>
<%
out.print("和Jsp的隐式对象类似。");
%>

在include.tag标签中引用included.html和included.tag:

1
2
3
4
<%@tag pageEncoding="utf-8"%>
标签文件中的隐式对象:</br></br>
<%@include file="/WEB-INF/tags/included.html"%></br>
<%@include file="/WEB-INF/tags/included.tag"%>

在jsp页面中测试:

1
2
3
<%@taglib prefix="mt" tagdir="/WEB-INF/tags" %>
<%@page pageEncoding="utf-8" %>
<mt:include/>

启动访问,页面显示:

12953061-file_1487995461665_125ce.png

taglib指令

该指令的作用就是在一个标签文件中使用另外一个标签,如现有taglibDemo.tag:

1
2
<%@ taglib prefix="mt" tagdir="/WEB-INF/tags" %>
Today's date : <mt:firstTag/>

该标签调用了第一个例子中创建的firstTag标签。

attribute指令

该指令在标签中使用属性,attribute常用的属性有:

属性描述
name属性名
required是否式必须的,默认为false
type    类型,默认为String
编写一个时间格式化标签formatDate.tag:

1
2
3
4
5
6
7
<%@tag import="java.util.Date"%>
<%@tag import="java.text.SimpleDateFormat"%>
<%@ attribute name="fmt" required="true"%>
<%
SimpleDateFormat sdf = new SimpleDateFormat(fmt);
out.print(sdf.format(new Date()));
%>

jsp中测试:

1
2
3
<%@ taglib prefix="mt" tagdir="/WEB-INF/tags" %>
<mt:dateFormat fmt="yyyy-MM-dd HH:mm:ss"/></br>
<mt:dateFormat fmt="yyyyMMdd"/>

页面显示:

17067936-file_1487995485314_d54.png

variable指令

用于定义标签文件的变量,常用的属性有:

属性描述
name-given变量名
scope范围
description描述
如下标签,它有两个变量:longDate和shortDate:

1
2
3
4
5
6
7
8
9
10
11
12
<%@tag import="java.text.SimpleDateFormat"%>
<%@tag import="java.util.Date"%>
<%@ variable name-given="longDate" %>
<%@ variable name-given="shortDate" %>
<%
Date date = new Date();
SimpleDateFormat longFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
SimpleDateFormat shortFormat = new SimpleDateFormat("yyyy-MM-dd");
jspContext.setAttribute("longDate", longFormat.format(date));
jspContext.setAttribute("shortDate", shortFormat.format(date));
%>
<jsp:doBody/>

jsp页面引用:

1
2
3
4
5
6
7
8
<%@ taglib prefix="tags" tagdir="/WEB-INF/tags" %>
Today's date:
<br/>
<tags:varDemo>
In long format: ${longDate}
<br/>
In short format: ${shortDate}
</tags:varDemo>

测试,页面显示:

71683354-file_1487995510634_89ad.png

请作者喝瓶肥宅水🥤

0