MVC模式下用Servlet和jsp分頁的HelloWord

MVC模式下分頁:
馬克-to-win:像淘寶百度這樣的類似網(wǎng)頁,我們用了很多很多。基本上就是輸入查詢條件以后,符合查詢條件的結(jié)果可能會成千上萬。我們不能一下子把所有這些結(jié)果都列出來,只能一次顯示一頁。當用戶按下一頁的時候,才會把下一頁的內(nèi)容列出來。這樣不至于內(nèi)存崩潰。要達到這樣的效果,要用到分頁技術(shù)。分頁技術(shù)的核心思想就是把所有的結(jié)果放在一個ArrayList的當中(在我們的例子當中就是ArrayList ret)。馬克-to-win:這個ArrayList連同相關(guān)參數(shù)比如一共有多少行(totalNumberOfRowsInDB),每頁有多少行(pageSize),當前顯示是第幾頁(currentPageNumber),一共有多少頁(totalNumberOfPages),都放在Session當中。馬克-to -win:返回到jsp后,再從Session當中取出所有這些數(shù)據(jù),把它顯示出來。注意這里數(shù)據(jù)庫的每行數(shù)據(jù)都對應一個RegisterRow實例。把所有這些實例都放在ArrayList當中。如果你覺得全部把結(jié)果放在Session當中浪費空間的話,你甚至一次只放5頁,當用戶訪問第5頁的時候,你就再一次訪問數(shù)據(jù)庫,把數(shù)據(jù)放在Session當中。算法由你自己定義,據(jù)情況而定。當然,為簡單起見,我們的例子是把所有符合條件的數(shù)據(jù)都給取出來。



例1.3.1:


home.jsp:

<%@ page contentType="text/html; charset=GBK" %>
<html>
<form method="post" action="MarkToWinServlet">
每頁    <input type="text" name="pagesize" value="2">條
第    <input type="text" name="pageno" value="3">頁
查id小于    <input type="text" name="id" value="8">
    <input type="submit" name="Submit" value="Submit">
</form>
<hr>
既然這是首頁,像淘寶首頁一樣,這底下是首頁的一些泛泛信息。
</html>





package com;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ServletHello1 extends HttpServlet {
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        request.setCharacterEncoding("GBK");
        String pageno = request.getParameter("pageno");
        String pagesize = request.getParameter("pagesize");
        String id = request.getParameter("id");
        MyBean mb = new MyBean();
        try {
            mb.getData(pageno, pagesize, id);
        } catch (Exception e) {
            e.printStackTrace();
        }
        request.getSession().setAttribute("myBean", mb);
        response.sendRedirect("show.jsp");
    }

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }
}



MyBean.java:

package com;
import java.sql.*;
import java.util.ArrayList;
public class MyBean {
    /* 下面一大堆變量,jsp中都需要取到,所以是類變量, 非局部 */
    private int totalNumberOfRowsInDB; // 數(shù)據(jù)表中總共存儲了多少行
    private int pageSize;
    private int currentPageNumber;
    private int totalNumberOfPages;
    private int id;
    private ArrayList ret;

    public void getData(String curpage, String pagesizeS, String idS)
            throws Exception {
        Connection con;
        /*
         * MysqlConnectionPoolDataSource ds is always in the memory once it is
         * created becasue it is static..
         */
        con = DatabaseConn.getConnection();
        if (curpage == null) {
            currentPageNumber = 1; // 如果“PAGE”為NULL時將當前頁面設置為1
        } else {
            currentPageNumber = Integer.parseInt(curpage);
            if (currentPageNumber < 1) { // 如果當前頁小于1,將當前頁設置為1
                currentPageNumber = 1;
            }
        }
        id = Integer.parseInt(idS);
        pageSize = Integer.parseInt(pagesizeS);

        int i = 0;
        ret = new ArrayList();
        Statement stm = null;
        ResultSet rs = null;

        stm = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
                ResultSet.CONCUR_UPDATABLE);
        String sql = "select * from register where id<" + id;
        rs = stm.executeQuery(sql);
        rs.last();
        totalNumberOfRowsInDB = rs.getRow();
        totalNumberOfPages = (totalNumberOfRowsInDB + pageSize - 1) / pageSize;
        if (currentPageNumber > totalNumberOfPages)
            currentPageNumber = totalNumberOfPages;
        rs.absolute((currentPageNumber - 1) * pageSize + 1);
        while (i < pageSize && !rs.isAfterLast()) {
            RegisterRow rr = new RegisterRow();
            rr.setId(rs.getInt(1));
            rr.setName(rs.getString(2));
            rr.setAge(rs.getInt(3));
            ret.add(rr);
            rs.next();
            i++;
        }
        stm.close();
        con.close();
    }   
    public int getCurrentPageNumber() {
        return currentPageNumber;
    }
    public void setCurrentPageNumber(int currentPageNumber) {
        this.currentPageNumber = currentPageNumber;
    }
    public int getTotalNumberOfRowsInDB() {
        return totalNumberOfRowsInDB;
    }
    public int getPageSize() {
        return pageSize;
    }
    public int getTotalNumberOfPages() {
        return totalNumberOfPages;
    }
    public int getId() {
        return id;
    }
    public ArrayList getRet() {
        return ret;
    }
}





show.jsp:

<%@ page contentType="text/html; charset=GBK" import="java.sql.*"%>
<%@ page import="com.*,java.util.*"%>
<html>
<head>
<title>分頁</title>
</head>
<body>
    <center>
        <%
            int totalNumberOfRowsInDB = 0;//數(shù)據(jù)庫總共多少條記錄the total number of the rows in the DB.
            int totalnumberOfPages = 0;//總共多少頁the total number of the pages
            int currentpagenumber = 0;//當前是第幾頁currentpagenumber means current page.
            int i = 0;
            int id = 0;
            int pageSize = 0;
            MyBean myBean = ((MyBean) session.getAttribute("myBean"));
            if (myBean != null) {
                currentpagenumber = myBean.getCurrentPageNumber();
                id = myBean.getId();
                totalnumberOfPages = myBean.getTotalNumberOfPages();//計算出總的頁數(shù)
                pageSize = myBean.getPageSize();
            }
        %>



        <form method="post" action="MarkToWinServlet">
            <br> 第<%=currentpagenumber%>頁 共<%=totalnumberOfPages%>頁
            <%
                if (currentpagenumber < totalnumberOfPages) {//如果當前頁小于總頁數(shù)
            %>
            <a
                href="MarkToWinServlet?pageno=<%=currentpagenumber + 1%>&pagesize=<%=pageSize%>&id=<%=id%>">下一頁< /a>
            <%
                }
            %>
            <%
                if (currentpagenumber > 1)//如果當前頁大于1
                {
            %>
            <a
                href="MarkToWinServlet?pageno=<%=currentpagenumber - 1%>&pagesize=<%=pageSize%>&id=<%=id%>">上一頁< /a>
            <%
                }
            %>
            第<input type="text" name="pageno" value="<%=currentpagenumber%>">頁,
            id小于<input name="id" value="<%=id%>">,每頁共<input name="pagesize"
                value="<%=pageSize%>">條 <br> <input type="submit"
                name="Submit" value="Submit">
        </form>
像淘寶的搜尋一樣,結(jié)果就顯示在下面:
<hr>
        <table border="1">
            <tr>
                <td>ID</td>
                <td>名字</td>
                <td>年齡</td>
            </tr>
            <%
                if (totalnumberOfPages > 0) {
                    ArrayList ret = (ArrayList) myBean.getRet();
                    Iterator it = ret.iterator();
                    while (it.hasNext()) {
                        RegisterRow temp = (RegisterRow) it.next();
                        out.println("<TR>");
                        out.println("<td>" + temp.getId() + "</td>");
                        out.println("<td>" + temp.getName() + "</td>");
                        out.println("<td>" + temp.getAge() + "</td>");
                        out.println("</tr>");
                    }
                }
            %>
        </table>
        <br>
    </center>
</body>
</html>




RegisterRow.java:

package com;
public class RegisterRow {
    int id;
    String name;
    int age;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}