记SpringBoot3.x + Thymeleaf 项目实现(MVC架构模式)

目录

前言

一、创建SpringBoot项目

1. 创建项目

2. 运行项目

二、连接数据库实现登录

1. pom.xml文件引入依赖包

2. application.yml文件配置

3. 数据持久层,mybatis操作映射

4. Service接口及实现

5. Controller代码

6. Thymeleaf页面登录

7. 运行项目

8. 补充说明一下Controller中参数的接收

总结


前言

SpringBoot很多人都比较熟悉了,今天再从头来一次项目创建及使用。顺带做一次文章记录。


一、创建SpringBoot项目

1. 创建项目

IDEA 2021 创建:SpringBoot默认jar包格式、选择JDK17往上才能匹配SpringBoot3.x。

点击Next下一步后:选择springboot3.0.2版本、勾选Spring Web起步依赖。

得到项目结构如下:(已经是一个基础的MVC架构模式了)

2. 运行项目

应为项目目前已经是一个基础的MVC架构模式了,所以不用多做什么就可以直接运行了。

yml文件配置:

BasicController控制器代码:

SpringBoot项目是运行@SpringBootApplication注解的类(WqinfoApplication.java):

我们访问地址:http://127.0.0.1:8080/html得到如下结果:

网页结果:访问BasicController控制器中的/html请求映射到了index.html页面显示。

相当的简单就搭建运行起了一个项目。这就是SpringBoot。

二、连接数据库实现登录

1. pom.xml文件引入依赖包

        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>3.0.4</version></dependency><dependency><groupId>com.oracle.database.jdbc</groupId><artifactId>ojdbc8</artifactId><scope>runtime</scope></dependency><dependency><groupId>cn.easyproject</groupId><artifactId>orai18n</artifactId><version>12.1.0.2.0</version></dependency>

2. application.yml文件配置

3. 数据持久层,mybatis操作映射

package com.wq.wqinfo.persistence;import com.wq.wqinfo.domain.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;/*** @author lv* @date 2025年8月11日10点01分* 数据持久层,mybatis操作映射*/
@Mapper
public interface UserMapper {/*** 根据用户名查询* @param username 用户名* @return*/@Select("select * from SYS_USER where USERNAME=#{username}")User findByUsername(String username);
}

4. Service接口及实现

package com.wq.wqinfo.service;import com.wq.wqinfo.domain.User;/*** @author lv* @date 2025年8月11日10点22分* 业务层接口类*/
public interface UserService {/**** @param user* @return*/public String login(User user);
}
package com.wq.wqinfo.service.impl;import com.wq.wqinfo.domain.User;
import com.wq.wqinfo.persistence.UserMapper;
import com.wq.wqinfo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.UUID;/*** @author lv* @date 2025年8月11日10点22分* 业务层接口类*/
@Service
public class UserServiceImpl implements UserService {/*** 注入UserMapper获取数据库用户信息*/@Autowiredprivate UserMapper userMapper;@Overridepublic String login(User user) {System.out.println("UserServiceImpl-login-----" + user);User user2=userMapper.findByUsername(user.getUsername());System.out.println("用户查询----用户名:" + user2.getUsername()+",密码:"+ user2.getPassword());if(user2!=null){ //省略了密码对比环节//生成tokenString token= UUID.randomUUID().toString();return token;}return null;}}

5. Controller代码

package com.wq.wqinfo.controller;import com.wq.wqinfo.domain.User;
import com.wq.wqinfo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;/*** @author lv* @date 2025年8月11日16点10分* 业务层接口类*/
@Controller
@RequestMapping("/user")
public class UserController {//自动装配@Autowiredprivate UserService userService;/*** 登录* @param username* @param password* @param model* @return*/@PostMapping("/login")public String login(String username, String password, Model model){System.out.println("------login.............."+username+"---"+password);User user=new User();user.setUsername(username);user.setPassword(password);String token=  userService.login(user);System.out.println("....login...token:"+token);if(token!=null){model.addAttribute("msg",user.getUsername()+"登录成功!");return "success";}model.addAttribute("msg",user.getUsername()+"登录失败!");return "error";}@GetMapping("/index")public String index(){System.out.println("用户进入登录页面---------........");return "logins";   //没使用json返回,直接映射到自定义登录的页面}
}

6. Thymeleaf页面登录

logins.html (引入了th,Thymeleaf模板)

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<form th:action="@{/user/login}" method="post"><!--<input type="hidden" name="_csrf" th:value="${_csrf.token}" />--><!--注意:页面提交方式必须为 post 请求,用户名,密码必须为username,password可以通过 usernameParameter()和 passwordParameter()方法修改默认配置-->用户名:<input type="text" name="username"><br/>密码:<input type="text" name="password"><br/><input type="submit" value="login"></form>
</body>
</html>

success.html(引入了th,Thymeleaf模板)

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<span th:text="${msg}"></span>
<h3>success 欢迎你的到来!你成功访问此方法...</h3>
<br> <a href="/logout">退出</a>
</body>
</html>

error.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h3>error 欢迎你的到来!你没有权限访问...</h3>
</body>
</html>

7. 运行项目

访问http://127.0.0.1:8080/user/index

就是访问Controller层的方法/index,映射请求到logins.html登录页面。直接访问页面不能访问到。

输入用户名,密码后登录成功。

8. 补充说明一下Controller中参数的接收

(1)public String login(String username, String password, Model model)

(2)public String login(User user, Model model)--User实体类中包含username和password

以上两种方式都能接收到页面POST的用户名和密码。

传递参数的时候还可以使用注解@PathVariable或@RequestParam:

@PathVariable
获取路径参数。即url/{id}这种形式。


@RequestParam
获取查询参数。即url?name=这种形式。或 psot表单中的参数。

@RequestBody,接收的是请求体里面的数据
当你使用@RequestBody注解时,Spring期望请求的Content-Type头部为application/json。如果请求的Content-Type不是这个值,Spring将无法正确解析请求体中的JSON数据。导致无法请求(POST)到对应的控制层Controller方法。


总结

在这个SpringBoot项目中我也尝试使用过JSP来弄页面,但是可惜我没有弄成功,所以后面也没有坚持了。但是听说是可以弄成功的。没有坚持的原因是:SpringBoot默认不支持 JSP ,因此推荐使用Thymeleaf。Thymeleaf语法更简单,功能更强大,支持HTML、XML、JavaScript等格式,且与Spring框架高度集成。

附加:

最后我又百度了一下两个问题:仅参考一下

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/919194.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/919194.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 导出word 实现表格内插入图表(柱状图、折线图、饼状图)--可编辑数据

表格内插入图表导出效果表格内图表生成流程分析 核心问题与解决方案 问题 Word 图表作为独立对象&#xff0c;容易与文本分离位置难以精确控制&#xff0c;编辑时容易偏移缺乏与表格数据的关联性 解决方案 直接嵌入&#xff1a;将图表嵌入表格单元格&#xff0c;确保数据关联精…

北京JAVA基础面试30天打卡12

1.MySQL中count(*)、count(I)和count(字段名)有什么区别&#xff1f; 1**.COUNT ()**是效率最高的统计方式&#xff1a;COUNT()被优化为常量&#xff0c;直接统计表的所有记录数&#xff0c;不依赖字段内容&#xff0c;开销最低。推荐在统计整个表的记录数时使用。 2.**COUNT(1…

【AI】——结合Ollama、Open WebUI和Docker本地部署可视化AI大语言模型

&#x1f3bc;个人主页&#xff1a;【Y小夜】 &#x1f60e;作者简介&#xff1a;一位双非学校的大三学生&#xff0c;编程爱好者&#xff0c; 专注于基础和实战分享&#xff0c;欢迎私信咨询&#xff01; &#x1f386;入门专栏&#xff1a;&#x1f387;【MySQL&#xff0…

RAG学习(二)

构建索引 一、向量嵌入 向量嵌入&#xff08;Embedding&#xff09;是一种将真实世界中复杂、高维的数据对象&#xff08;如文本、图像、音频、视频等&#xff09;转换为数学上易于处理的、低维、稠密的连续数值向量的技术。 想象一下&#xff0c;我们将每一个词、每一段话、…

亚马逊店铺绩效巡检_影刀RPA源码解读

一、项目简介 本项目是一个基于RPA开发的店铺绩效巡店机器人。该机器人能够自动化地登录卖家后台&#xff0c;遍历多个店铺和站点&#xff0c;收集并分析各类绩效数据&#xff0c;包括政策合规性、客户服务绩效、配送绩效等关键指标&#xff0c;并将数据整理到Excel报告中&…

跨越南北的养老对话:为培养“银发中国”人才注入新动能

2025年8月16日&#xff0c;北京养老行业协会常务副会长陈楫宝一行到访广州市白云区粤荣职业培训学校&#xff0c;受到颐年集团副总李娜的热情接待。此次访问不仅是京穗两地养老行业的一次深度交流&#xff0c;更为推动全国智慧养老体系建设、提升养老服务专业化水平注入了新动能…

Spring IOC 学习笔记

1. 概述Spring IOC&#xff08;Inversion of Control&#xff0c;控制反转&#xff09;是一种设计思想&#xff0c;通过依赖注入&#xff08;Dependency Injection&#xff0c;DI&#xff09;实现。它的核心思想是将对象的创建和依赖关系的管理交给Spring容器&#xff0c;从而降…

揭开Android Vulkan渲染封印:帧率暴增的底层指令

ps&#xff1a;本文内容较干&#xff0c;建议收藏后反复边跟进源码边思考设计思想。壹渲染管线的基础架构为什么叫渲染管线&#xff1f;这里是因为整个渲染的过程涉及多道工序&#xff0c;像管道里的流水线一样&#xff0c;一道一道的处理数据的过程&#xff0c;所以使用渲染管…

HTTP 请求转发与重定向详解及其应用(含 Java 示例)

在 Web 开发中&#xff0c;我们经常需要在不同页面之间跳转&#xff0c;比如登录成功后跳到首页、提交表单后跳到结果页面。这时&#xff0c;常见的两种跳转方式就是 请求转发&#xff08;Request Forward&#xff09; 和 重定向&#xff08;Redirect&#xff09;。虽然它们都能…

如何将 MCP Server (FastMCP) 配置为公网访问(监听 0.0.0.0)

如何将 MCP Server &#xff08;FastMCP&#xff09; 配置为公网访问&#xff08;监听 0.0.0.0&#xff09;引言常见错误尝试根本原因&#xff1a;从源码解析正确的解决方案总结引言 在使用 Model Context Protocol(MCP) 框架开发自定义工具服务器时&#xff0c;我们经常使用 …

The Network Link Layer: 无线传感器中Delay Tolerant Networks – DTNs 延迟容忍网络

Delay Tolerant Networks – DTNs 延迟容忍网络架构归属Delay Tolerant Networks – DTNs 延迟容忍网络应用实例例子 1&#xff1a;瑞典北部的萨米人 (Saami reindeer herders)例子 2&#xff1a;太平洋中的动物传感网络DTNs路由方式——存储&转发DTNs移动模型Random walk …

计算机视觉(opencv)实战二——图像边界扩展cv2.copyMakeBorder()

OpenCV copyMakeBorder() 图像边界扩展详解与实战在图像处理和计算机视觉中&#xff0c;有时需要在原始图像的四周增加边界&#xff08;Padding&#xff09;。这种操作在很多场景中都有应用&#xff0c;比如&#xff1a;卷积神经网络&#xff08;CNN&#xff09;中的图像预处理…

ansible管理变量和事实

ansible管理变量和事实与实施任务控制 在 Ansible 中&#xff0c;变量和事实&#xff08;Facts&#xff09;就像给剧本&#xff08;Playbook&#xff09;配备的 “信息工具箱”&#xff0c;让你的自动化配置管理更灵活、更智能。 变量&#xff1a;提前准备的 “预设信息” 变…

STM32--寄存器与标准库函数--基本定时器

目录 前言 基本定时器概念 定时时间 定时器时钟确定 倍频锁相环被正确配置为168MHz 定时器的库函数操作 代码 定时器的寄存器操作 代码 寄存器 后言 前言 使用平台:STM32F407ZET6 使用数据手册&#xff1a;STM32F407数据手册.pdf 使用参考手册&…

PCA 实现多向量压缩:首个主成分的深层意义

PCA 实现多向量压缩 第一个主成分(components_[0])正是数据协方差矩阵中最大特征值对应的特征向量。 ,layer_attention_vector[layer] 被赋值为 pca.components_[0],这确实是一个特征向量,具体来说是 PCA 分解得到的第一个主成分(主特征向量)。 关于它的维度: 假设 c…

网络常识-DNS如何解析

DNS&#xff08;Domain Name System&#xff0c;域名系统&#xff09;是互联网的“地址簿”&#xff0c;负责将人类易记的域名&#xff08;如www.example.com&#xff09;转换为计算机可识别的IP地址&#xff08;如192.168.1.1&#xff09;。其工作流程可以简单理解为“从域名到…

Java中 23 种设计模式介绍,附带示例

文章目录设计模式六大原则设计模式分类1、创建型模式&#xff08;Creational Patterns&#xff09;2、结构型模式&#xff08;Structural Patterns&#xff09;3、行为型模式&#xff08;Behavioral Patterns&#xff09;一、创建型模式&#xff08;Creational Patterns&#x…

嵌入式开发入门——电子元器件~电磁继电器、蜂鸣器

文章目录电磁继电器定义关键参数实物蜂鸣器实物内部结构分类关键参数电磁继电器 定义 概述&#xff1a;电磁继电器是利用电磁感应原理职称的一种电磁开关&#xff0c;他能通过&#xff1a;低电压、低电流的电路&#xff0c;来控制高电压、高电流的电路。 关键参数 线圈电压…

ROS2基础

1.helloworld案例1.创建功能包&#xff08;C&#xff09;终端下&#xff0c;进入ws00_helloworld/src目录&#xff0c;使用如下指令创建一个C 功能包:ros2 pkg create pkg01_helloworld_cpp --build-type ament_cmake --dependencies rclcpp --node-name helloworld执行完毕&a…

Python爬虫实战:研究pygalmesh,构建Thingiverse平台三维网格数据处理系统

1. 引言 1.1 研究背景 在数字化浪潮席卷全球的当下,三维建模技术已成为连接虚拟与现实的核心纽带,广泛渗透于工程设计、地理信息系统(GIS)、虚拟现实(VR)、增强现实(AR)、医学影像等关键领域。例如,在建筑工程中,BIM(建筑信息模型)技术依赖高精度三维网格实现施工…