当前位置: 首页 > news >正文

记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.dtcms.com/a/335656.html

相关文章:

  • .NET 中的延迟初始化:Lazy<T> 与LazyInitializer
  • 【Java后端】MyBatis-Plus 原理解析
  • Unity进阶--C#补充知识点--【Unity跨平台的原理】了解.Net
  • Linux | i.MX6ULL网络通信-套字节 UDP(第十八章)
  • 【牛客刷题】后缀子串字母统计:O(n)高效算法详解
  • python实现梅尔频率倒谱系数(MFCC) 除了傅里叶变换和离散余弦变换
  • 数学建模 15 逻辑回归与随机森林
  • 大上墨水屏显示器Paperlike253 Mac 特别版 使用体会
  • MySQL数据库初识
  • 黑马java八股文全集
  • AUTOSAR ARXML介绍
  • 数据结构(排序篇)——七大排序算法奇幻之旅:从扑克牌到百亿数据的魔法整理术
  • C++编程实战:高效解决算法与数据结构问题
  • 【CV 目标检测】Fast RCNN模型②——算法流程
  • 【递归、搜索与回溯算法】记忆化搜索
  • 图解希尔排序C语言实现
  • 分治-归并-315.计算右侧小于当前元素的个数-力扣(LeetCode)
  • Java基础 8.17
  • Debug马拉松:崩溃Bug的终极挑战
  • 一起Oracle 19c bug 导致的业务系统超时问题分析
  • JUC常用线程辅助类详解
  • Blender模拟结构光3D Scanner(二)投影仪内参数匹配
  • 积鼎科技CFD VirtualFlow:引领国产多相流仿真技术,赋能工业智造
  • (一)React企业级后台(Axios/localstorage封装/动态侧边栏)
  • 【React 性能】性能优化第一课:搞懂 `React.memo`, `useCallback`, `useMemo`
  • 重学React(六):脱围机制二
  • Spark03-RDD02-常用的Action算子
  • WebSocket DevTools 开发调试工具完全指南 – 实时监控、消息拦截、性能分析一站式解决方案
  • 【Java后端】Spring Boot 集成 MyBatis 全攻略
  • 遥感数字图像处理教程——第二章部分课后习题