Jsp技術入門指南【十三】基于 JSTL SQL 標簽庫實現 MySQL 數據庫連接與數據分頁展示
- 前言
- 一、回顧SQL標簽的內容
- 1. 什么是JSTL SQL標簽?
- 2.為什么要用SQL標簽?
- 3.第一步:引入SQL標簽庫
- 4. SQL標簽的核心功能:連接數據庫
- 標簽常用屬性:
- 示例代碼(連接到名為“test”的數據庫):
- 二、實例演示
- 第一步:加入驅動包
- 第二步:配置maven
- 第三步:創建并導入web庫
- 第四步:導入jsp文件
- 第五步:根據jsp文件格式創建數據庫
- 第六步:利用SQL標簽庫實現MySQL數據庫連接
前言
- 在上一篇博客中,我們介紹了 JSTL 中 SQL 標簽庫和自定義標簽庫 的基礎用法。
- 本文將結合 MySQL 數據庫連接 和 JSP 頁面數據渲染,通過完整的技術方案實現「從數據庫到前端頁面」的數據流轉。
我的個人主頁,歡迎來閱讀我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343
我的JSP知識文章專欄
歡迎來閱讀指出不足
https://blog.csdn.net/2402_83322742/category_12950980.html?spm=1001.2014.3001.5482
一、回顧SQL標簽的內容
我的JSTL SQL標簽詳細講解博客鏈接
Jsp技術入門指南【十一】SQL標簽庫
https://blog.csdn.net/2402_83322742/article/details/147838670
Jsp技術入門指南【九】詳細講解JSTL
https://blog.csdn.net/2402_83322742/article/details/147312023
1. 什么是JSTL SQL標簽?
首先,我們需要知道兩個關鍵詞:JSTL 和 SQL標簽。
- JSTL:全稱是 JSP Standard Tag Library(JSP標準標簽庫),是官方提供的一套現成的“標簽工具”,專門用來簡化JSP頁面的開發。用它可以少寫很多Java代碼,讓頁面更干凈、更易讀。
- SQL標簽:是JSTL里專門用來操作數據庫的一組標簽,比如連接數據庫、執行SQL語句、處理查詢結果等。
2.為什么要用SQL標簽?
假設你不用標簽,直接在JSP里寫Java代碼連數據庫,會像這樣(非常麻煩):
<%
Class.forName("com.mysql.cj.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "123456");
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM users");
// 然后循環取數據...
rs.close(); stmt.close(); conn.close();
%>
而用 SQL標簽,只需要幾行標簽代碼就能搞定,不用寫復雜的Java連接邏輯,對新手更友好!
3.第一步:引入SQL標簽庫
要使用SQL標簽,必須先在JSP頁面頂部“告訴瀏覽器”:我要用這個標簽庫!
添加一行代碼(固定格式,記住就行):
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
prefix="sql"
:給標簽庫起個簡稱,后面用標簽時都以<sql:XXX>
形式調用(比如<sql:setDataSource>
)。uri
:標簽庫的“地址”,固定值,直接復制就行
4. SQL標簽的核心功能:連接數據庫
連接數據庫是操作數據的第一步,SQL標簽里用 <sql:setDataSource>
標簽 來配置數據庫信息,就像“告訴標簽庫你的數據庫在哪、怎么登錄”。
標簽常用屬性:
屬性名 | 作用 | 示例值(以MySQL為例) |
---|---|---|
driver | 數據庫驅動類(必須寫對!) | com.mysql.cj.jdbc.Driver |
url | 數據庫地址(格式固定) | jdbc:mysql://localhost:3306/數據庫名 |
user | 數據庫用戶名 | root |
password | 數據庫密碼 | 123456 |
示例代碼(連接到名為“test”的數據庫):
<sql:setDataSource driver="com.mysql.cj.jdbc.Driver"url="jdbc:mysql://localhost:3306/test"user="root"password="123456" var="dbConn" <!-- 給這個連接起個變量名,后面用 -->
/>
- 注意:需要提前把MySQL的JDBC驅動包(比如
mysql-connector-java-8.0.28.jar
)放到項目的WEB-INF/lib
目錄下,否則會報錯!
二、實例演示
接下來我們來實戰一下
- 題目要求創建一張HTML圖片上的表,并且利用SQL標簽庫實現 MySQL 數據庫連接,將數據庫表中的信息打印到顯示器上
第一步:加入驅動包
- 首先我們按照之前的那樣加入jsp,jdbc的驅動包來構建環境
<dependencies><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency><dependency><groupId>javax.servlet.jsp</groupId><artifactId>javax.servlet.jsp-api</artifactId><version>2.3.3</version><scope>provided</scope></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version></dependency><!-- jstl表達式依賴--><dependency><groupId>javax.servlet.jsp.jstl</groupId><artifactId>jstl-api</artifactId><version>1.2</version></dependency><!-- taglibs 標簽庫依賴--><dependency><groupId>taglibs</groupId><artifactId>standard</artifactId><version>1.1.2</version></dependency></dependencies>
第二步:配置maven
- 接著我們需要配置好自己的maven環境
- maven環境必須是全英文,不然運行不了
我的jsp環境搭建博客
JSP技術入門指南【一】利用IDEA從零開始搭建你的第一個JSP系統
https://blog.csdn.net/2402_83322742/article/details/146980845?spm=1001.2014.3001.5501
Java-servlet-Web環境搭建(下)詳細講解利用maven和tomcat搭建Java-servlet環境
https://blog.csdn.net/2402_83322742/article/details/145998804
第三步:創建并導入web庫
- 我們新建了一個MySQLtest的模塊,在里面單擊右鍵,打開模板設置
- 在MySQLtest里面添加web文件
- 然后在工件里,找到web應用程序展開型,找到我們剛剛添加的MySQLweb文件
- 在web-INF文件里創建一個lib文件,并導入我們的庫文件
第四步:導入jsp文件
- 首先創建jsp文件
-
- 導入我們的HTML代碼
<%--Created by IntelliJ IDEA.User: DELLDate: 2025/5/13Time: 20:34To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1 , user-scalable=no"><title>pha-Admin</title><link rel="stylesheet" href="css/bootstrap.min.css"/><link rel="stylesheet" href="css/bootstrap-maizi.css"/><link rel="stylesheet" href="css/content-style.css"/><link rel="stylesheet" href="css/mricode.pagination.css"/><link rel="stylesheet" href="css/jquery.fancybox.css"/><link rel="stylesheet" href="css/sweetalert.css"/>
</head>
<body>
<!--導航-->
<nav class="navbar navbar-inverse navbar-fixed-top"><div class="container"><!--小屏幕導航按鈕和logo--><div class="navbar-header"><button class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse"><span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span></button><a href="index.html" class="navbar-brand"> pha-Admin</a></div><!--小屏幕導航按鈕和logo--><!--導航--><div class="navbar-collapse collapse"><ul class="nav navbar-nav"><li><a href="index.html"><span class="glyphicon glyphicon-home"></span> 后臺首頁</a></li><li><a href="user.html"><span class="glyphicon glyphicon-user"></span> 用戶管理</a></li><li class="active"><a href="machine.html"><span class="glyphicon glyphicon-expand"></span> 機器管理</a></li><li><a href="service.html"><span class="glyphicon glyphicon-tasks"></span> 服務管理</a></li><li><a href="log.html"><span class="glyphicon glyphicon-list-alt"></span> 日志管理</a></li><li><a href="wiki.html"><span class="glyphicon glyphicon-book"></span> 使用文檔</a></li></ul><ul class="nav navbar-nav navbar-right"><li class="dropdown"><a id="dLabel" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">admin<span class="caret"></span></a><ul class="dropdown-menu" aria-labelledby="dLabel"><li><a href="index.html"><span class="glyphicon glyphicon-cog"></span> 個人設置</a></li></ul></li><li><a href="#bbs"><span class="glyphicon glyphicon-off"></span> 退出</a></li></ul></div><!--導航--></div>
</nav>
<!--導航-->
<div class="container"><div class="row"><div class="col-md-12"><div class="panel-body" style="padding: 15px 0;"><ul class="nav nav-tabs"><li class="active"><a href="#list" aria-controls="machine" role="tab" data-toggle="tab">機器列表</a></li><li><a href="#form" aria-controls="machine" role="tab" data-toggle="tab">添加機器</a></li></ul></div><div class="tab-content"><div role="tabpanel" class="tab-pane active" id="list"><div class="panel-body"><div class="row"><form><div class="col-md-3 col-lg-offset-9"><div class="input-group"><input class="form-control" type="text" value="" placeholder="用戶名" name="keyword"><span class="input-group-btn"><button type="submit" class="btn btn-primary"><i class="glyphicon glyphicon-search"></i></button></span></div></div></form></div></div><div class="panel panel-default"><div class="table-responsive"><table class="table table-bordered"><thead><tr><th class="w8p">id</th><th class="w18p">域名</th><th class="w18p">ip</th><th class="w13p">sphinx路徑</th><th class="w10p">備注</th><th class="w15p">創建時間</th><th class="w15p">操作</th></tr></thead><tbody><tr><td class="center">1</td><td>sphinx.test.com.cn</td><td>192.168.128.12</td><td>/usr/local/sphinx</td><td class="center">主機</td><td class="center">2017-03-28 12:21:09</td><td class="center"><a name="remove" onclick="Common.confirm('確認要刪除嗎?')"><i class="glyphicon glyphicon-remove"></i>刪除</a></td></tr><tr><td class="center">2</td><td>sphinx.test.com.cn</td><td>192.168.128.13</td><td>/usr/local/sphinx</td><td class="center">備機</td><td class="center">2017-03-28 12:21:09</td><td class="center"><a name="remove" onclick="Common.confirm('確認要屏蔽嗎?')"><i class="glyphicon glyphicon-remove"></i>刪除</a></td></tr><tr><td class="center">3</td><td>sphinx.video.com.cn</td><td>192.168.158.13</td><td>/usr/local/sphinx</td><td class="center">主機</td><td class="center">2017-03-28 12:21:09</td><td class="center"><a name="remove" onclick="Common.confirm('確認要屏蔽嗎?')"><i class="glyphicon glyphicon-remove"></i>刪除</a></td></tr><tr><td class="center">4</td><td>sphinx.test.com.cn</td><td>192.168.158.14</td><td>/usr/local/sphinx</td><td class="center">備機</td><td class="center">2017-03-28 12:21:09</td><td class="center"><a name="remove" onclick="Common.confirm('確認要屏蔽嗎?')"><i class="glyphicon glyphicon-remove"></i>刪除</a></td></tr></tbody></table></div><div class="panel-footer"><div class="row"><div class="col-md-8 m-pagination" id="paginator"></div></div></div></div></div><div role="tabpanel" class="tab-pane" id="form"><div class="panel-body"><form class="form-horizontal"><div class="form-group"><label class="col-sm-1 control-label"><span class="text-danger"></span>域名</label><div class="col-sm-4"><input type="text" name="username" class="form-control" placeholder="機器域名" required></div></div><div class="form-group"><label class="col-sm-1 control-label"><span class="text-danger"> * </span>IP</label><div class="col-sm-4"><input type="email" name="email" class="form-control" placeholder="機器ip" required></div></div><div class="form-group"><label class="col-sm-1 control-label"><span class="text-danger"> * </span>Sphinx<br>安裝目錄</label><div class="col-sm-4"><input type="text" name="sphinx_path" class="form-control" placeholder="sphinx安裝目錄"></div></div><div class="form-group"><label class="col-sm-1 control-label"><span class="text-danger"></span>備注信息</label><div class="col-sm-4"><input type="text" class="form-control" placeholder="備注" required></div></div><div class="form-group"><div class="col-sm-offset-1 col-sm-10"><button type="submit" onclick="" class="btn btn-success">保存</button></div></div></form><hr></div></div></div></div></div>
</div>
<!--footer-->
<footer><div class="container"><div class="row"><div class="col-md-12"><p class="text-muted center">Copyright ? 2017-2018 phachon@163.com </p></div></div></div>
</footer>
<!--footer-->
<script src="js/plugins/jquery/jquery.js"></script>
<script src="js/bootstrap.min.js"></script>
<script src="js/plugins/pagination/mricode.pagination.js"></script>
<script src="js/plugins/fancybox/jquery.fancybox.js"></script>
<script src="js/plugins/sweetalert/sweetalert.min.js"></script>
<script src="js/common/common.js"></script>
<script src="js/module/account.js"></script>
<script type="text/javascript">var pageData = [];pageData.push({'pageSize': '10', 'total': '1000', 'pageIndex': '2'});Common.paginator("#paginator", pageData);Account.bindFancyBox();
</script>
</body>
</html>
- 可以看到HTML中
<table class="table table-bordered"><thead><tr><th class="w8p">id</th><th class="w18p">域名</th><th class="w18p">ip</th><th class="w13p">sphinx路徑</th><th class="w10p">備注</th><th class="w15p">創建時間</th><th class="w15p">操作</th></tr></thead><tbody><tr><td class="center">1</td><td>sphinx.test.com.cn</td><td>192.168.128.12</td><td>/usr/local/sphinx</td><td class="center">主機</td><td class="center">2017-03-28 12:21:09</td><td class="center"><a name="remove" onclick="Common.confirm('確認要刪除嗎?')"><i class="glyphicon glyphicon-remove"></i>刪除</a></td></tr><tr><td class="center">2</td><td>sphinx.test.com.cn</td><td>192.168.128.13</td><td>/usr/local/sphinx</td><td class="center">備機</td><td class="center">2017-03-28 12:21:09</td><td class="center"><a name="remove" onclick="Common.confirm('確認要屏蔽嗎?')"><i class="glyphicon glyphicon-remove"></i>刪除</a></td></tr><tr><td class="center">3</td><td>sphinx.video.com.cn</td><td>192.168.158.13</td><td>/usr/local/sphinx</td><td class="center">主機</td><td class="center">2017-03-28 12:21:09</td><td class="center"><a name="remove" onclick="Common.confirm('確認要屏蔽嗎?')"><i class="glyphicon glyphicon-remove"></i>刪除</a></td></tr><tr><td class="center">4</td><td>sphinx.test.com.cn</td><td>192.168.158.14</td><td>/usr/local/sphinx</td><td class="center">備機</td><td class="center">2017-03-28 12:21:09</td><td class="center"><a name="remove" onclick="Common.confirm('確認要屏蔽嗎?')"><i class="glyphicon glyphicon-remove"></i>刪除</a></td></tr></tbody></table>
只能是靜態的,接下來我們需要將這里的代碼修改為與數據庫連接,并遍歷打印數據庫里面表的信息
第五步:根據jsp文件格式創建數據庫
- 完成上面的代碼之后,我們接著創建一個數據庫,點擊數據庫按鈕
- 然后找到加號,點擊數據源,找到MySQL
- 在里面輸入我們的密碼和用戶名
- 找到部署架構,里面就有我們的數據庫文件
- 在數據庫里根據我們的HTML表格格式創建一張表
- 新建查詢語句
CREATE TABLE sphinx_info (id INT AUTO_INCREMENT PRIMARY KEY,domain VARCHAR(255) NOT NULL,ip VARCHAR(45) NOT NULL,sphinx_path VARCHAR(255) NOT NULL,remark VARCHAR(255) NOT NULL,create_time DATETIME NOT NULL,operation VARCHAR(20)
);
- 然后加入數據
INSERT INTO sphinx_info (domain, ip, sphinx_path, remark, create_time, operation)
VALUES
('sphinx.demo1.com', '192.168.100.1', '/usr/local/sphinx', '主機', '2025-05-13 09:30:00', '?刪除'),
('sphinx.demo2.net', '192.168.100.2', '/usr/local/sphinx', '備機', '2025-05-13 09:35:00', '?刪除'),
('sphinx.demo3.org', '192.168.100.3', '/usr/local/sphinx', '主機', '2025-05-13 09:40:00', '?刪除'),
('sphinx.demo4.cn', '192.168.100.4', '/usr/local/sphinx', '備機', '2025-05-13 09:45:00', '?刪除'),
('sphinx.demo5.io', '192.168.100.5', '/usr/local/sphinx', '主機', '2025-05-13 09:50:00', '?刪除');
第六步:利用SQL標簽庫實現MySQL數據庫連接
- 首先在表頭添加
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>//核心標簽聲明<c:forEach>屬于 JSTL 核心標簽庫,必須顯式聲明才能使用。若缺少此聲明,會導致標簽無法解析,數據無法遍歷顯示
- 然后找到我們的jsp文件,將里面需要修改的代碼
<tbody><tr><td class="center">1</td><td>sphinx.test.com.cn</td><td>192.168.128.12</td><td>/usr/local/sphinx</td><td class="center">主機</td><td class="center">2017-03-28 12:21:09</td><td class="center"><a name="remove" onclick="Common.confirm('確認要刪除嗎?')"><i class="glyphicon glyphicon-remove"></i>刪除</a></td></tr><tr><td class="center">2</td><td>sphinx.test.com.cn</td><td>192.168.128.13</td><td>/usr/local/sphinx</td><td class="center">備機</td><td class="center">2017-03-28 12:21:09</td><td class="center"><a name="remove" onclick="Common.confirm('確認要屏蔽嗎?')"><i class="glyphicon glyphicon-remove"></i>刪除</a></td></tr><tr><td class="center">3</td><td>sphinx.video.com.cn</td><td>192.168.158.13</td><td>/usr/local/sphinx</td><td class="center">主機</td><td class="center">2017-03-28 12:21:09</td><td class="center"><a name="remove" onclick="Common.confirm('確認要屏蔽嗎?')"><i class="glyphicon glyphicon-remove"></i>刪除</a></td></tr><tr><td class="center">4</td><td>sphinx.test.com.cn</td><td>192.168.158.14</td><td>/usr/local/sphinx</td><td class="center">備機</td><td class="center">2017-03-28 12:21:09</td><td class="center"><a name="remove" onclick="Common.confirm('確認要屏蔽嗎?')"><i class="glyphicon glyphicon-remove"></i>刪除</a></td></tr></tbody>
- 修改為我們的 SQL 標簽庫實現 的代碼
<tbody><!-- 配置數據源 --><sql:setDataSourcevar="dbConn"driver="com.mysql.cj.jdbc.Driver"url="jdbc:mysql://localhost:3306/2023se3"user="root"password="123456"/><!-- 執行查詢 --><sql:query dataSource="${dbConn}" var="sphinxRs">SELECT id, domain, ip, sphinx_path, remark, create_time, operationFROM sphinx_info</sql:query><!-- 遍歷結果 --><c:forEach items="${sphinxRs.rows}" var="row"><tr><td class="center">${row.id}</td><td>${row.domain}</td><td>${row.ip}</td><td>${row.sphinx_path}</td><td class="center">${row.remark}</td><td class="center">${row.create_time}</td><td class="center"><a href="deleteSphinx.jsp?id=${row.id}" onclick="return confirm('確認要刪除嗎?')"><i class="glyphicon glyphicon-remove"></i>${row.operation}</a></td></tr></c:forEach></tbody>
- 下面我們來詳細講解一下代碼
<sql:setDataSourcevar="dbConn"driver="com.mysql.cj.jdbc.Driver"url="jdbc:mysql://localhost:3306/2023se3"user="root"password="123456"
/>
- 借助
<sql:setDataSource>
標簽,創建了一個名為dbConn
的數據源對象。 - 該對象使用 MySQL 驅動程序,連接到本地 3306 端口的
2023se3
數據庫,登錄用戶為root
,密碼是123456
。
<sql:query dataSource="${dbConn}" var="sphinxRs">SELECT id, domain, ip, sphinx_path, remark, create_time, operationFROM sphinx_info
</sql:query>
- 利用
<sql:query>
標簽執行 SQL 查詢操作。 - 從
sphinx_info
表中選取 7 個字段的數據。 - 查詢結果會存放在
sphinxRs
變量里,這個變量是一個包含多行數據的集合。
<c:forEach items="${sphinxRs.rows}" var="row"><tr><td class="center">${row.id}</td><td>${row.domain}</td><td>${row.ip}</td><td>${row.sphinx_path}</td><td class="center">${row.remark}</td><td class="center">${row.create_time}</td><td class="center"><a href="deleteSphinx.jsp?id=${row.id}" onclick="return confirm('確認要刪除嗎?')"><i class="glyphicon glyphicon-remove"></i>${row.operation}</a></td></tr>
</c:forEach>
-
<c:forEach>
標簽會遍歷結果集里的每一行數據。 -
針對每一行數據,都會生成一個
<tr>
(表格行)。 -
每個
<td>
(表格單元格)會顯示對應字段的值,像 ID、域名、IP 等。 -
最后一列是操作列,包含一個刪除鏈接,點擊該鏈接會調用
deleteSphinx.jsp
并附帶當前行的 ID。 -
onclick
事件會彈出確認對話框,防止用戶誤操作。 -
然后點擊運行
-
可以看到我們的數據庫信息成功打印到屏幕上了
以上就是這篇博客的全部內容,下一篇我們將繼續探索JSP的更多精彩內容。
我的個人主頁,歡迎來閱讀我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343
我的JSP知識文章專欄
歡迎來閱讀指出不足
https://blog.csdn.net/2402_83322742/category_12950980.html?spm=1001.2014.3001.5482
非常感謝您的閱讀,喜歡的話記得三連哦 |