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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…