为什么需要自定义标签
在开发项目过程中,我们经常有这样的体会:同一个控件我们可能多处使用,同时我们需要在基础的样式上加上自己的样式和操作的js代码;遇到这种情况,如果每个地方都copy代码的话那么,后期如果要做修改,那么维护的工作量是巨大的。基于这种情况,我们可以考虑使用自定义标签,实现代码的复用,易维护。
JSP自定义标签,实质上就是以标记的形式封装了一个俱有独立功能的Java类。标记的使用减少了直接嵌入JSP页面的Java代码,方便了页面的布局,并且有利于代码的复用,提高了开发的效率。
原理介绍
- JSP服务器解析标记的过程:
当一个用户访问一个JSP页面时,这个请求被发送到JSP服务器,JSP服务器会根据这个请求去调用相应的页面,如果这个页面中有自定义的标记, JSP服务就会根据页面指令<%@ taglib>去访问TLD得到处理程序的相关信息,接着调用该处理程序的构造器方法,启动标记符处理程序,并读取标记符的属性和相应值。 - TLD文件
TLD(TLD:Tag Library Descriptor标记库描述符)文件,标准的XML格式的标记定义文件,被用来存放标记符的信息。 - Taglib 指令
<%@ taglib uri=”URIToTagLibrary” prefix=”tagPrefix” %>
<% @ taglib %>指令声明此JSP文件使用了自定义的标记,同时引用标记库,也指定了他们的标记的前缀。必须在使用自定义标记之前使用<% @ taglib %>指令。
属性:
uri=”URIToTagLibrary” :Uniform Resource Identifier (URI)根据标记的前缀对自定义的标记进行唯一的命名,URI可以是一个相对或绝对的路径。
prefix=”tagPrefix”:在自定义标记之前的前缀。
举例代码
PageUtil.java代码
package com.util;
import java.util.List;
public class PageUtil<T> {
// 以下4个属性必须指定
private List<T> records; // 分页数据
private int totalRecord; // 总记录数
private int pageNo; // 当前页码,第几页
private int pageSize; // 每页显示的记录数,每页显示多少条数据
private int totalPage; // 总页数
private int startIndex; // 开始索引
private int endIndex; // 结束索引
private int indexCount = 10;// 显示的索引数目,如:10的话, 则显示1-10, 2-11
// public Pagination() {}
public PageUtil(List<T> records,int totalRecord,int pageNo, int pageSize) {
this.records = records;
this.totalRecord = totalRecord;
this.pageNo = pageNo;
this.pageSize = pageSize;
// 根据总记录数和每页显示数计算总页数(totalRecord+pageSize->totalPage)
totalPage = this.totalRecord / this.pageSize;
totalPage = (this.totalRecord % pageSize == 0) ? totalPage: (totalPage + 1);
// 计算显示索引数目
if (indexCount > totalPage) {
indexCount = totalPage;
}
// 根据索引数目,当前页,总页数计算开始索引和结束索引(indexCount+pageNo+totalPage->startIndex+endIndex)
startIndex = indexCount / 2;
startIndex = pageNo- (indexCount % 2 == 0 ? (startIndex - 1) : startIndex);
endIndex = pageNo + indexCount / 2;
// 1 <= startIndex < pageNo < endIndex <= totalPage
// startIndex = pageNo - indexCount/2
// endIndex = pageNo + indexCount/2
if (startIndex < 1) {
startIndex = 1;
if (totalPage >= indexCount) {
endIndex = indexCount;
} else {
endIndex = totalPage;
}
}
if (endIndex > totalPage) {
endIndex = totalPage;
if (endIndex > indexCount) {
startIndex = endIndex - indexCount + 1;
} else {
startIndex = 1;
}
}
}
/**
* 获取分页数据
*
* @return
*/
public List<T> getRecords() {
return records;
}
/**
* 获取总记录数
*
* @return
*/
public int getTotalRecord() {
return totalRecord;
}
/**
* 当前页数(第几页)
*
* @return
*/
public int getPageNo() {
return pageNo;
}
/**
* 每页显示数据记录数
*
* @return
*/
public int getPageSize() {
return pageSize;
}
/**
* 总页数
*
* @return
*/
public int getTotalPage() {
return totalPage;
}
/**
* 起始索引
*
*