分頁查詢Demo

前言

因爲學了框架之後,前面知識,也是快忘記差不多了,我覺得框架這些東西你用來用去,還是用的別人的,你說你一直使用框架帶來的便捷,但是你只會使用框架,我感覺不能造出自己的框架,因爲程序員寫原生的寫多了,這些人覺得麻煩纔會去寫個框架用,避免重複造輪子,重複造輪子的意思是:重複造輪子就是指別人都已經寫好了,有現成的可以用,不過那些框架的思想還是可取的,精髓。一直使用別人的框架,我感覺自己會做不出框架給別人用

我在這篇文章表達我的看法

編程這個東西,都是慢慢來的,一步一個腳印走踏實,嗶哩嗶哩上面一些大up主,我看了很多,然後基本都說jsp不用學了,有人跟我說直接學springboot的也有,是這個外面微服務很火,這是事實,但是你的基礎沒打好,我覺得走都沒學會,難道還跑啊,當然這裏只是表達我得個人看法,不會不可怕,可怕得是你不會還不知道去學,這纔是最可怕得,人最大得敵人是自己,本人也是好多從網上學習的資源,我希望能共同進步

效果圖

在這裏插入圖片描述

分頁

爲什麼要分頁,一個頁面就那麼大,如果你的數據有一千條一萬條,用戶是不是得一直往下翻,翻到什麼時候去,對不對,分頁這個場景在項目開發中用得還是比較多得,分頁還有個好處是,減輕服務器的開銷

創建數據庫
數據庫 採用mysql 5.7
在這裏插入圖片描述
打開你的cmd 或者sqlYog,或者Navicat,至於IDEA直接在裏面操作就可以了,eclipse我忘記了,反正都是工具,記起來再說,-u代表 username 用戶名,-p passowrd 密碼
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
如果你懶得寫,把sql複製,粘貼,運行,我怕小白,所以我還是去演示下吧😀,我還是挺喜歡小白的,本人也不是什麼大佬啊,我只是喜歡記錄自己的學習歷程,當某然一天還能看見自己在博客上寫的代碼,😂,哈哈哈,這篇文章可能有點長

-- 創建一個分頁案列得數據庫
create database pagingcase;
use  pagingcase;
-- 創建一個用戶的表 id 主鍵自增長,姓名 不爲空,性別,年齡,地址,郵箱
-- varchar 一個漢字佔兩個字符。英文和數字佔一個字符,int最大長度是11位在mysql中
create table user(
     id int primary key auto_increment,
     name varchar(20) not null,
   	 sex varchar(5),
     age int,
     address varchar(32),
     email varchar(50)
);
-- 添加測試數據 因爲id,自增長,就不用寫了
insert into user(name,sex,age,address,email) values('劉傑','男',19,'湖南','[email protected]');
insert into user(name,sex,age,address,email) values('adger','男',19,'湖南','[email protected]');
insert into user(name,sex,age,address,email) values('劉傑','男',19,'湖南','[email protected]');
insert into user(name,sex,age,address,email) values('adger','男',19,'湖南','[email protected]');
insert into user(name,sex,age,address,email) values('劉傑','男',19,'湖南','[email protected]');
insert into user(name,sex,age,address,email) values('adger','男',19,'湖南','[email protected]');
insert into user(name,sex,age,address,email) values('劉傑','男',19,'湖南','[email protected]');
insert into user(name,sex,age,address,email) values('adger','男',19,'湖南','[email protected]');
insert into user(name,sex,age,address,email) values('劉傑','男',19,'湖南','[email protected]');
insert into user(name,sex,age,address,email) values('adger','男',19,'湖南','[email protected]');
insert into user(name,sex,age,address,email) values('劉傑','男',19,'湖南','[email protected]');
insert into user(name,sex,age,address,email) values('adger','男',19,'湖南','[email protected]');
insert into user(name,sex,age,address,email) values('劉傑','男',19,'湖南','[email protected]');
insert into user(name,sex,age,address,email) values('adger','男',19,'湖南','[email protected]');
insert into user(name,sex,age,address,email) values('劉傑','男',19,'湖南','[email protected]');
insert into user(name,sex,age,address,email) values('adger','男',19,'湖南','[email protected]');

我這裏就直接原生吧cmd執行 🤪,至於我這個表情怎麼打出來的,用ctrl + Shift +b 就可以了,相信,其他博客主也會弄,或者你是什麼其他輸入法,找到表情就可以了,我是windows自帶的輸入法,沒換過,蠻好用的還🤣

開發

開發工具:eclipseSTS,跟eclipse開不多,只不過就是增加了spring集成插件
環境:tomcat8.5
數據庫:mysql 5.7
前端技術bootstarp
jar包mysql-connector-java-5.1.26,jsp的標籤庫的jar包
管他,三七二十一,既然我沒用SSM和springboot就先創建動態Web項目再說,Dynamic(動態的)
在這裏插入圖片描述
上面的目錄結構你們可能有點不清楚,我也不想去管這些,這個目錄不曉得你們熟悉不,按照這個目錄結構來
在這裏插入圖片描述
目錄結構解釋

  1. 項目名
  2. src 存放源代碼,自己寫controller(這裏有人叫Web,反正我喜歡叫controller(視圖層)servlet也可以),service(服務層),utils(工具類),dao(持久層),
  3. JRE System Library[版本信息jdk.1.8],運行時環境,你把這個remove掉,你會發現你啥玩不了,
    在這裏插入圖片描述
    我來補充下加上去
    在這裏插入圖片描述
    Apache Tomcat8.5 是指這個項目所依賴的服務器

Web App Libraries 這個是等下拷貝進來的jar包目錄,是自己導入的項目依賴 jar 包,Web App Libraries 下的所有 jar 包都可以在本地的項目名\WebContent\WEB-INF\lib 中找到。如果你直接在WEB-INF/lib文件夾下,拷貝一個 jar 包,刷新一下,會自動編譯到 Web App Library 中。圖上沒有,我還沒開始幹

build目錄是eclipse新建的 Dynamic web project 默認是將類編譯在 build 文件夾下的。可以在本地的項目路徑\項目要名\build\classes 下查看

WebContent:一般我們用 eclipse 的時候創建一個 Web Project,就會生成 WebContent 文件夾,用 MyEclipse 的時候創建一個 Web Project,就會生成 WebRoot 文件夾,這兩個文件夾作用一樣只是名稱不同而已。WebContent 用來存放 JSP,JS,CSS,圖片等文件,是項目訪問的默認路徑,也是工程的發佈文件夾,發佈時會把該文件夾發佈到 tomcat 的 webapps 裏。

META-INF目錄的出現:META-INF相當於一個信息包,目錄中的文件和目錄獲得Java 2平臺的認可與解釋,用來配置應用程序、擴展程序、類加載器和服務manifest.mf文件,在用jar打包時自動生成。

WEB-INF:WEB-INF 目錄是一個專用區域, 容器不能把此目錄中的內容提供給用戶。這個目錄下的文件只供容器使用,裏面包含不應該由客戶直接下載的資源。Web 容器要求在你的應用程序中必須有 WEB-INF 目錄。WEB-INF 中包含着發佈描述符(也就是 web.xml 文件), 一個 classes 目錄和一個 lib目錄, 以及其它內容。注意: 如果你的 Web 應用程序中沒有包含這個目錄, 它可能將無法工作 ,這個也是一個保護的目錄,不能被直接訪問,web project 網頁放在WEB-INF下面受保護,不能直接訪問,

web.xml:發佈描述符(deployment descriptors)是 J2EE Web 應用程序不可分割的一部分(也就是說是它的最小部分, 必不可缺的一部分)。它們在應用程序發佈之後幫助管理 Web 應用程序的配置。

WEB-INF/classes 目錄,編譯後的 Java類,這個文件夾是可選的。有一些配置文件需要放到 WEB-INF 的 classes 文件夾下,所以,通常的做法是手動在工程的 WEB-INF 文件夾下建立 classes 文件夾。如果不在工程的 WEB-INF 下手動建立 classes,發佈到 tomcat 時 tomcat 裏的WEB-INF 中也會有 classes 文件夾。

WEB-INF/lib 目錄存放jar包

相關文章參考

  1. 目錄參考文章
  2. META-INF參考文章
  3. WEB-IF參考文章

上面也有我自己的總結
關於mysql-connector的jr包怎麼獲取我已經在文章寫過了,在我的JDBC這篇文章寫了
至於這個jstl的jar包哪裏找呢,我帶你看,這個界面
百度搜索tomcat就可以了

tomcat官方地址
在這裏插入圖片描述
這個界面熟悉吧,taglibs(標籤庫的意思 tag標籤的意思 lib英文翻譯過來可不是庫哦),點擊Download
在這裏插入圖片描述
我覺得還是放下這個,看看,以後也方便自己
在這裏插入圖片描述
在這裏插入圖片描述
jar包放在這個目錄放在這裏,eclipse會幫我們加載上去,如果不想要哪個jar包直接在這裏右鍵delete刪除掉就可以了
在這裏插入圖片描述
不需要去下載兩個jar包standard.jar 和 jstl.jar,只需要其中一個因爲,由於JSTL 1.1已經過時,Apache已將其置於存檔中。選擇jakarta-taglibs-standard-current.zip文件。但是,如果您正在運行Servlet 2.5兼容容器並且web.xml聲明爲至少Servlet 2.5,那麼您應該能夠使用新的JSTL 1.2。需要注意的是JSTL 1.2並沒有要求standard.jar,這裏我上面選擇xml版本得時候 選得很高,Web.xml文件有2.3、2.4、2.5、3.0版本,其中有一個很重要的配置差異:
在Servlet 2.5 版本中可以這樣配置,多個url映射到同一個servlet。具體如下。

<servlet-mapping>
	<servlet-name>servletName</servlet-name>
	<url-pattern>/index</url-pattern>
	<url-pattern>/login</url-pattern>
</servlet-mapping>

參考文章關於引入得問題
參考文章web.xml版本

這些問題我都碰到過,具體得話,我就只能參考,我也說不清楚,反正,也忘記得差不多了,具體得話,可以自己去查下,知識太多了,好了現在jar包也有了,再去弄前端界面,導入前端界面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!-- 網頁使用的語言  這裏我直接引入的在線網址 bootstarp的css,js,jq -->
<head>
    <!-- 指定字符集 -->
    <meta charset="utf-8">
    <!-- 使用Edge最新的瀏覽器的渲染方式 -->
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <!-- 
    	viewport視口:網頁可以根據設置的寬度自動進行適配,在瀏覽器的內部虛擬一個容器,容器的寬度與設備的寬度相同。
   		width: 默認寬度與設備的寬度相同
    	initial-scale: 初始的縮放比,爲1:1
   	-->
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- 上述3個meta標籤*必須*放在最前面,任何其他內容都*必須*跟隨其後! -->
    <title>用戶分頁查詢</title>
    <!-- 1. 導入CSS的全局樣式 -->
    <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css	" rel="stylesheet">
    <!-- 2. 
    		jQuery導入,建議使用1.9以上的版本 
    		jQuery (Bootstrap 的所有 JavaScript 插件都依賴 jQuery,所以必須放在前邊)
    -->
    <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.min.js"></script>
    <!-- 3. 導入bootstrap的js文件 -->
    <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.min.js"></script>
    <style type="text/css">
        td, th {
            text-align: center;
        }
    </style>
</head>
<body>
<div class="container">
    <h3 style="text-align: center">用戶信息列表</h3>
    <table border="1" class="table table-bordered table-hover">
        <tr class="success">
            <th>編號</th>
            <th>姓名</th>
            <th>性別</th>
            <th>年齡</th>
            <th>地址</th>
            <th>郵箱</th>
        </tr>
        <!-- 數據展示 -->
        <c:forEach items="${usersPage.list}" var="u">
        	<tr>
                <td>${u.id}</td>
                <td>${u.name}</td>
                <td>${u.sex}</td>
                <td>${u.age}</td>
                <td>${u.address}</td>
                <td>${u.email}</td>
            </tr>
        </c:forEach>
    </table>
    <ul class="pagination">
    	<!-- 首頁功能 -->
    	<li>
    		<a href="${pageContext.request.contextPath}/UserPagingCaseServlet?currentPage=1&rows=5">
	       		 <span>首頁</span>
	       	</a>
    	</li>
    	<!-- 首頁禁用和激活狀態 -->
    	<c:if test="${usersPage.currentPage == 1}">
        			<li class="disabled">
        </c:if>	
        <c:if test="${usersPage.currentPage != 1}">
        			<li>
        </c:if>	
	      <a href="${pageContext.request.contextPath}/UserPagingCaseServlet?currentPage=${usersPage.currentPage-1 <= 0 ? 1 :usersPage.currentPage-1}&rows=5" aria-label="Previous" >
	        <span aria-hidden="true" class="glyphicon glyphicon-minus" style="font-size:20px"></span>
	      </a>
	    </li>
	    <!-- 展示多少頁 -->
	    <c:forEach begin="1" end="${usersPage.totalPage}" var="i">
       		<c:if test="${usersPage.currentPage == i}">
       			<li class="active"><a href="${pageContext.request.contextPath}/UserPagingCaseServlet?currentPage=${i}&rows=5">${i}</a></li>
       		</c:if>	
       		<c:if test="${usersPage.currentPage != i}">
       			<li><a href="${pageContext.request.contextPath}/UserPagingCaseServlet?currentPage=${i}&rows=5">${i}</a></li>
       		</c:if>	
      		</c:forEach>
       	<!-- 尾頁禁用和激活狀態 -->
       	<c:if test="${usersPage.currentPage == usersPage.totalPage }">
        			<li class="disabled">
        </c:if>	
        <c:if test="${usersPage.currentPage != usersPage.totalPage}">
        			<li>
        </c:if>	
	      <a href="${pageContext.request.contextPath}/UserPagingCaseServlet?currentPage=${usersPage.currentPage+1 > usersPage.totalPage ? usersPage.totalPage:usersPage.currentPage+1}&rows=5" aria-label="Previous">
	        <span aria-hidden="true" class="glyphicon glyphicon-plus" style="font-size:20px"></span>
	      </a>
	    </li>	
   		<!-- 點擊跳轉尾頁的功能 -->
	    <li>
    		<a href="${pageContext.request.contextPath}/UserPagingCaseServlet?currentPage=${usersPage.totalPage}&rows=5">
	       		 <span>尾頁</span>
	       	</a>
    	</li>
  	</ul>
  	<!-- bootstarp中的清除浮動 -->
  	<div class="clearfix"></div>
  	<span class="glyphicon glyphicon-user">總記錄數(${usersPage.totalCount})<span class="glyphicon glyphicon-minus"></span>(${usersPage.totalPage})</span>
</div>
</body>
</html>

這裏有兩個jsp,因爲我的目的是爲了打開這個界面就有數據,這裏因爲是要直接跳轉到一個servlet,controller調用servce再調用dao去查詢數據庫,查到了保存在request作用域中,然後在轉發進入的頁面就可以獲取到你的值,返回到jsp頁面上

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<jsp:forward page="/UserPagingCaseServlet"></jsp:forward>

web.xml的配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">

  <!-- 因爲換了版本 你寫servlet的時候 不會幫你自動創建 顯示項目名稱  對了 xml 的文件第一行註釋不能寫的,有嚴格規範的-->
  <display-name>pagingcase</display-name>
  
  <!-- 表示默認打開的頁面,如果找不到,就會報404錯誤 -->
  <welcome-file-list>
    <welcome-file>my.jsp</welcome-file>
  </welcome-file-list>
  
  <!-- 
  	這裏的兩個servlet-name名稱
  	 必須相同,不相同的情況我忘記了,你們可以留言,這裏什麼名字可以隨便取
  	servlet-class 是你寫的servlet 包名	
  	url-pattern 路徑	
   -->
  <servlet>
  	<servlet-name>UserPagingCaseServlet</servlet-name>
  	<servlet-class>club.adger.controller.UserPagingCaseServlet</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>UserPagingCaseServlet</servlet-name>
  	<url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

前端界面有了,jar包也有了,數據庫,庫,表都有了,加上去了,寫代碼咯🙃,開始掉頭髮咯,這裏因爲自己提前寫過了,下面的界面是我提前已經寫好的了,依次來說
在這裏插入圖片描述
這裏,建的包相信都能看懂,MVC設計模式,跟三層架構的概念,我不寫那麼多了,有時間我自己抽時間去寫,簡單一張黑馬的圖,來說明下
MVC開發模式
在這裏插入圖片描述
三層架構
在這裏插入圖片描述

我的第一步,先寫的Utils,這裏爲什麼沒有寫什麼db.properties啥的,我覺得原生的寫更牛點,一點點敲出來,靜態代碼塊,隨着類的的加載而執行,而且只執行一次

package club.adger.utils;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class MyJdbcUtils {
	/**
	 * @author adger
	 * 因爲是工具類 所以方法 基本爲靜態
	 * */
	private final static String URL = "jdbc:mysql:///pagingcase?useUnicode=true&characterEncoding=utf-8";
	private final static String USERNAME = "root";
	private final static String PASSWORD = "root";
		
	static{
		//加載驅動
		try{
			Class.forName("com.mysql.jdbc.Driver");
		}catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	//獲取連接
	public static Connection getConnection(){
		//創建連接對象
		Connection con = null;
		try {
			con = DriverManager.getConnection(URL,USERNAME,PASSWORD);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return con;
	}
			
	/**
	 * 關閉的方法
	 * */
	public static void close(ResultSet res,PreparedStatement ps,Connection con){
		try{
			if(res != null)
				res.close();
			if(ps != null)
				ps.close();
			if(con != null)
				con.close();
		}catch(Exception e){
			e.printStackTrace();
		}
	}
}

然後去測試自己,寫的工具類,怎麼樣

package club.adger.test;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import club.adger.utils.MyJdbcUtils;

public class TestMyJdbcUtils {
	/**
	 * 測試自己MyJdbcUtils能不能用
	 * */
	public static void testMyJdbcUtils(){
		Connection con = MyJdbcUtils.getConnection();
		System.out.println(con);
		PreparedStatement ps = null;
		ResultSet rs = null;
		String sql = "select * from user";
		try {
			ps = con.prepareStatement(sql);
			rs = ps.executeQuery();
			while(rs.next()){
				 System.out.println(rs.getInt(1)+"\t"+rs.getString(2)+"\t\t"+rs.getString(3));
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			MyJdbcUtils.close(rs, ps, con);
			//下面是我調皮 自己搞的
			System.out.println("\t\t\t\t\t\t▬▬▬▬.◙.▬▬▬▬\n" +
	                "\t\t\t\t\t\t     ▂▄▄▓▄▄▂\n" +
	                "\t\t\t\t\t\t◢◤ █▀▀████▄▄▄▄◢◤ \n" +
	                "\t\t\t\t\t\t█關閉!測試成功!█▀▀▀▀╬     \n" +
	                "\t\t\t\t\t\t◥██████◤\n" +
	                "\t\t\t\t\t\t══╩══╩═");
		}
	}
	
	public static void main(String[] args) {
		testMyJdbcUtils();
	}
	
}

在這裏插入圖片描述
ok,😋,能用了,香啊,自己寫的
再去寫實體類,javaBean

package club.adger.entity;
/**
 * @author adger
 * 這是一個用戶得實體類
 * */
public class User {
	private Integer id; //	用戶id
	private String name;// 用戶名
	private String sex; //性別
	private Integer age;//年齡
	private String address;// 地址
	private String email; // 郵箱
	
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	
	//方便自己去看數據
	@Override
	public String toString() {
		return "User [id=" + id + ", name=" + name + ", sex=" + sex + ", age=" + age + ", address=" + address
				+ ", email=" + email + "]";
	}
}

接下來就是重點了
這個PageBean是每一個都是關鍵,這裏你要清楚你的思想,然後纔去寫代碼,你要寫分頁功能,對吧,分頁中有什麼功能呢,前端展示的界面已經告送我們了,我框出的功能都是要寫的,這個上面的數據是我沒改的
在這裏插入圖片描述

總共多少多少頁,你是不是隻要sql語句這麼編寫就可以了,查到了16條數據,對吧

select count(*) from user;

在這裏插入圖片描述
那分頁呢,是不是sql語句只要這麼編寫啊,注意這裏索引是從0開始的,不然你查數據就是這麼查的,這個查詢語句只適用於MySQL

select * from user limit 0,5;
-- LIMIT 首行行號,要返回的結果集的最大數目

在這裏插入圖片描述
那如果第二頁呢,第三頁呢
在這裏插入圖片描述
好的,現在清楚了,PageBean應該寫哪幾個屬性,PageBean就是一個模型,到時候分頁的部分看成各個對象,從模型中取出數據就可以了

package club.adger.entity;

import java.util.List;

/**
 * 分頁對象
 * 這裏 加上泛型 是因爲 當如果 訂單模塊的列表需要去分頁,就可以直接使用放便 比如 List <User>,List <Order>
 * */
public class PageBean<T> {
	private int	totalCount;	//	從數據庫 查的總記錄數 select count(*) from user; 
	private int totalPage; //總頁碼 查的總記錄條數 / 每頁顯示的條數 
	private List<T> list; // 每頁的數據 
	private int currentPage; //當前頁碼 select * from limit ?,?; 代表前面的?
	private int rows; //每頁顯示的條數 select * from limit ?,?; rows代表後面的?
	public int getTotalCount() {
		return totalCount;
	}
	public void setTotalCount(int totalCount) {
		this.totalCount = totalCount;
	}
	public int getTotalPage() {
		return totalPage;
	}
	public void setTotalPage(int totalPage) {
		this.totalPage = totalPage;
	}
	public List<T> getList() {
		return list;
	}
	public void setList(List<T> list) {
		this.list = list;
	}
	public int getCurrentPage() {
		return currentPage;
	}
	public void setCurrentPage(int currentPage) {
		this.currentPage = currentPage;
	}
	public int getRows() {
		return rows;
	}
	public void setRows(int rows) {
		this.rows = rows;
	}
	
	/**
	 * 方便自己觀察數據,加上一個toString方法
	 * */
	@Override
	public String toString() {
		return "PageUtils [totalCount=" + totalCount + ", totalPage=" + totalPage + ", list=" + list + ", currentPage="
				+ currentPage + ", rows=" + rows + "]";
	}
}

然後在逐步分析,我習慣是從控制層(controller)開始寫起,要分頁功能是吧,好的

  1. 接受用戶穿過來的參數,就是用戶一打開要看到,第一頁的數據啊,幾條呢,不可能,打開就是,第3頁,5條數據,我就不信,用戶能知道我的參數變量,除非研究了
  2. 調用服務層(service)
  3. 服務層去調用持久層(dao),就沒了啊
package club.adger.controller;

import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import club.adger.entity.PageBean;
import club.adger.entity.User;
import club.adger.service.UserPagingCaseService;
import club.adger.service.impl.UserPagingCaseServiceImpl;

@WebServlet("/UserPagingCaseServlet")
public class UserPagingCaseServlet extends HttpServlet {
   
   protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   	//1.獲取參數 當前頁碼的參數
   	String currentPage = request.getParameter("currentPage"); 
   	//每頁顯示的條數
   	String rows = request.getParameter("rows");
   	if(currentPage == null || "".equals(currentPage)){
   		currentPage = "1";
   	}
   	if(rows == null || "".equals(rows)){
   		rows = "5";
   	}
   	int cp = Integer.parseInt(currentPage);
   	int nowrows = Integer.parseInt(rows);
   	//轉換 因爲需要int 類型的
   	//2.調用service
   	UserPagingCaseService userService = new UserPagingCaseServiceImpl();
   	PageBean<User> userPage = userService.findUserByPage(cp,nowrows);
   	//2.將list存入request域中
   	request.setAttribute("usersPage", userPage);
   	//3.轉發到index.jsp 轉發不需要寫虛擬目錄
   	request.getRequestDispatcher("/index.jsp").forward(request, response);
   }
}

service接口跟實現類

package club.adger.service;

import club.adger.entity.PageBean;
import club.adger.entity.User;

public interface UserPagingCaseService {
	/**
	 * 查詢所有用戶信息
	 * @return
	 * */
	public PageBean<User> findUserByPage(int currentPage,int rows);
}

實現類

package club.adger.service.impl;

import java.util.ArrayList;
import java.util.List;

import club.adger.dao.UserPagingCaseDao;
import club.adger.dao.impl.UserPagingCaseDaoImpl;
import club.adger.entity.PageBean;
import club.adger.entity.User;
import club.adger.service.UserPagingCaseService;

public class UserPagingCaseServiceImpl implements UserPagingCaseService {
	private UserPagingCaseDao userDao = new UserPagingCaseDaoImpl();
	
	@Override
	public PageBean<User> findUserByPage(int currentPage,int rows) {
		List<User> list = new ArrayList<User>();
		System.out.println(list);
		//1.創建空的pageBean對象
		PageBean<User> page = new PageBean<User>();
		//3.調用Dao查詢總記錄數  需要展示總頁碼的數量
		int totalCount = userDao.findTotalCount();
		page.setTotalCount(totalCount);
		//4.調用dao查詢list集合 計算開始記錄索引 
		int start = (currentPage-1)*rows;
		//5.封裝到List集合裏面去
		List<User> lis = userDao.findByPage(start,rows);
		page.setList(lis);
		// 因爲 總記錄條數 / 每頁幾條 如果每頁展示不下 就加 1 條顯示
		int totalPage = totalCount % rows == 0  ?  totalCount/rows : totalCount/rows + 1;
		System.out.println(totalPage+"頁碼數");
		page.setTotalPage(totalPage);
		System.out.println(page);
		page.setCurrentPage(currentPage);
		page.setRows(rows);
		return page;
	}

}

dao的接口跟實現類

package club.adger.dao;

import java.util.List;

import club.adger.entity.User;

/**
 * 用戶的dao
 * */
public interface UserPagingCaseDao {
	
	/**
	 * 查詢總記錄數
	 * */
	public int findTotalCount();
	
	/**
	 * 分頁查詢每頁記錄數
	 * */
	public List<User> findByPage(int start, int rows);
}

impl實現

package club.adger.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import club.adger.dao.UserPagingCaseDao;
import club.adger.entity.User;
import club.adger.utils.MyJdbcUtils;

public class UserPagingCaseDaoImpl implements UserPagingCaseDao {
	/**
	 * 查詢總記錄數
	 * */
	@Override
	public int findTotalCount() {
		//1.註冊驅動 因爲自己寫的工具類 已經 用靜態代碼塊了 所以不用寫了 調用MyJdbcUtils的時候 就加載了
		//2.建立鏈接
		//這裏定義個變量 int count 是爲了等下拿數據庫查到的值 放在外面 也好返回
		int count = 0;
		Connection con = MyJdbcUtils.getConnection();
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			//3.執行SQL語句
			String sql = "select count(*) from user";
			ps = con.prepareStatement(sql);
			rs = ps.executeQuery();
			//4.遍歷結果集
			if(rs.next()){
				count = rs.getInt(1);
				System.out.println(count);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			//5.關閉數據庫
			MyJdbcUtils.close(rs, ps, con);
		}
		return count;
	}
	
	/**
	 * 分頁查詢每頁記錄數
	 * */
	@Override
	public List<User> findByPage(int start, int rows) {
				List<User> list = new ArrayList<User>();
				Connection con = MyJdbcUtils.getConnection();
				PreparedStatement ps = null;
				ResultSet rs = null;
				try {
					String sql = "select * from user limit ?,?";
					ps = con.prepareStatement(sql);
					ps.setInt(1, start);
					ps.setInt(2, rows);
					rs = ps.executeQuery();
					while(rs.next()){
						User u = new User();
						u.setId(rs.getInt("id"));
						u.setName(rs.getString("name"));
						u.setSex(rs.getString("sex"));
						u.setAge(rs.getInt("age"));
						u.setAddress(rs.getString("address"));
						u.setEmail(rs.getString("email"));
						System.out.println(u);
						list.add(u);
						System.out.println(list);
					}
				} catch (SQLException e) {
					e.printStackTrace();
				}finally{
					MyJdbcUtils.close(rs, ps, con);
				}
		return list;
	}
	
}

在這裏插入圖片描述
因爲,我覺得我的文字解釋,可能沒有就是自己口上說的好,這些代碼我能說出來什麼什麼意思,有一些底層還是不懂得,現在運行吧
在這裏插入圖片描述
效果圖,已經展示了,在這篇文章得開頭
在這裏插入圖片描述
這裏留一個問題,給你們,嘻嘻,就是如果,頁數太多了,那那個是不是得很多頁12345678910 11 12 12 13啥的對不對,其實我也沒看懂,網上說的,就是利用前端插件,bootstarp的分頁插件,等我鑽研出來了再寫吧,我也是回顧下,當然模糊查詢分頁類似差不多,如果這個分頁 有不懂的可以問我,當然我也在學習

歡迎加羣,一起學習交流
在這裏插入圖片描述

有趣的事

這裏換個編輯器,因爲培訓機構的開發工具事,eclipse所以爲了適應,我上面用的eclipse,最近我在github找了一套不錯的博客系統蠻好的源碼,還有第三方接口,短信,微信,QQ
在這裏插入圖片描述
博客系統地址,開源的
博客系統源碼能跑起來
前臺
在這裏插入圖片描述
後臺
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章