自己封装一个前端分页工具,用的时候直接调用jsp自定义标签就可以。
1.写一个class分页类,继承自定义标签库类SimpleTagSupport,
2.自定义一个标签库(需要导入jstl包)
3.自定义标签与class类绑定
5.调用
1.首先来写一个java分页类的思路流程,之后再加上前端内容。
PageTage.class
public class PageTag {
public static void main(String[] args) {
//分页,显示部分页数
Integer nowPage = 15;//当前页数
Integer allPage = 20;//总页数
Integer offset = 2;//偏移量
Integer startpage = nowPage-offset<=1?1:nowPage-offset;//起始页数判断
Integer endPage = nowPage+offset>=allPage?allPage:nowPage+offset;//结束页数判断
if(nowPage-offset>1){
System.out.print("1...");
}
for(int i = startpage;i<=endPage;i++){
if(i == nowPage){
System.out.print(" "+"["+i+"]");
}else{
System.out.print(" "+i);
}
}
if(nowPage+offset<allPage){
System.out.print("..."+allPage);
}
}
}
运行结果:1... 13 14 [15] 16 17...20
只显示包括自身的5个页面。超过这个范围就用(1...)和(...20)代替
所有只循环显示5个数即可。指定页数的前2个数和后2个数,所以偏移量为2。
如果选的是第一页,就判断当前页数减去偏移量是否小于等于1。等于就设置statpage=1。不等于就是当前页数减去偏移量。
最后一页也是同理。
PageTage加上前端,继承自定义标签库
public class pageTag extends SimpleTagSupport{
private Integer nowPage = null;
private Integer allPage = null;
private Integer offset = 2;
//跳转的页面
private String href;
@Override
public void doTag() throws JspException, IOException {
JspContext context = getJspContext();
JspWriter out = context.getOut();
Integer startPage = nowPage-offset<=1 ? 1 : nowPage-offset;
Integer endPage = nowPage+offset>=allPage ? allPage : nowPage+offset;
if(nowPage-offset>1) out.print("<a href='"+href+"?wantPage=1'>1</a> ... ");
for (int i = startPage; i <= endPage; i++) {
if(i==nowPage) {
out.print(" <a href='"+href+"?wantPage="+i+"'>[" + i + "]</a> ");
} else {
out.print(" <a href='"+href+"?wantPage="+i+"'>" + i + "</a> ");
}
}
if(nowPage+offset<allPage) out.print(" ... <a href='"+href+"?wantPage="+countPage+"'>" + allPage + "</a>");
}
public void setNowPage(Integer nowPage) {
this.nowPage = nowPage;
}
public void setCountPage(Integer countPage) {
this.countPage = countPage;
}
public void setOffset(Integer offset) {
this.offset = offset;
}
public void setHref(String href) {
this.href = href;
}
}
继承SimpleTagSupport类后需要重新doTag,
获得自定义标签库里面的封装好的输出流
JspContext context = getJspContext();
JspWriter out = context.getOut();
然后将之前的代码放到里面
set属性的方法,(调用tag的时候传参)
out.print输出的时候再加上html标签即可。
2.自定义标签库
在WEB-INF下面创建一个file文件。后缀为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 http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
version="2.1">
<description>my tag library</description>
<display-name>my Tag</display-name>
<tlib-version>1.0</tlib-version>
<short-name>my</short-name>
<uri>http://com.mypage.action/tags</uri>
</taglib>
自定义标签模板。
<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 http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
version="2.1">
这是声明,可以直接搬过来。
description声明自定义
display-name自定义
short-name自定义
uri 在jsp页面时需要引入。也可以自定义
在加入tage标签
<tag>
<description>
页面分页组件
</description>
<name>pageTag</name>
<tag-class>com.woniu.mytage.pageTag</tag-class>
<body-content>empty</body-content>
<attribute>
<description>
当前页码
</description>
<name>nowPage</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<description>
总页码
</description>
<name>allPage</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<description>
偏移量
</description>
<name>offset</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<description>
请求路径
</description>
<name>href</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
tag 里面的 name 是自己定义标签的名字
tag-class 完整类路径
body-content 元素取值:
empty:表示没有标签体
JSP:表示标签体可以包含JSP代码
scriptless:表示标签体可以包含EL表达式和JSP动作元素,但不能包含JSP的脚本元素
tagdependent:表示标签体交由标签本身去解析处理。即在标签体中所写的任何代码都会原封不动地传给标签处理器
我这里填的empty,这个标签直接用就行
attribute是先class类里面定义好的参数
required表示参数是为必须的。false是可以选参数
rtexprvalue表示
runtime expression value:能不能使用el表达式
3.定义好后在jsp页面引入然后调用
调用:
<my:pageTag href="index.action" nowPage="${ page.nowPage }" offset="2" allPage="${ page.allPage }"/>
效果:
数据库页数比较少,所以效果可能有点。。。还需要改改