一、項目使用到的內容
jsp
servlet
bootstrap3
jdk6
tomcat6
jstl標籤庫
EL表達式語言
mysql 5.5
eclipse(Neon)
二、項目的目錄結構
第三方的架包文件
三、主要的代碼
- 1、數據文件
subwayinfo.sql
USE `test`;
DROP TABLE IF EXISTS `subwayinfo`;
CREATE TABLE `subwayinfo` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '編號',
`subwayname` varchar(50) NOT NULL COMMENT '線路名稱',
`start_station` varchar(50) NOT NULL COMMENT '始發站',
`end_station` varchar(50) NOT NULL COMMENT '終點站',
`station_num` int(10) NOT NULL COMMENT '途徑站點數',
`start_time` varchar(50) DEFAULT '--' COMMENT '發車時間',
`price` int(11) DEFAULT '2' COMMENT '票價',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
insert into `subwayinfo`(`id`,`subwayname`,`start_station`,`end_station`,`station_num`,`start_time`,`price`) values (1,'1號線','蘋果園','四惠東',23,'5:10',2);
insert into `subwayinfo`(`id`,`subwayname`,`start_station`,`end_station`,`station_num`,`start_time`,`price`) values (2,'2號線','西直門','西直門',18,'5:09',2);
insert into `subwayinfo`(`id`,`subwayname`,`start_station`,`end_station`,`station_num`,`start_time`,`price`) values (3,'4號線','安河橋北','公益西橋',24,'5:00',2);
insert into `subwayinfo`(`id`,`subwayname`,`start_station`,`end_station`,`station_num`,`start_time`,`price`) values (4,'5號線','天通苑北','安家莊',23,'4:50',2);
insert into `subwayinfo`(`id`,`subwayname`,`start_station`,`end_station`,`station_num`,`start_time`,`price`) values (5,'8號線','北土城','回龍觀東大街',10,'5:33',2);
insert into `subwayinfo`(`id`,`subwayname`,`start_station`,`end_station`,`station_num`,`start_time`,`price`) values (6,'測試線路1','黃金口','漢口火車站',22,'5:00',2);
insert into `subwayinfo`(`id`,`subwayname`,`start_station`,`end_station`,`station_num`,`start_time`,`price`) values (7,'1號線','蘋果園','四惠東',23,'5:10',2);
insert into `subwayinfo`(`id`,`subwayname`,`start_station`,`end_station`,`station_num`,`start_time`,`price`) values (8,'2號線','西直門','西直門',18,'5:09',2);
insert into `subwayinfo`(`id`,`subwayname`,`start_station`,`end_station`,`station_num`,`start_time`,`price`) values (9,'4號線','安河橋北','公益西橋',24,'5:00',2);
insert into `subwayinfo`(`id`,`subwayname`,`start_station`,`end_station`,`station_num`,`start_time`,`price`) values (10,'5號線','天通苑北','安家莊',23,'4:50',2);
insert into `subwayinfo`(`id`,`subwayname`,`start_station`,`end_station`,`station_num`,`start_time`,`price`) values (11,'8號線','北土城','回龍觀東大街',10,'5:33',2);
insert into `subwayinfo`(`id`,`subwayname`,`start_station`,`end_station`,`station_num`,`start_time`,`price`) values (12,'測試線路1','黃金口','漢口火車站',22,'5:00',2);
insert into `subwayinfo`(`id`,`subwayname`,`start_station`,`end_station`,`station_num`,`start_time`,`price`) values (13,'1號線','蘋果園','四惠東',23,'5:10',2);
insert into `subwayinfo`(`id`,`subwayname`,`start_station`,`end_station`,`station_num`,`start_time`,`price`) values (14,'2號線','西直門','西直門',18,'5:09',2);
insert into `subwayinfo`(`id`,`subwayname`,`start_station`,`end_station`,`station_num`,`start_time`,`price`) values (15,'4號線','安河橋北','公益西橋',24,'5:00',2);
insert into `subwayinfo`(`id`,`subwayname`,`start_station`,`end_station`,`station_num`,`start_time`,`price`) values (16,'5號線','天通苑北','安家莊',23,'4:50',2);
insert into `subwayinfo`(`id`,`subwayname`,`start_station`,`end_station`,`station_num`,`start_time`,`price`) values (17,'8號線','北土城','回龍觀東大街',10,'5:33',2);
insert into `subwayinfo`(`id`,`subwayname`,`start_station`,`end_station`,`station_num`,`start_time`,`price`) values (18,'測試線路1','黃金口','漢口火車站',22,'5:00',2);
insert into `subwayinfo`(`id`,`subwayname`,`start_station`,`end_station`,`station_num`,`start_time`,`price`) values (19,'1號線','蘋果園','四惠東',23,'5:10',2);
insert into `subwayinfo`(`id`,`subwayname`,`start_station`,`end_station`,`station_num`,`start_time`,`price`) values (20,'2號線','西直門','西直門',18,'5:09',2);
insert into `subwayinfo`(`id`,`subwayname`,`start_station`,`end_station`,`station_num`,`start_time`,`price`) values (21,'4號線','安河橋北','公益西橋',24,'5:00',2);
insert into `subwayinfo`(`id`,`subwayname`,`start_station`,`end_station`,`station_num`,`start_time`,`price`) values (22,'5號線','天通苑北','安家莊',23,'4:50',2);
insert into `subwayinfo`(`id`,`subwayname`,`start_station`,`end_station`,`station_num`,`start_time`,`price`) values (23,'8號線','北土城','回龍觀東大街',10,'5:33',2);
insert into `subwayinfo`(`id`,`subwayname`,`start_station`,`end_station`,`station_num`,`start_time`,`price`) values (24,'測試線路1','黃金口','漢口火車站',22,'5:00',2);
insert into `subwayinfo`(`id`,`subwayname`,`start_station`,`end_station`,`station_num`,`start_time`,`price`) values (25,'1號線','蘋果園','四惠東',23,'5:10',2);
insert into `subwayinfo`(`id`,`subwayname`,`start_station`,`end_station`,`station_num`,`start_time`,`price`) values (26,'2號線','西直門','西直門',18,'5:09',2);
insert into `subwayinfo`(`id`,`subwayname`,`start_station`,`end_station`,`station_num`,`start_time`,`price`) values (27,'4號線','安河橋北','公益西橋',24,'5:00',2);
- 2、bean包下的文件
第一個文件SubwayInfo.java
package top.linksinke.bean;
/**
* subwayinfo表對應的實體類<br/>
* create by LINKSINKE on 2020/3/11
*/
public class SubwayInfo implements java.io.Serializable {
private static final long serialVersionUID = -8471088390616186369L;
private Long id;// 線路編號
private String subwayname;// 線路名稱
private String start_station; // 始發站
private String end_station;// 終點站
private Integer station_num;// 途徑站點數
private String start_time; // 發車時間
private Double price;// 票價
public SubwayInfo() { super(); }
@Override
public String toString() {
return "SubwayInfo [id=" + id + ", subwayname=" + subwayname + ", start_station=" + start_station
+ ", end_station=" + end_station + ", station_num=" + station_num + ", start_time=" + start_time
+ ", price=" + price + "]";
}
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public String getSubwayname() { return subwayname; }
public void setSubwayname(String subwayname) { this.subwayname = subwayname; }
public String getStart_station() { return start_station; }
public void setStart_station(String start_station) { this.start_station = start_station; }
public String getEnd_station() { return end_station; }
public void setEnd_station(String end_station) { this.end_station = end_station; }
public Integer getStation_num() { return station_num; }
public void setStation_num(Integer station_num) { this.station_num = station_num; }
public String getStart_time() { return start_time; }
public void setStart_time(String start_time) { this.start_time = start_time; }
public Double getPrice() { return price; }
public void setPrice(Double price) { this.price = price; }
}
第二個文件PageInfo.java
package top.linksinke.bean;
/**
* 分頁信息實體類<br/>
* create by LINKSINKE on 2020/3/11
*/
public class PageInfo {
private Integer currentPage; // 當前是多少頁
private Integer startNo;// 起始條數
private Integer endNo;// 結束條數
private Integer backPageNo; // 上一頁
private Integer nextPageNo; // 下一頁
private Integer totalData; // 總的數據量
private Integer totalPage; // 總的分頁數量
private Integer pageSize; // 每頁顯示多少條數據量
public PageInfo() { super(); }
/**
* 取得分頁信息
*
* @param currentNo
* 當前的頁碼
* @param totalData
* 總共的數據量
* @param pageSize
* 每頁顯示的數據量
*/
public PageInfo(Integer currentPage, Integer totalData, Integer pageSize) {
super();
this.currentPage = currentPage;
this.totalData = totalData;
this.pageSize = pageSize;
/**
* 總的分頁數量<br>
* 總的數據量除以每頁顯示的數量,如果結果不爲0,就增加一頁
*/
this.totalPage = totalData % pageSize == 0 ? totalData / pageSize : totalData / pageSize + 1;
/**
* 每頁最開始的一條數據<br>
* 例如:顯示第一頁,每頁五條數據,那麼語法是:limit 0,5<br>
* 顯示第二頁,每頁五條數據,那麼語法是: limit 5,5<br>
* 顯示第三頁,每頁五條數據,那麼語法是: limit 10,5<br>
* <p>
* 每一頁顯示的數量是一樣的,即不會發生改變的<br>
* 而當前的頁會發生改變,比如到第二頁、第三頁,其開始頁的結果也會有所不同
* 可以看出每次翻一頁就等於上一頁的累計頁面顯示的數量
* </p>
*/
this.startNo = (currentPage - 1) * pageSize;
/**
* 每頁最後面的一條數據<br>
* 例如:顯示第一頁,每頁五條數據,那麼語法是:limit 0,5<br>
* 顯示第二頁,每頁五條數據,那麼語法是: limit 6,5<br>
* 顯示第三頁,每頁五條數據,那麼語法是: limit 10,5<br>
* 所以可以得到最後一條數據總是等於每頁顯示的大小
*/
this.endNo = pageSize;
/**
* 上一頁<br>
* 假設當前頁是小於-1或者是直接爲1的,那麼就讓他等於1,要不然sql語法會發生錯誤
*/
this.backPageNo = currentPage <= 1 ? 1 : currentPage - 1;
/**
* 下一頁<br>
* 假設當前頁沒有超出了總的頁面數據量,那麼就讓他繼續當前頁+1頁,超出則等於總的頁面數據量(注意判斷的順序)
*/
this.nextPageNo = currentPage < totalPage ? currentPage + 1 : currentPage ;
}
@Override
public String toString() {
return "PageInfo [currentPage=" + currentPage + ", startNo=" + startNo + ", endNo=" + endNo + ", backPageNo="
+ backPageNo + ", nextPageNo=" + nextPageNo + ", totalData=" + totalData + ", totalPage=" + totalPage
+ ", pageSize=" + pageSize + "]";
}
public Integer getCurrentPage() { return currentPage; }
public void setCurrentPage(Integer currentPage) { this.currentPage = currentPage; }
public Integer getStartNo() { return startNo; }
public void setStartNo(Integer startNo) { this.startNo = startNo; }
public Integer getEndNo() { return endNo; }
public void setEndNo(Integer endNo) { this.endNo = endNo; }
public Integer getBackPageNo() { return backPageNo; }
public void setBackPageNo(Integer backPageNo) { this.backPageNo = backPageNo; }
public Integer getNextPageNo() { return nextPageNo; }
public void setNextPageNo(Integer nextPageNo) { this.nextPageNo = nextPageNo; }
public Integer getTotalData() { return totalData; }
public void setTotalData(Integer totalData) { this.totalData = totalData; }
public Integer getTotalPage() { return totalPage; }
public void setTotalPage(Integer totalPage) { this.totalPage = totalPage; }
public Integer getPageSize() { return pageSize; }
public void setPageSize(Integer pageSize) { this.pageSize = pageSize; }
}
- 3、dao包下的文件
SubwayInfoDao.java
,好像java面試題裏有關於手敲一個jdbc連接並寫個分頁這樣的題目,這個類應該算是核心的類吧。。。。。需要的可以直接借鑑該類
package top.linksinke.dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import top.linksinke.bean.PageInfo;
import top.linksinke.bean.SubwayInfo;
public class SubwayInfoDao {
// mysql連接地址,數據庫用戶和密碼
private final String URL = "jdbc:mysql://localhost:3306/test";
private final String USER = "root";
private final String PASSWORD = "root";
private Connection conn;// 連接
private PreparedStatement ps; // sql執行者
private ResultSet rs; // 返回的數據結果集
/**
* @describe 關閉正在佔用的資源
* @throws SQLException SQL語句語法存在錯誤
*/
public void close() throws SQLException {
// 如果結果集在使用中
if (rs != null) {
rs.close();// 關閉結果集
}
// 如果執行者還在執行過程中
if (ps != null) {
ps.close();// 關閉執行者
}
// 如果連接狀態是打開的情況
if (conn != null) {
conn.close();// 關閉連接
}
}
/**
* 分頁查詢
* @param pageInfo
* @return SubwayInfo集合
*/
public List<SubwayInfo> searchByPage(PageInfo pageInfo) {
Connection conn; // 連接源
List<SubwayInfo> lis = new ArrayList<SubwayInfo>();
try {
// 1、加載mysql的驅動
Class.forName("com.mysql.jdbc.Driver");
// 2、獲得連接源
conn = DriverManager.getConnection(URL, USER, PASSWORD);
// 3、獲取sql執行者對象
PreparedStatement ps = conn.prepareStatement("select * from subwayinfo limit ?,?");
// 4、向sql中帶參數的,沒參數就不用準備下面的操作
Object[] params = { pageInfo.getStartNo(), pageInfo.getEndNo() };
for (int i = 0; i < params.length; i++) {
ps.setObject(i + 1, params[i]);
}
// 5、執行者開始查詢數據庫數據並返回到結果集進行存儲
ResultSet rs = ps.executeQuery(); // 結果集對象
// 6、讀取數據
while (rs.next()) { // rs如果存在下一條數據就開始循環
// 將取出來的數據存放到集合中
SubwayInfo subway = new SubwayInfo();
subway.setId(rs.getLong("id"));
subway.setSubwayname(rs.getString("subwayname"));
subway.setStart_station(rs.getString("start_station"));
subway.setEnd_station(rs.getString("end_station"));
subway.setStation_num(rs.getInt("station_num"));
subway.setStart_time(rs.getString("start_time"));
subway.setPrice(rs.getDouble("price"));
lis.add(subway);
}
// 7、返回最後的查詢結果
return lis;
} catch (SQLException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
/**
* 取得數據庫的總數據量
* @return 總的數據量
*/
public Integer totalData() {
Connection conn = null; // 連接源
Integer count = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(URL, USER, PASSWORD);
PreparedStatement ps = conn.prepareStatement("select count(1) from subwayinfo");
ResultSet rs = ps.executeQuery();
if (rs.next()) {
count = rs.getInt(1);
}
return count;
} catch (SQLException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
// 方法測試
public static void main(String[] args) {
SubwayInfoDao dao = new SubwayInfoDao();
System.out.println("總數據量" + dao.totalData());
PageInfo pageInfo = new PageInfo(1, dao.totalData(), 5);
List<SubwayInfo> info = dao.searchByPage(pageInfo);
for (SubwayInfo subwayInfo : info) {
System.out.println(subwayInfo);
}
System.out.println(pageInfo.toString());
}
}
- 4、servlet包下的文件
SubwayInfoServlet.java
package top.linksinke.servlet;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import top.linksinke.bean.PageInfo;
import top.linksinke.bean.SubwayInfo;
import top.linksinke.dao.SubwayInfoDao;
public class SubwayInfoServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
String page = req.getParameter("pageNo");
// 要是找不到pageNo參數或者沒有賦值就默認給值爲1
if (page == null || "".equals(page)) {
page = "1";
}
// 取得pageInfo信息
Integer currentPage = Integer.valueOf(page);
SubwayInfoDao subwayInfoDao = new SubwayInfoDao();
Integer totalData = subwayInfoDao.totalData();
Integer pageSize = 5;
PageInfo pageInfo = new PageInfo(currentPage, totalData, pageSize);
// 取得subwayInfo信息
List<SubwayInfo> subwayinfo = subwayInfoDao.searchByPage(pageInfo);
// pageInfo和subwayInfo信息都存儲到session作用域中
session.setAttribute("subwayinfo", subwayinfo);
session.setAttribute("pageinfo", pageInfo);
req.getRequestDispatcher("/index.jsp").forward(req, resp);// 轉發
}
}
- 5、WebContent目錄下的jsp文件
第一個chain.jsp
,這個jsp的作用是,項目的發佈訪問後默認自行打開的頁面,發送一個請求到servlet來加載數據結果並返回一個新的頁面;
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<% response.sendRedirect(request.getContextPath() + "/display?pageNo=1"); %>
第二個index.jsp
,這個頁面是chain.jsp請求成功後跳轉的頁面。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head lang="zh-Hans-cmn">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>mysql分頁數據顯示</title>
<link rel="stylesheet" type="text/css" href="assets/bootstrap-3.3.7.css">
<link rel="stylesheet" type="text/css" href="assets/bootstrap-theme-3.3.7.css">
</head>
<body>
<div class="container">
<div class="row">
<div class="col-md-12 col-lg-12">
<div class="page-header">
<h1>mysql分頁數據顯示</h1>
</div>
<table>
<tr>
<th>線路編號</th>
<th>線路名稱</th>
<th>始發站</th>
<th>終點站</th>
<th>途徑站點數</th>
<th>發車時間</th>
<th>票價</th>
</tr>
<c:forEach var="info" items="${sessionScope.subwayinfo }">
<tr>
<td>${info.id }</td>
<td>${info.subwayname}</td>
<td>${info.start_station}</td>
<td>${info.end_station}</td>
<td>${info.station_num}</td>
<td>${info.start_time}</td>
<td>${info.price}</td>
</tr>
</c:forEach>
</table>
</div>
</div>
<hr>
<nav aria-label="Page navigation">
<p>
共計<span style="color:red;">${sessionScope.pageinfo.totalData }</span>條數據,當前是第<span style="color:red;">${sessionScope.pageinfo.currentPage }</span>頁
</p>
<ul class="pagination">
<li><a href="<%=basePath%>display?pageNo=1" aria-label="首頁">首頁 </a></li>
<li><a href="<%=basePath%>display?pageNo=${sessionScope.pageinfo.backPageNo }" aria-label="上一頁">上一頁</a></li>
<li><a href="<%=basePath %>display?pageNo=${sessionScope.pageinfo.nextPageNo }" aria-label="下一頁">下一頁</a></li>
<li><a href="<%=basePath %>display?pageNo=${sessionScope.pageinfo.totalPage }" aria-label="尾頁"> 尾頁</a></li>
</ul>
</nav>
</div>
</body>
<script type="text/javascript" src="assets/jquery-1.12.4.js"></script>
<script type="text/javascript" src="assets/bootstrap-3.3.7.js"></script>
</html>
- 6、最後一個是
web.xml
,配置的就是servlet請求的內容
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>paging_mysql</display-name>
<servlet>
<servlet-name>subwayinfo</servlet-name>
<servlet-class>top.linksinke.servlet.SubwayInfoServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>subwayinfo</servlet-name>
<url-pattern>/display</url-pattern>
</servlet-mapping>
<!-- 你說爲什麼默認就可以打開到chain.jsp呢,因爲源頭在這 -->
<welcome-file-list>
<welcome-file>chain.jsp</welcome-file>
</welcome-file-list>
</web-app>
四、項目最終跑起來的效果
-
先請求一下路徑,看有沒有問題
比如:localhost:8080,看看tomcat是不是能正常訪問;
比如:localhost:8080/paging_mysql/display,看看不給pageNo
參數能否正常打開index.jsp
;
比如:localhost:8080/paging_mysql,看攜帶pageNo
參數默認是不是打開index.jsp
-
現在來看功能有沒有問題吧
功能基本沒問題,翻上一頁,下一頁,首頁,尾頁都可以
總結
好長時間沒有純手工寫jdbc訪問了,都是框架提供好一些方法自己直接配置就能用了
代碼下載
需要下載這篇文章的項目的話,請訪問該地址進行下載
https://download.csdn.net/download/qq_29001539/12241984
下載後可能遇到的問題
-
項目要怎麼才能放入進來到我的ide裏呢?
你可以從頭到尾的敲上一篇
或者使用import菜單來導入項目
1、找到import…,其他導入方式
2、其他的選項不用,用這個選項,該選項可以複製項目到你工具的工作空間裏,而不是引用該項目,好處是桌面上項目丟失了,該項目不會丟失
3、導入項目
-
數據庫訪問問題:
mysql的版本過高,請更換mysql的驅動包
mysql的連接發生錯誤,應該是mysql的root用戶密碼錯誤,或者你不是用的root用戶等 -
項目出現紅叉叉:
更換你工具裏的環境(以eclipse項目爲例)
1、選擇該項目,快捷鍵alt+enter,打開項目配置窗口
2、修改項目的環境
-
如果是在不行,一個一個的寫到你的空項目裏沒有出現創建錯誤或者環境錯誤