怎么利用Struts进行分页处理

代码都在这里:https://github.com/MarsOu1998/StrutsWeb
数据库的没有贴上。

0.分页效果以及要求

 我们希望实现这种分页效果,当在首页的时候,不显示上一页;当在尾页的时候,不显示下一页。我们以学生的信息为例,每3个学生为一页。
在这里插入图片描述

1.分页策略

  许多的数据库也提供了分页的功能,比如MySQL的limit子句,Oracal的ROWNUM来限制结果集的大小和起始位置。

策略1:

 把内容全部查询出来在分页

策略2:

 根据需要显示的内容去查询(用多少差多少)

权衡:

 查询难度,数据量

分页公式:

如果(页数 = 记录条数 % 每页条数==0)

页数 = 记录条数 % 每页条数

否则
页数 =( 记录条数 % 每页条数)+1

2.实现

 利用Struts实现分页,一切操作需要交给Action去完成,由Action决定如何实现。

Action要求

 1.这个类是为了显示数据的一部分,所以必须传入一个集合属性:list。返回时可能是list的一部分。

 2.这个类需要根据当前页面的信息来筛选内容,所以要有属性:currentPageIndex。

 3.这个类需要知道是不是最后一页,如果是最后一个,就不需要显示“下一页”,首页同理。

 4.这个类需要知道一页显示多少记录。

 5.这个类需要知道当前页的上一页或者一下页是第几页。(所以这个类需要获取当前页数)

JSP要求

 1.当前页面显示:第几页

 2.页面显示:共几页,共几条记录

 3.页面上显示:1,2,3,4,5…链接,用户可以通过链接达到相应的页

3. 代码

准备工作1——学生信息显示

先编写一个能够显示学生信息的页面:

struts-config.xml:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts-config PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
        "http://struts.apache.org/dtds/struts-config_1_2.dtd">

<struts-config>
    <data-sources/>
    <form-beans>
        <form-bean name="queryForm" type="ActionForm.QueryForm"></form-bean>
    </form-beans>
    <global-exceptions/>
    <global-forwards/>
    <action-mappings>
        <action name="queryForm" path="/query" type="Action.QueryAction"></action>
    </action-mappings>
</struts-config>

QueryAction.java:

	package Action;

import Bean.Student;
import DAO.StudentDAO;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.ArrayList;

public class QueryAction extends Action {
    @Override
    public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
        ArrayList student=new ArrayList();
        StudentDAO studentDAO=new StudentDAO();
        student= studentDAO.getAllStu();
        HttpSession session=request.getSession();
        session.setAttribute("stus",student);
        return new ActionForward("/display.jsp");
    }
}

数据库和JavaBean的代码都是格式化的流程,就不贴出来了。然后只需要在地址栏输入项目路径/query.do就可以显示学生的信息了。

在这里插入图片描述

准备工作2——页面记录条数控制器:PageControllor.java
package Other;

import java.util.ArrayList;

//负责传入一个大的集合,根据页号返回所需要的数据
public class PageControllor {

    private ArrayList bigList;      //大的集合,外界传入
    private int currentPageIndex=1; //当前页号,外界传入
    private int countPerPage=3;      //每页条数,外界可以设定
    private ArrayList smallList;    //小的集合,返回


    public ArrayList getSmallList() {
        return smallList;
    }

    public void setSmallList(ArrayList smallList) {
        this.smallList = smallList;
    }

    public ArrayList getBigList() {
        return bigList;
    }

    public void setBigList(ArrayList bigList) {
        this.bigList = bigList;
    }

    public int getCurrentPageIndex() {
        return currentPageIndex;
    }

    public void setCurrentPageIndex(int currentPageIndex) {
        //每当页面改变,都会调用这个方法
        this.currentPageIndex = currentPageIndex;

        smallList = new ArrayList();
        for (int i = (currentPageIndex-1)*countPerPage; i < currentPageIndex*countPerPage; i++) {
            smallList.add(bigList.get(i));
        }
    }

    public int getCountPerPage() {
        return countPerPage;
    }

    public void setCountPerPage(int countPerPage) {

        this.countPerPage=countPerPage;
    }
}

这个类可以接受当前页面传来的参数,然后返回相应的页数,原理是这样的:

Action告诉页面记录条数控制器这个类,传入需要第几页的参数,这个类的setCurrentPageIndex接收到参数,调用for循环,借助公式,把相应页的记录都放到smallList里面,JSP页面把smallList里面的内容在页面上显示出来。

初步实现

QueryAction.java:

package Action;

import Bean.Student;
import DAO.StudentDAO;
import Other.PageControllor;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import sun.jvm.hotspot.debugger.Page;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.lang.reflect.Array;
import java.util.ArrayList;

public class QueryAction extends Action {
    @Override
    public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {

        PageControllor pc=(PageControllor)request.getAttribute("pc");

        StudentDAO studentDAO=new StudentDAO();

        if(pc==null){
            pc=new PageControllor();
            ArrayList student=new ArrayList();
            student=studentDAO.getAllStu();
            pc.setBigList(student);
            request.setAttribute("pc",pc);
        }

        pc.setCurrentPageIndex(1);

        return new ActionForward("/display.jsp");
    }
}

Action里面先把所有学生的信息都放到大集合bigList里面,再根据需求,页面控制器把需要的内容放到小集合smallList里面,这样就能实现了。通过setCurrentPageIndex的参数,就可以返回需要的页面。

display.jsp的页面需要改一下,因为request里面放的是集合,集合里面还有属性,所以需要把login的iterate里面新增一个property。

display.jsp:

<%--
  Created by IntelliJ IDEA.
  User: air
  Date: 2019-08-15
  Time: 13:30
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-logic" prefix="logic"%>
<html>
<head>
    <title>查询学生信息</title>
</head>
<body>
    显示结果:
<table bgcolor="yellow">
    <tr>
        <td>账号</td>
        <td>姓名</td>
        <td>性别</td>
        <td>年龄</td>
    </tr>
    <logic:present name="pc">
        <logic:iterate id="stu" name="pc" property="smallList">
            <tr>
            <td><bean:write name="stu" property="account"></bean:write></td>
            <td><bean:write name="stu" property="name"></bean:write></td>
            <td><bean:write name="stu" property="sex"></bean:write></td>
            <td><bean:write name="stu" property="age"></bean:write></td>
            </tr>
        </logic:iterate>
    </logic:present>
</table>
</body>
</html>

以第一页为例,每页显示3条记录,如下图:
在这里插入图片描述

那么问题来了,手动输入页数终究是不方便的,回到我们开头讲的点击“上一页”或者“下一页”。

新增首页

在display.jsp页面中表格的下面新增一个链接,叫做”首页“,利用地址栏传参的方式,传一个叫做PageIndex的参数过去,值为1(因为是首页)。

因为第一次启动的时候,传过去的参数可能是null,手动将其设定为1即可。

在Action里面接收到了之后,把该值从字符串转变为数字,然后放到setCurrentPageIndex方法里面,代码如下

display.jsp:

<%--
  Created by IntelliJ IDEA.
  User: air
  Date: 2019-08-15
  Time: 13:30
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-logic" prefix="logic"%>
<html>
<head>
    <title>查询学生信息</title>
</head>
<body>
    显示结果:
<table bgcolor="yellow">
    <tr>
        <td>账号</td>
        <td>姓名</td>
        <td>性别</td>
        <td>年龄</td>
    </tr>
    <logic:present name="pc">
        <logic:iterate id="stu" name="pc" property="smallList">
            <tr>
            <td><bean:write name="stu" property="account"></bean:write></td>
            <td><bean:write name="stu" property="name"></bean:write></td>
            <td><bean:write name="stu" property="sex"></bean:write></td>
            <td><bean:write name="stu" property="age"></bean:write></td>
            </tr>
        </logic:iterate>
    </logic:present>
</table>
    <html:link action="/query.do?PageIndex=1">首页</html:link>
</body>
</html>

QueryAction.java:

package Action;

import Bean.Student;
import DAO.StudentDAO;
import Other.PageControllor;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import sun.jvm.hotspot.debugger.Page;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.lang.reflect.Array;
import java.util.ArrayList;

public class QueryAction extends Action {
    @Override
    public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {

        String pageIndex=request.getParameter("PageIndex");
        if(pageIndex==null){
            pageIndex="1";
        }
        int currentPageIndex=Integer.parseInt(pageIndex);

        PageControllor pc=(PageControllor)request.getAttribute("pc");

        StudentDAO studentDAO=new StudentDAO();

        if(pc==null){
            pc=new PageControllor();
            ArrayList student=new ArrayList();
            student=studentDAO.getAllStu();
            pc.setBigList(student);
            request.setAttribute("pc",pc);
        }

        pc.setCurrentPageIndex(currentPageIndex);

        return new ActionForward("/display.jsp");
    }
}

效果如下:
在这里插入图片描述

当”首页“被按下的时候,参数会被传过去(这水印,醉了。。),Action接收过去转成数字即可。

QueryAction.java:

package Action;

import Bean.Student;
import DAO.StudentDAO;
import Other.PageControllor;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import sun.jvm.hotspot.debugger.Page;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.lang.reflect.Array;
import java.util.ArrayList;

public class QueryAction extends Action {
    @Override
    public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {

        String pageIndex=request.getParameter("PageIndex");
        int currentPageIndex=Integer.parseInt(pageIndex);

        PageControllor pc=(PageControllor)request.getAttribute("pc");

        StudentDAO studentDAO=new StudentDAO();

        if(pc==null){
            pc=new PageControllor();
            ArrayList student=new ArrayList();
            student=studentDAO.getAllStu();
            pc.setBigList(student);
            request.setAttribute("pc",pc);
        }

        pc.setCurrentPageIndex(currentPageIndex);

        return new ActionForward("/display.jsp");
    }
}
新增尾页

尾页和首页的原理差不多,唯一需要注意的是目前还不知道尾页是多少,这个也很简单,只需呀获取全部数据数,除每页需要显示的条数就行了。如果可以整除,那就是二者相除的数字,如果无法整除,那么二者相除的结果再加一就行。

在页面记录条数控制器——PageControllor.java里面新增两个属性:pageCount(页数)、recordCount(记录条数)就行。

全部的集合都放在bigList里面,所以当全部学生信息被查询出来放在bigList里面之后,我们调用bigList.size()就可以轻松的获取全部记录数了,因此在PageControllor.java中的setBigList方法里面把页数计算出来,就可以使用了。

因为要注意下标越界,所以在for循环里面还要注意i<recordCount。

PageControllor.java:

package Other;

import java.util.ArrayList;

//负责传入一个大的集合,根据页号返回所需要的数据
public class PageControllor {

    private ArrayList bigList;      //大的集合,外界传入
    private int currentPageIndex=1; //当前页号,外界传入
    private int countPerPage=3;      //每页条数,外界可以设定
    private ArrayList smallList;    //小的集合,返回
    private int pageCount;
    private int recordCount;

    public ArrayList getSmallList() {
        return smallList;
    }

    public void setSmallList(ArrayList smallList) {
        this.smallList = smallList;
    }

    public ArrayList getBigList() {
        return bigList;
    }

    public void setBigList(ArrayList bigList) {
        this.bigList = bigList;
        recordCount=bigList.size();
        System.out.println(recordCount);
        if(recordCount%countPerPage==0){
            pageCount=recordCount/countPerPage;
            System.out.println(pageCount);
        }
        else {
            pageCount = (recordCount / countPerPage) + 1;
            System.out.println(pageCount);
        }
    }

    public int getCurrentPageIndex() {
        return currentPageIndex;
    }

    public void setCurrentPageIndex(int currentPageIndex) {
        //每当页面改变,都会调用这个方法
        this.currentPageIndex = currentPageIndex;

        smallList = new ArrayList();
        for (int i = (currentPageIndex-1)*countPerPage; i < currentPageIndex*countPerPage&&i<recordCount; i++) {
            smallList.add(bigList.get(i));
        }
    }

    public int getCountPerPage() {
        return countPerPage;
    }

    public void setCountPerPage(int countPerPage) {

        this.countPerPage=countPerPage;
    }

    public int getPageCount() {
        return pageCount;
    }

    public void setPageCount(int pageCount) {
        this.pageCount = pageCount;
    }
}

QueryAction.java:

package Action;

import Bean.Student;
import DAO.StudentDAO;
import Other.PageControllor;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import sun.jvm.hotspot.debugger.Page;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.lang.reflect.Array;
import java.util.ArrayList;

public class QueryAction extends Action {
    @Override
    public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {

        String pageIndex=request.getParameter("PageIndex");
        if(pageIndex==null){
            pageIndex="1";
        }
        int currentPageIndex=Integer.parseInt(pageIndex);

        PageControllor pc=(PageControllor)request.getAttribute("pc");

        StudentDAO studentDAO=new StudentDAO();

        if(pc==null){
            pc=new PageControllor();
            ArrayList student=new ArrayList();
            student=studentDAO.getAllStu();
            pc.setBigList(student);
            request.setAttribute("pc",pc);
        }

        pc.setCurrentPageIndex(currentPageIndex);

        return new ActionForward("/display.jsp");
    }
}

display.jsp:

<%--
  Created by IntelliJ IDEA.
  User: air
  Date: 2019-08-15
  Time: 13:30
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-logic" prefix="logic"%>
<html>
<head>
    <title>查询学生信息</title>
</head>
<body>
    显示结果:
<table bgcolor="yellow">
    <tr>
        <td>账号</td>
        <td>姓名</td>
        <td>性别</td>
        <td>年龄</td>
    </tr>
    <logic:present name="pc">
        <logic:iterate id="stu" name="pc" property="smallList">
            <tr>
            <td><bean:write name="stu" property="account"></bean:write></td>
            <td><bean:write name="stu" property="name"></bean:write></td>
            <td><bean:write name="stu" property="sex"></bean:write></td>
            <td><bean:write name="stu" property="age"></bean:write></td>
            </tr>
        </logic:iterate>
    </logic:present>
</table>
    <html:link action="/query.do?PageIndex=1">首页</html:link>
    <html:link action="/query.do" paramId="PageIndex" paramName="pc" paramProperty="pageCount">尾页</html:link>
</body>
</html>

效果演示
在这里插入图片描述

新增上一页、下一页

“上一页”和“下一页”的功能比较简单,只需要在当前页面——currentPageIndex-1,或者currentPageIndex+1就可以了。

需要注意的问题是,如果当前页面是第一个,则不显示上一页;若当前页面是最后一页,则不显示下一页。

所以在PageControllor.java里面新增两个布尔类型的私有成员——first,last。在display.jsp里面利用logic的equal标签判断当前是否是第一页。若为first为false,则不是第一页,last同理,代码如下。

PageControllor.java:

package Other;

import java.util.ArrayList;

//负责传入一个大的集合,根据页号返回所需要的数据
public class PageControllor {

    private ArrayList bigList;      //大的集合,外界传入
    private int currentPageIndex=1; //当前页号,外界传入
    private int countPerPage=3;      //每页条数,外界可以设定
    private ArrayList smallList;    //小的集合,返回
    private int pageCount;
    private int recordCount;
    private int prePageIndex;
    private int nextPageIndex;
    private boolean first;
    private boolean last;

    public ArrayList getSmallList() {
        return smallList;
    }

    public void setSmallList(ArrayList smallList) {
        this.smallList = smallList;
    }

    public ArrayList getBigList() {
        return bigList;
    }

    public void setBigList(ArrayList bigList) {
        this.bigList = bigList;
        recordCount=bigList.size();
        System.out.println(recordCount);
        if(recordCount%countPerPage==0){
            pageCount=recordCount/countPerPage;
            System.out.println(pageCount);
        }
        else {
            pageCount = (recordCount / countPerPage) + 1;
            System.out.println(pageCount);
        }
    }

    public int getCurrentPageIndex() {
        return currentPageIndex;
    }

    public void setCurrentPageIndex(int currentPageIndex) {
        //每当页面改变,都会调用这个方法
        this.currentPageIndex = currentPageIndex;
        this.prePageIndex=currentPageIndex-1;
        this.nextPageIndex=currentPageIndex+1;
        if(currentPageIndex==1){
            first=true;
        }
        else
            first=false;
        if(currentPageIndex==pageCount){
            last=true;
        }
        else
        {
            last=false;
        }
        smallList = new ArrayList();
        for (int i = (currentPageIndex-1)*countPerPage; i < currentPageIndex*countPerPage&&i<recordCount; i++) {
            smallList.add(bigList.get(i));
        }
    }

    public int getCountPerPage() {
        return countPerPage;
    }

    public void setCountPerPage(int countPerPage) {

        this.countPerPage=countPerPage;
    }

    public int getPageCount() {
        return pageCount;
    }

    public void setPageCount(int pageCount) {
        this.pageCount = pageCount;
    }

    public int getPrePageIndex() {
        return prePageIndex;
    }

    public void setPrePageIndex(int prePageIndex) {
        this.prePageIndex = prePageIndex;
    }

    public int getNextPageIndex() {
        return nextPageIndex;
    }

    public void setNextPageIndex(int nextPageIndex) {
        this.nextPageIndex = nextPageIndex;
    }

    public boolean isLast() {
        return last;
    }

    public void setLast(boolean last) {
        this.last = last;
    }

    public boolean isFirst() {
        return first;
    }

    public void setFirst(boolean first) {
        this.first = first;
    }
}

display.jsp:

<%--
  Created by IntelliJ IDEA.
  User: air
  Date: 2019-08-15
  Time: 13:30
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-logic" prefix="logic"%>
<html>
<head>
    <title>查询学生信息</title>
</head>
<body>
    显示结果:
<table bgcolor="yellow">
    <tr>
        <td>账号</td>
        <td>姓名</td>
        <td>性别</td>
        <td>年龄</td>
    </tr>
    <logic:present name="pc">
        <logic:iterate id="stu" name="pc" property="smallList">
            <tr>
            <td><bean:write name="stu" property="account"></bean:write></td>
            <td><bean:write name="stu" property="name"></bean:write></td>
            <td><bean:write name="stu" property="sex"></bean:write></td>
            <td><bean:write name="stu" property="age"></bean:write></td>
            </tr>
        </logic:iterate>
    </logic:present>
</table>
    <html:link action="/query.do?PageIndex=1">首页</html:link>
    <logic:equal value="false" name="pc" property="first">
    <html:link action="/query.do" paramId="PageIndex" paramName="pc" paramProperty="prePageIndex">上一页</html:link>
    </logic:equal>
    <logic:equal value="false" name="pc" property="last">
    <html:link action="/query.do" paramId="PageIndex" paramName="pc" paramProperty="nextPageIndex">下一页</html:link>
    </logic:equal>
    <html:link action="/query.do" paramId="PageIndex" paramName="pc" paramProperty="pageCount">尾页</html:link>
</body>
</html>

演示:
在这里插入图片描述

4 小结

利用Struts进行分页,其中用到了许多Struts标签、与Action进行数据交互,整块的代码分区比较明显,逻辑也比较清晰。PageControllor作为核心组件起到了功不可没的作用,而这个组件既不是Action,也不是ActionForm,而是我们根据实际需求编写的,说明了Struts框架的灵活性和极高的自由度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值