JavaWeb_原始項目初識(一)

Students2025項目(一)

原始Servlet+JSP架構項目初步搭建

jsp項目已被淘汰,在此學習目的是了解未來學習的新技術的底層原理
項目結構:

在這里插入圖片描述

項目結構介紹:
目前階段只完成了初始化的后端搭建,實現從本地數據庫獲取數據在瀏覽器顯示
項目大體運行流程為Global->StudentServlet->StudentService->StudentDao,StudentDao層層將獲取的數據回傳一直到StudentServlet,然后請求轉發到list.jsp在jsp頁面中通過JSEL讀入提前寫好的html表格(model的Student類為數據模型,存放類的屬性和get、set方法)
接下來按項目大體運行流程的順序介紹各部分

Global
package com.example.common;import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.SimpleDriverDataSource;
import javax.sql.DataSource;
import java.sql.Driver;
import java.sql.SQLException;
import java.util.Date;public class Global {//驅動名private static final String JDBC_DRIVER="com.mysql.cj.jdbc.Driver";
//    數據庫鏈接字符串private static final String JDBC_URL="jdbc:mysql://localhost:3306/students2025?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true";private static final String JDBC_USERNAME="root";private static final String JDBC_PASSWORD="123456";//獲取數據源  數據庫連接池private static DataSource dataSource = null;//獲取數據源  數據庫連接池public static DataSource getDataSource() throws SQLException {if (dataSource==null){Driver driver = new com.mysql.cj.jdbc.Driver();dataSource = new SimpleDriverDataSource(driver,JDBC_URL,JDBC_USERNAME,JDBC_PASSWORD);}return dataSource;}//spring提供的jdbc模板操作類public static JdbcTemplate getJdbcTemplate()  {try {return new JdbcTemplate(getDataSource());} catch (SQLException e) {throw new RuntimeException(e);}}
}

作用:

初始化數據庫連接,創建數據庫連接池,如果連接池為空,就按參數新建一個連接,JdbcTemplate 是 Spring JDBC 模塊的核心類,通過get數據源創建 JdbcTemplate 實例,在StudentDao中被調用

數據庫連接池:
用于在應用程序啟動時創建一定數量的數據庫連接,并將這些連接保存在一個"池"中,供應用程序隨時取用。當應用程序需要與數據庫交互時, 不是新建一個連接,而是從連接池中獲取一個空閑連接,使用完畢后再歸還給連接池,而不是關閉它。

StudentService
package com.example.servlet;import com.example.model.Student;
import com.example.service.impl.StudentServiceImpl;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;import java.io.IOException;
import java.util.List;@WebServlet("/admin/student/*")
public class StudentServlet  extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String action =   req.getPathInfo();if("/list".equals(action)){StudentServiceImpl studentService =new StudentServiceImpl();List<Student> students = studentService.findAll();//放到請求域req.setAttribute("students",students);req.getRequestDispatcher("/WEB-INF/jsp/student/list.jsp").forward(req,resp);}}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//todo}
}

作用:

處理http請求, 用戶訪問URL:
/admin/student/list,if判斷用戶輸入地址是不是/admin/student//list,如果是,創建StudentServiceImpl對象,調用findall方法,將獲取到的數據存到List中,然后將名為students的集合存放到request請求域中,然后request調用請求轉發方法將students轉發到/WEB-INF/jsp/student/list.jsp。

StudentServiceImpl和StudentService
package com.example.service.impl;import com.example.dao.impl.StudentDaoImpl;
import com.example.model.Student;
import com.example.service.StudentService;import java.util.List;public class StudentServiceImpl  implements StudentService {@Overridepublic List<Student> findAll() {StudentDaoImpl studentDaoImpl = new StudentDaoImpl();return studentDaoImpl.findAll();}
}
package com.example.service;import com.example.model.Student;import java.util.List;public interface StudentService {//查詢所有學生List<Student> findAll();
}

StudentServiceImpl是StudentService的實現,StudentService接口定義了findAll的抽象方法,
StudentServiceImpl實現這個抽象方法,在方法中創建new
StudentDaoImpl()對象,調用了studentDaoImpl.findAll()方法,在studentDaoImpl.findAll()的方法體內真正實現了查找功能實現。

StudentDaoImpl和 StudentDao
package com.example.dao.impl;import com.example.common.Global;
import com.example.dao.StudentDao;
import com.example.model.Student;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
//數據倉庫
public class StudentDaoImpl implements StudentDao {@Overridepublic List<Student> findAll() {JdbcTemplate jdbcTemplate= Global.getJdbcTemplate();String sql ="select id,stu_id,name,sex,birthday,pinyin,phone,email,qq,wechat from t_student limit 20";RowMapper<Student> rowMapper =new BeanPropertyRowMapper<>(Student.class);List<Student> students = jdbcTemplate.query(sql, rowMapper);return students;}
}
package com.example.dao;import com.example.model.Student;import java.util.List;public interface StudentDao {List<Student> findAll();
}

作用:負責與數據庫直接交互
StudentDao 的findAll方法是這幾個類層層調用的最底層的findAll抽象方法,也就是上面介紹的findAll方法層層調用,最終都是調的這個findAll方法,首先獲取JdbcTemplate實例通過Global.getJdbcTemplate()獲取Spring的JdbcTemplate,JdbcTemplate是Spring對JDBC的核心封裝,簡化了數據庫操作,然后定義sql查詢,查詢t_student表中的20條記錄,然后創建RowMapper,BeanPropertyRowMapper是Spring提供的實現類,自動將結果集的列映射到Student對象的屬性,也就是將結果集列名轉換為屬性名(stu_id → stuId),jdbcTemplate.query(sql, rowMapper)執行sql語句存到集合里并返回

Student
package com.example.model;import lombok.Getter;
import lombok.Setter;import java.time.LocalDate;
//這兩個注解相當于getset方法
@Getter
@Setter
public class Student {private Integer id;private String stuId;private String name;private String pinyin;private String sex;private String qq;private String email;private String phone;private String wechat;private LocalDate birthday;}

作用:
定義了Student類的數據模型,屬性,通過@Getter和@Setter注解簡便實現get和set方法

剩余流程分析

在StudentDaoImpl里將查詢結果list列表student結果進行層層返回,最終到StudentServlet的List students = studentService.findAll();中,也是存到list集合里,然后通過 req.setAttribute(“students”,students);放到請求域中,再請求轉發到
“/WEB-INF/jsp/student/list.jsp”

在list.jsp中有如下代碼:

<%--Created by IntelliJ IDEA.User: LenovoDate: 2025/7/24Time: 15:16To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--引入標簽庫,固定語法--%>
<%@taglib prefix="c" uri="jakarta.tags.core" %>
<html>
<head><title>Title</title>
</head>
<body>
<table id="tbl"><thead><tr><th>ID</th><th>學號</th><th>姓名</th><th>拼音</th><th>性別</th><th>出生日期</th><th>手機號</th><th>微信號</th><th>郵箱</th><th>QQ</th></tr></thead><tbody>
<%--    遍歷名為"students"的集合(由Servlet通過req.setAttribute("students",students)設置)--%><c:forEach items="${students}" var="s"><tr><td>${s.id}</td><td>${s.stuId}</td><td>${s.name}</td><td>${s.pinyin}</td><td>${s.sex}</td><td>${s.birthday}</td><td>${s.phone}</td><td>${s.wechat}</td><td>${s.email}</td><td>${s.qq}</td></tr></c:forEach></tbody>
</table>
</body>
</html>

<c:forEach items=“${students}” var=“s”>遍歷傳入的名為student的list集合,獲取各個屬性放入提前寫好的表格中

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/90303.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/90303.shtml
英文地址,請注明出處:http://en.pswp.cn/web/90303.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

前端_CSS復習

文章目錄CSS復習1. css三種引入方式1.1 行內樣式常用樣式&#xff1a;1.2頁內樣式常見選擇器&#xff1a;1. 標記選擇器2. id選擇器3. 類選擇器&#xff08;最常用&#xff09;4. 星號選擇器&#xff0c;頻率很低5. 復合選擇器6. 偽類選擇器&#xff1a;7. 子元素偽類1.3引入外…

工業互聯網時代,如何通過混合SD-WAN提升煤炭行業智能化網絡安全

1. 背景&#xff1a;煤炭行業智能化轉型的網絡挑戰隨著工業互聯網技術的普及&#xff0c;煤炭行業智能化轉型進入加速期。選煤廠作為煤炭生產的核心環節&#xff0c;需要構建一套既安全又高效的網絡系統&#xff0c;以滿足工業控制系統&#xff08;ICS&#xff09;、智能設備和…

AI浪潮下數據中心的突圍者:臺達DPH Gen3系列UPS如何重構供電架構

2025年6月13日&#xff0c;臺達-中達電通資通訊基礎設施事業部聯合中國數據中心工作組&#xff08;CDCC&#xff09;在江蘇吳江舉辦"數據中心供配電技術革新與AI算力基礎設施未來展望研討會"&#xff0c;同時開展CDCC專家組工廠參觀。盛會匯聚了數據中心行業專家、互…

DiffServ服務模型與DS碼點詳解

1. DiffServ概述 DiffServ(Differentiated Services&#xff0c;差異化服務)是IETF定義的一種QoS(Quality of Service)體系結構&#xff0c;旨在為IP網絡提供可擴展的服務區分能力。與傳統的IntServ(集成服務)模型不同&#xff0c;DiffServ采用簡單、粗粒度的流量分類機制&…

基于 PIC16 系列的多功能電子煙(溫控 + 電壓控制 + 多模式)方案

基于 PIC16 系列的多功能電子煙&#xff08;溫控 電壓控制 多模式&#xff09;方案 一、芯片與最小系統推薦型號&#xff1a;PIC16F18313/18323 8-bit 內核&#xff0c;14/20-pin 小封裝&#xff0c;成本低28 MHz 內部振蕩&#xff0c;帶 10-bit ADC&#xff08;12 通道&…

小模數齒輪的加工方法有哪些?

小模數齒輪(一般指0.3≤Mn≤1)的加工方法有哪些呢&#xff1f;小模數齒輪的加工方法主要分為減材、增材、變形加工三類&#xff1a; 去材料制造 有銑齒、滾齒、插齒、刨齒、剃齒、拉齒、沖齒、研磨、珩齒、磨齒及其拋光、線切割等。 增材制造 有注塑&#xff08;塑料、尼龍&…

若依前后端分離版學習筆記(二)——系統菜單介紹

前言&#xff1a; 這一節是將ruoyi的前端界面過一遍&#xff0c;查看所有系統菜單及頁面功能&#xff0c;為后續代碼學習做準備。&#xff08;注意&#xff1a;文中包含大量截圖&#xff0c;截圖為從本地啟動的3.9.0 vue3的前端界面。&#xff09; 一 系統管理 1 用戶管理 主要…

VRRP技術-設備備份技術

一、VRRP的概念及應用場景1.定義在 VRRP&#xff08;虛擬路由冗余協議&#xff09;中&#xff0c;將多個路由器邏輯上看作一個路由器時所使用的虛擬 IP 地址&#xff0c;需要滿足以下要求&#xff1a;這個虛擬 IP 地址必須與該 VRRP 組內所有物理路由器的接口 IP 地址處于同一網…

VUE2 學習筆記5 動態綁定class、條件渲染、列表過濾與排序

動態綁定class樣式&#xff1a;先設置css&#xff1a;<style>.styleBackgroundColor{background-color: aqua;}.styleContent{width:300px;height: 200px;}.styleBorder{border: 2px black solid;}</style>vue模版中&#xff0c;使用動態類名綁定&#xff0c;一般可…

推客系統全棧開發指南:從架構設計到高并發實戰

一、推客系統概述與市場前景推客系統&#xff08;也稱為"推客營銷系統"或"社交電商系統"&#xff09;是近年來快速崛起的社交化營銷工具&#xff0c;它通過整合社交網絡與電子商務功能&#xff0c;讓每個用戶都能成為產品的推廣者并獲得相應獎勵。市場數據…

RabbitMQ有多少種Exchange?

面試回答模板 “RabbitMQ 在 AMQP 協議中預定義了 四種常用交換機 兩種特殊類型&#xff0c;共 6 種&#xff1a; Direct&#xff1a;routing-key 全等匹配&#xff1b;Fanout &#xff1a;廣播&#xff0c;忽略 key&#xff1b;Topic&#xff1a;按 *.# 通配符匹配&#xff1…

ctfshow pwn43

1. 分析程序首先檢查程序相關保護&#xff0c;發現程序為32位且只開啟了一個NX保護checksec pwn使用IDA進行逆向分析代碼&#xff0c;查看漏洞觸發點&#xff1a;在main函數中&#xff0c;有一個ctfshow函數&#xff0c;這里我們跟進ctfshow()發現存在一個gets()函數&#xff0…

內網IM:BeeWorks私有化部署的安全通訊解決方案

在當今數字化辦公環境中&#xff0c;內網IM已成為企業保障數據安全的核心工具。BeeWorks作為一款支持私有化部署的內網IM解決方案&#xff0c;能夠幫助企業構建完全自主可控的通訊系統。無論是政府機構、金融機構&#xff0c;還是對數據安全要求極高的企業&#xff0c;BeeWorks…

SHA512算法詳解

SHA-512 是 SHA-2&#xff08;Secure Hash Algorithm 2&#xff09;系列密碼散列函數的重要成員&#xff0c;由美國國家安全局&#xff08;NSA&#xff09;設計&#xff0c;2001 年被納入 NIST&#xff08;美國國家標準與技術研究院&#xff09;的 FIPS 180 標準&#xff0c;后…

通過python管理vcenter中的虛擬機

通過python管理vcenter中的虛擬機因業務需要&#xff0c;需在夜間關閉虛擬機&#xff0c;隨通過計劃任務遠程管理開機、關機虛擬機一、通過docker配置python3.9環境 Dockerfile FROM python:3.9 RUN pip3 install pyvmomi7.0.0創建自定義鏡像 docker build -t pyvmomi7:v1 .二…

AWS S3 生命周期管理最佳實踐:IoT Core 日志的智能存儲優化

在現代物聯網應用中,設備日志數據的管理是一個重要挑戰。隨著設備數量的增長,日志數據量呈指數級增長,如何有效管理這些數據的存儲成本成為關鍵問題。本文將分享如何為 AWS IoT Core 日志實施智能生命周期管理策略。 背景與挑戰 IoT 設備產生的日志數據具有以下特點: 數據…

18.TaskExecutor獲取ResourceManagerGateway

TaskExecutor獲取ResourceManagerGatewayTaskExecutor 與 ResourceManager 之間的交互機制較為復雜&#xff0c;核心可以拆分為三個階段&#xff1a; 首次發現與注冊連接建立心跳維持 本文聚焦連接建立階段&#xff0c;詳細分析底層 RPC 連接的實現原理。回顧&#xff1a;start…

kafka查看消息的具體內容 kafka-dump-log.sh

目錄kafka 消息查看1. 直接查看日志文件內容步驟&#xff1a;2. 使用 Kafka 工具查看日志主要參數說明常用命令&#xff1a;輸出說明&#xff1a;3. 注意事項kafka 消息日志文件詳解我們有時候遇到這樣的需求&#xff0c;需要查看下kafka消息的內容。 kafka 消息查看 查看 Ka…

Spring Cloud OpenFeign 常用注解_筆記

Spring Cloud OpenFeign 提供了一種聲明式、模板化的HTTP客戶端&#xff0c;可以通過簡單的接口描述遠程調用&#xff0c;而不必手動編寫低級的 HTTP 客戶端代碼。FeignClient用法參考&#xff1a;FeignClient用法-筆記-CSDN博客。這里梳理Spring Cloud OpenFeign 常用注解。 1…

移動端自動化Appium框架

文章目錄環境搭建JAVAAndroid SDKGenymotion模擬器環境搭建 JAVA 1、安裝JDK 從官網下載所需安裝包&#xff0c;默認安裝即可。 https://www.oracle.com/cn/java/technologies/downloads/ 2、配置環境變量 設置 - 編輯系統環境變量 - 環境變量。 系統變量下新建JAVA_HOME&a…