首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java Web 分頁顯示完整實現:DAO/Service/Controller/JSP 四層架構詳解

     編輯:Java 綜合教學

Java Web 分頁顯示完整實現:DAO/Service/Controller/JSP 四層架構詳解

基於「表示層-控制層-DAO層-數據庫」經典分層架構,實現通用分頁查詢功能。歡迎指正優化建議。

核心設計思路

  1. DAO 層提供分頁查詢方法:總記錄數統計 + 指定頁數據查詢
  2. Controller 調用 DAO,將分頁數據與頁碼信息放入 Request 域
  3. JSP 使用 EL + JSTL 渲染數據表格與分頁導航

關鍵技術點

  • 總頁數計算:totalPages = (totalRecords + pageSize - 1) / pageSize
  • 分頁 SQL:MySQL LIMIT offset, pageSize,offset = (pageNo - 1) * pageSize

完整代碼實現

1. 數據庫工具類 JDBCUtils

public class JDBCUtils {
    private static final String URL = "jdbc:mysql://localhost:3306/book";
    private static final String USER = "root";
    private static final String PASS = "1234";

    public Connection getConnection() throws SQLException {
        return DriverManager.getConnection(URL, USER, PASS);
    }

    public void close(Connection conn, PreparedStatement ps, ResultSet rs) {
        closeQuietly(rs);
        closeQuietly(ps);
        closeQuietly(conn);
    }
    // closeQuietly 省略...
}

2. DAO 層 UserDao

public class UserDao {
    private static final int PAGE_SIZE = 5;
    private JDBCUtils jdbc = new JDBCUtils();

    // 總頁數
    public int getTotalPages() {
        String sql = "SELECT COUNT(*) FROM books";
        try (Connection conn = jdbc.getConnection();
             PreparedStatement ps = conn.prepareStatement(sql);
             ResultSet rs = ps.executeQuery()) {
            if (rs.next()) {
                int total = rs.getInt(1);
                return (total + PAGE_SIZE - 1) / PAGE_SIZE;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return 0;
    }

    // 分頁查詢
    public List<User> listByPage(int pageNo) {
        List<User> list = new ArrayList<>();
        String sql = "SELECT * FROM books ORDER BY id LIMIT ?, ?";
        int offset = (pageNo - 1) * PAGE_SIZE;
        
        try (Connection conn = jdbc.getConnection();
             PreparedStatement ps = conn.prepareStatement(sql)) {
            ps.setInt(1, offset);
            ps.setInt(2, PAGE_SIZE);
            try (ResultSet rs = ps.executeQuery()) {
                while (rs.next()) {
                    User u = new User();
                    u.setId(rs.getInt("id"));
                    u.setName(rs.getString("name"));
                    u.setNumber(rs.getString("number"));
                    list.add(u);
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return list;
    }
}

3. 實體類 User

public class User {
    private int id;
    private String name;
    private String number;
    // Getter/Setter 省略...
}

4. Controller ListUserServlet

@WebServlet("/ListUser")
public class ListUserServlet extends HttpServlet {
    private UserDao userDao = new UserDao();

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
            throws ServletException, IOException {
        int pageNo = 1;
        String param = req.getParameter("pageNos");
        if (param != null) pageNo = Integer.parseInt(param);

        List<User> list = userDao.listByPage(pageNo);
        int totalPages = userDao.getTotalPages();

        req.setAttribute("listss", list);
        req.setAttribute("recordCount", totalPages);
        req.setAttribute("pageNos", pageNo);
        req.getRequestDispatcher("userlist.jsp").forward(req, resp);
    }
}

5. JSP 視圖 userlist.jsp

<%@ taglib prefix="c" uri="https://java.sun.com/jsp/jstl/core" %>
<table align="center" border="1" cellpadding="5">
    <tr><th>書號</th><th>書名</th><th>庫存量</th></tr>
    <c:forEach items="${listss}" var="book">
        <tr>
            <td>${book.id}</td>
            <td>${book.name}</td>
            <td>${book.number}</td>
        </tr>
    </c:forEach>
</table>

<c:if test="${pageNos > 1}">
    <a href="ListUser?pageNos=1">首頁</a>
    <a href="ListUser?pageNos=${pageNos-1}">上一頁</a>
</c:if>
<c:if test="${pageNos < recordCount}">
    <a href="ListUser?pageNos=${pageNos+1}">下一頁</a>
    <a href="ListUser?pageNos=${recordCount}">末頁</a>
</c:if>

<form action="ListUser" method="get">
    共 ${recordCount} 頁
    <input type="text" name="pageNos" value="${pageNos}" size="3"> 頁
    <input type="submit" value="跳轉">
</form>

6. 運行效果

分頁效果圖

改進建議

  • 引入連接池(Druid/HikariCP)替代單連接
  • Service 層解耦事務與業務邏輯
  • 分頁參數校驗(防止越界、注入)
  • 採用 PageHelper 等成熟分頁插件
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved