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) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return this.EVAL_PAGE;
}
}
- PageResultServlet 类 ,实现和数据库交互, 取出每页的内容,通过request.setAttribute(“results”, 结果集合);
request.setAttribute(“page”, 分页对象); 传入值