Index.java
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;
public class Index extends TagSupport {
/**
* 请求的URL
*/
private String serverUrl;
/**
* 当前页开始记录位置
*/
private String start;
/**
* 数据每页个数
*/
private String pageSize;
/**
* 总记录数
*/
private String total;
public void setServerUrl(String serverUrl) {
this.serverUrl = serverUrl;
}
public void setStart(String start) {
this.start = start;
}
public void setPageSize(String pageSize) {
this.pageSize = pageSize;
}
public void setTotal(String total) {
this.total = total;
}
@SuppressWarnings("static-access")
@Override
public int doStartTag() throws JspException {
JspWriter out = pageContext.getOut();
StringBuffer sb = new StringBuffer();
sb.append("<span>总数:" + total + "</span> ");
sb.append("<a href=" + serverUrl + "&pageSize=" + pageSize + "&start=1>首页</a>");
sb.append(" ");
sb.append("<a href=" + serverUrl + "&pageSize=" + pageSize + "&start=" + getPreviousPageIndex() + ">上一页</a>");
sb.append(" ");
sb.append("<a href=" + serverUrl + "&pageSize=" + pageSize + "&start=" + getNextPageIndex() + ">下一页</a>");
sb.append(" ");
sb.append("<a href=" + serverUrl + "&pageSize=" + pageSize + "&start=" + getPageCount() + ">末页</a>");
sb.append(" ");
sb.append("<span>" + start + " / " + getPageCount() + "</span>");
try {
out.write(sb.toString());
} catch (IOException e) {
e.printStackTrace();
}
return super.SKIP_BODY;
}
private long getPageCount(){
long count = Long.parseLong(total);
int size = Integer.parseInt(pageSize);
long pageCount = count / size;
if(count % size != 0 || count == 0){
pageCount++;
}
return pageCount;
}
private long getPreviousPageIndex(){
long index = Long.parseLong(start);
index--;
if(index < 1){
index = 1;
}
return index;
}
private long getNextPageIndex(){
long index = Long.parseLong(start);
long pageCount = getPageCount();
index++;
if(index > pageCount){
index = pageCount;
}
return index;
}
}
tld.xml自定义标签描述文件
--修改tag-class为真实包路径
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd"> <taglib> <tlib-version>1.0</tlib-version> <jsp-version>2.0</jsp-version> <short-name>page</short-name> <uri>/tags/page</uri> <tag> <name>index</name> <!-- 修改成完整限定名--> <tag-class>xxx.Index</tag-class> <body-content>JSP</body-content> <attribute> <name>serverUrl</name> <required>true</required> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <name>start</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>pageSize</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>total</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag> </taglib>
Jsp调用
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib prefix="page" uri="/tags/page"%> <html> <body> <% pageContext.setAttribute("start", 1); pageContext.setAttribute("pageSize", 10); pageContext.setAttribute("total", 1); %> <page:index serverUrl="?test=1" pageSize="${pageSize}" total="${total}" start="${start}"></page:index> </body> </html>
le.li
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)