JSP自定义标签
简介
自定义标签是用户定义的JSP语言元素。当JSP页面包含一个自定义标签时将被转化为servlet,标签转化为对被 称为tag handler的对象的操作,即当servlet执行时Web container调用那些操作。 JSP标签扩展可以让你创建新的标签并且可以直接插入到一个JSP页面。 JSP 2.0规范中引入Simple Tag Handlers来编写这些自定义标记。 你可以继承SimpleTagSupport类并重写的doTag()方法来开发一个最简单的自定义标签。 更多信息
实现过程
通过JSP页面的<%@taglib%> 指令 找到服务器对应的 .tld 文件
<%@ taglib uri=”/WEB-INF/mytag.tld” prefix=”tag”%><%@ taglib uri=”http://testTag/myTag” prefix=”tag”%>
通过.tld文件找到对应的实现类
该类如果是单标签(如:<br>)继承SimpleTagSupport,有内容有属性的标签(如:<span style='color:red'>span标签</span>)继承BodyTagSupport
单标签带属性的实现 TagSupport
.tld代码片段
<?xml version="1.0" encoding="UTF-8"?>
<taglib xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee"
version="2.1">
<description>myFirstTag
</description>
<display-name>testTag
</display-name>
<tlib-version>1.0
</tlib-version>
<short-name>Tag
</short-name>
<uri>http://testTag/myTag
</uri>//这行表示在JSP可以通过
<%@ taglib uri="http://testTag/myTag" prefix="tag"%> 导入标签库 ,没有这行 可通过
<%@ taglib uri="/WEB-INF/mytag.tld" prefix="tag"%>导入
<tag>
//单标签 tag.helloTag 类继承SimpleTagSuppo
<name>hello
</name>
<tag-class>tag.HelloTag
</tag-class>
<body-content>empty
</body-content>
</tag>
//单标签且带属性 tag.AddTag 类继承TagSupport
<tag>
<name>add
</name>
<tag-class>tag.AddTag
</tag-class>
<body-content>empty
</body-content>
<attribute>
<name>num1
</name>
<required>true
</required>
<rtexprvalue>true
</rtexprvalue>
</attribute>
<attribute>
<name>num2
</name>
<required>true
</required>
<rtexprvalue>true
</rtexprvalue>
</attribute>
</tag>
//闭合标签且带属性 tag.ColorTag类 实现BodyTagSupport
<tag>
<name>color
</name>
<tag-class>tag.ColorTag
</tag-class>
<body-content>jsp
</body-content>
<attribute>
<name>size
</name>
<required>true
</required>
<rtexprvalue>true
</rtexprvalue>
</attribute>
<attribute>
<name>color
</name>
<required>true
</required>
<rtexprvalue>true
</rtexprvalue>
</attribute>
</tag>
</taglib>
代码解释 <body-content>empty</body-content> empty 代表是单标签 <body-content>jsp</body-content> 闭合标签 <rtexprvalue>true</rtexprvalue> 支持EL表达式
使用 <tag:hello /> <tag:add num2="${n }" num1="47" /> <tag:color color="blue" size="28" >大家好~~~</tag:color> 这里省略类的实现。
例子:自定义标签实现分页
JSP 代码
...
<%@ taglib uri="http://testTag/page" prefix="p"%> //必须要用taglib标签导入
这里省略n行代码
<body>
当前页${pi.pagenum }
<table border="1" width="700">
<tr>
<td>编号
</td>
<td>学号
</td>
<td>科目号
</td>
<td>成绩
</td>
<td>考试时间
</td>
</tr>
<c:forEach var="r" items="${results }">
<tr>
<td>${r.id }
</td>
<td>${r.studentno }
</td>
<td>${r.subjectid }
</td>
<td>${r.score }
</td>
<td>${r.examdate }
</td>
</tr>
</c:forEach>
</table>
//重点在这
//要实现分页必须有两个参数, 一个是要请求的 Servlet ,一个是page对象
<p:page servletName="PageResultServlet" pageInfo="${page }"/>
</body>
</html>
设置 .tld 文件
<?xml version="1.0" encoding="UTF-8"?>
<taglib xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee" version="2.1">
<description>myPageTag
</description>
<display-name>pageTag
</display-name>
<tlib-version>1.0
</tlib-version>
<short-name>page
</short-name>
<uri>http://testTag/page
</uri>
<tag>
<name>page
</name>
<tag-class>com.test.tag.PageTag
</tag-class>
<body-content>empty
</body-content>
<attribute>
<name>pageInfo
</name>
<required>true
</required>
<rtexprvalue>true
</rtexprvalue>
</attribute>
<attribute>
<name>servletName
</name>
<required>true
</required>
<rtexprvalue>true
</rtexprvalue>
</attribute>
</tag>
</taglib>
自定义page对象实现
import java.io.IOException;
import javax.servlet.jsp.JspContext;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;
import com.test.entity.PageInfo;
public class PageTag extends TagSupport {
private String servletName;
private PageInfo pageInfo;
public String
getServletName() {
return servletName;
}
public void setServletName(String servletName) {
this.servletName = servletName;
}
public PageInfo
getPageInfo() {
return pageInfo;
}
public void setPageInfo(PageInfo pageInfo) {
this.pageInfo = pageInfo;
}
@Override
public int doStartTag()
throws JspException {
JspContext jc =
this.pageContext;
JspWriter out = jc.getOut();
try {
out.print(
"<form action='" + servletName +
"' method='post'>");
out.print(
"<a href='" + servletName +
"?page=1'>首页</a> ");
out.print(
"<a href='" + servletName +
"?page="
+ (pageInfo.getPagenum() -
1) +
"'>上一页</a> ");
for (
int i =
1; i <= pageInfo.getTotalpage(); i++) {
if (Math.abs(i - pageInfo.getPagenum()) >
3
&& Math.abs(i - pageInfo.getPagenum()) <=
6) {
out.print(
".");
}
else if (Math.abs(i - pageInfo.getPagenum()) <=
3) {
out.print(
"<a href='" + servletName +
"?page=" + i +
"'>"
+ i +
"</a> ");
}
}
out.print(
"<a href='" + servletName +
"?page="
+ (pageInfo.getPagenum() +
1) +
"'>下一页</a> ");
out.print(
"<a href='" + servletName +
"?page="
+ pageInfo.getTotalpage() +
"'>末页</a> ");
out.print(
"前进至第<input name='page' size='2' />页 ");
out.print(
"<input type='submit' value='GO' /> ");
out.print(
"总共" + pageInfo.getTotalcount() +
"条、每页"
+ pageInfo.getPerpage() +
"条,总共" + pageInfo.getTotalpage()
+
"页,当前第" + pageInfo.getPagenum() +
"页");
out.print(
"</form>");
}
catch (IOException e) {
e.printStackTrace();
}
return this.EVAL_PAGE;
}
}
PageResultServlet 类 ,实现和数据库交互, 取出每页的内容,通过request.setAttribute(“results”, 结果集合); request.setAttribute(“page”, 分页对象); 传入值