Spring MVC

1. 什么是Spring MVC

1.1 MVC设计思想

MVC是一种软件架构的思想,将软件按照模型、视图、控制器来划分。

  • M Model,模型层,负责业务逻辑判断,数据库存取
  • V View,视图层,负责界面展示,向用户呈现数据的方式(html页面、图片、文本等)
  • C Controller,控制器,负责接收用户请求,并根据请求调用相应的模型来处理业务逻辑

1.2 Spring MVC

SpringMVC是一种基于MVC(模型-视图-控制器)模式的Web框架,它是基于Spring框架的一个子项 目。

它通过将请求分派给相应的控制器来处理Web请求,然后将处理结果发送回客户端。 处理流程如图:

  1. 客户端发送请求至前端控制器DispatcherServlet

  2. DispatcherServlet收到请求后,调用处理器映射器HandlerMapping

  3. HandlerMapping根据请求URL找到具体的Controller。

  4. Controller处理请求,并返回ModelAndView,其中的View只是视图名,并不指向具体的视图组件

  5. DispatcherServlet通过ViewReslover(视图解析器)确定负责显示数据的具体View

  6. DispatcherServlet对View进行渲染视图(即将Model填充至视图组件中),并将完整的视图响应 到客户端

2. Spring MVC快速入门

  1. 创建工程 _051MVC-BOOT01
  1. 选择 2.7.12 版本,并勾选 Spring Web 依赖项
  1. 启动工程

  2. 在resources/static目录下创建index.html

XML 复制代码
<h1>
    工程首页
</h1>
  1. Rebuid static
  1. 浏览器访问工程首页

http://localhost:8080/index.html

3. Spring MVC处理请求

3.1 请求分类及处理方式

  • 静态请求

定义:

指请求的页面由服务器上预先准备好的静态web资源组成,如HTML、CSS、JS、IMG等,返 回给客户端的信息内容是不变的。

处理方式:

由服务器直接将请求的资源返回给客户端,服务器不处理任何逻辑,只是将预先准备好的资源 返回给客户端。

  • 动态请求

定义:

服务器会根据用户的请求动态生成内容,将数据返回到客户端显示页面内容。

处理方式:

由服务器从数据库中获取数据,并进行相应的逻辑处理后将处理结果返回客户端。

3.2 处理静态请求

  • 处理html文件请求
  1. 创建index.html(已经创建)浏览器输入地址测试

http://localhost:8080/index.html

  1. 显示工程首页
  • 处理图片等请求
  1. 复制任意一张图片到static下
  2. 右键static目录,Rebuild static
  3. 浏览器测试

浏览器: http://localhost:8080/liying.jpg

3.3 处理动态请求

通过在 controller 中定义对应的类及方法实现动态请求的业务逻辑处理。

1.注解说明

  • @Controller 注解

标注一个类;

表示该类是一个控制器,负责处理用户的请求,并将处理结果生成响应返回给客户端。

  • @RequestMapping 注解

请求注解;

添加在控制器类或控制器方法上;

将HTTP请求映射到控制器中的方法,指定处理请求的路径

控制器类上:为整个控制器指定一个基础路径

控制器方法上:指定相对于基础路径的具体路径

  • @ResponseBody 注解

响应注解;

添加在控制器方法上;

可以使控制器方法通过返回值的方式将响应返回给客户端。

2.示例

处理用户查询订单的请求

第1步: 工程目录下新建controller.OrderController

java 复制代码
// @Controller:用于将一个类标识为SpringMVC中的控制器,负责处理用户的请求并将响应返回给客户端
@Controller
public class OrderController {
    // 1.请求注解
    @RequestMapping("/selectOrder")
    // 2.响应体注解,添加此注解后,可以通过返回值的方式响应给客户端数据
    @ResponseBody
    public String selectOrder(){
        return "查询订单成功~~";
    }
}

第2步:重启工程 后浏览器测试

http://localhost:8080/selectOrder

3.4 常见问题

  • 工程已修改,但是浏览器刷新未出现效果

1.工程static目录下文件修改后必须 Rebuild static

2.浏览器有之前页面的缓存,Shift + F5 刷新页面

  • 404错误码代表找不到资源

1.找不到静态资源

检查请求的路径是否正确

检查静态资源文件的存储位置是否在static里面

选中static文件夹 ReBuild 重新编译再测试

2.找不到动态资源

检查请求的路径是否正确

检查@Controller注解是否添加

检查@RequestMapping注解里面的处理路径是否正确

4. HTTP请求方法

4.1 GET请求

GET请求通常用于获取服务器资源,将请求参数放在URL中。

1.URL统一资源定位符

是标准的Web地址,用于唯一地标识互联网上的资源(如网页、图片、文档等)

XML 复制代码
http://www.example.com/search?q=keyword

其中 http 是协议名, www.example.com 是域名, search 是路径名, q 是查询参数, keyword 是查询 参数。

2.特点

  • 如果请求参数过多,GET请求会导致URL变长,并且传输的数据量也有一定限制;
  • 安全性较低;

所以GET请求适合于请求数据不敏感的情况,如查询信息、浏览网页等。

4.2 POST请求

  • POST请求是将请求参数放在请求体中发送的;
  • POST请求相对于GET请求传输的数据量更大,数据更加安全;

所以POST请求适合于请求数据敏感的情况,如登录、注册等。

5. 客户端传递参数

客户端负责发送请求,服务端负责处理请求;

客户端在发送请求时可能需要向服务端传递数据,具体传递数据的方式有如下几种方式。

5.1 GET请求[查询参数]

在浏览器地址栏中输入URL地址,在URL中添加查询参数,默认发送的是 GET请求。

比如:登录功能

完成登录功能,客户端需要将用户名 username 和 密码 password 传递给服务端

http://localhost:8080/v1/users/login?username=liying&password=123456

第1步:新建controller.UserController 处理请求

java 复制代码
@Controller
public class UserController {
    @RequestMapping("/v1/users/login")
    @ResponseBody
    public String login(HttpServletRequest request){
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        
        return username + ":" + password;
    }
}

第2步:重启工程后浏览器输入地址测试

http://localhost:8080/v1/users/login?username=liying&password=123456

5.2 POST请求[请求体]

POST请求无法在浏览器地址栏中发送,一般会通过如下方式发送:

  • html中:Form表单完成POST请求方式的发送
  • IDEA中: .http 后缀文件完成POST请求的发送

5.3 .http文件测试接口

使用SpringMVC中提供的 .http 后缀的文件来测试 Controller 层接口。

使用三个 # 号 作为不同测试方法的分隔符,也可以作为注释说明。

第1步:在test目录下创建 Directory :http

第2步:创建 .http 后缀的文件进行测试:testUserController.http

XML 复制代码
### GET请求测试
GET http://localhost:8080/v1/users/login?username=liying&password=123456
Accept: application/json

### POST请求测试
POST http://localhost:8080/v1/users/login
Content-Type: application/x-www-form-urlencoded

username=liying&password=123456

第3步:执行对应的请求方法测试

6. 服务端接收参数

6.1 HttpServletRequest接收

以上述案例为准,客户端把用户名和密码信息传递给服务端,服务端接收传递过来的用户名和密码信 息。

第1步:controller.UserController 处理请求

java 复制代码
/**方式1:使用HttpServletRequest接收数据*/
@RequestMapping("/v1/users/login")
@ResponseBody
public String login(HttpServletRequest request){
    String username = request.getParameter("username");
    String password = request.getParameter("password");

    return username + ":" + password;
}

第2步:重启工程后执行对应的测试脚本(testCase.http)测试

6.2 声明参数接收

可以在处理请求的方法中通过 声明参数的方式 来接收客户端传递过来的数据。

应用分析

第1步:controller.UserController处理登录请求

java 复制代码
/**方式2:通过声明参数的方式接收*/
@RequestMapping("/v1/users/login")
@ResponseBody
// 好处:代码简洁,并且可以自动根据声明的类型进行转换
public String login(String username, String password){
    return "username = " + username + ", password = " + password;
}

第2步:重启工程,执行测试脚本测试

6.3 声明POJO类接收

如果客户端传递数据过多,

通过 HttpServletRequest 方式接收复用性较差,通过 声明参数接收 很繁琐;

所以可以将数据封装到 POJO类 中来接收。

操作步骤

第1步:controller.UserController处理登录请求

java 复制代码
/**方式3:通过声明Pojo类接收*/
@RequestMapping("/v1/users/login")
@ResponseBody
public String login(User user){
    return user.toString();
}

第2步:自定义pojo类,工程目录下创建entity.User

java 复制代码
public class User {
    // 客户端传递几个参数,此处就有几个属性
    private String username;
    private String password;
    
    // 省略 setter()  getter()  和 toString() 方法
}

第3步:重启工程,执行测试脚本测试

7. POJO

7.1 定义

Plain Ordinary Java Object:简单的Java对象;

是没有继承任何类或实现任何接口的简单 Java 对象,也不依赖于其他复杂的框架或技术;

POJO 对象通常包含了纯粹的数据和简单的业务逻辑,是一种用于简化 Java 应用程序开发的编程模型;

是entity实体类、VO(Value Object或View Object)视图对象、DTO(Data Transfer Object)数据传 输对象 这3个对象的总称。

7.2 entity实体类|DTO|VO

  • entity实体类作用

用来和数据库中的表字段一一对应的,比如UserEntity(id,username,password,nickname);

  • DTO作用

用来接收客户端传递给服务器的数据的,比如:UserLoginDTO(username,password) 实现登录 功能,客户端向服务器端传递数据;

  • VO作用

用来处理服务器响应给客户端的数据的,比如:UserListVO(id,username,nickname) 登录成功后 的列表页显示当前用户信息。

8. 用户管理系统

库名:blog

表名:user

用户id、用户名username、密码password、昵称nickname、创建时间created

建库建表语句

sql 复制代码
CREATE DATABASE IF NOT EXISTS blog DEFAULT CHARSET = UTF8;
USE blog;
CREATE TABLE IF NOT EXISTS user
(
    id       INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50),
    password VARCHAR(50),
    nickname VARCHAR(50),
    created  TIMESTAMP
);

8.2 工程准备

创建工程:_052MVC-BOOT02

SprintBoot版本为2.7.12

勾选依赖

Spring Web

MyBatis Framework

MySQL Driver

  • application.properties配置文件中定义连接数据库信息

可复制之前工程中的,但是库名要改为:blog

XML 复制代码
spring.datasource.url=jdbc:mysql://localhost:3306/blog?serverTimezone=Asia/Shanghai&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=root
  • application.properties配置文件中定义xml文件配置路径
XML 复制代码
# 设置MyBatis框架的映射(Mapper)配置文件的位置
mybatis.mapper-locations=classpath:mappers/*.xml
  • static目录下创建工程首页:index.html
  • 启动工程,浏览器访问测试

http://localhost:8080/index.html

8.3 添加用户

8.3.1 接口说明

用户将:用户名、密码、昵称 数据传递给服务端,服务端处理请求并将数据存入数据表。

  • 请求地址:/v1/users/insert
  • 请求方法:POST
  • 请求体数据:用户名username、密码password、昵称nickname
  • 返回响应:添加成功

8.3.2 操作步骤

  • 创建实体类: pojo.entity.User
  • 创建DTO类: pojo.dto.UserDTO
  • 创建控制器并定义方法:

控制器: controler.UserController

控制器方法: addUser()

  • 创建映射接口及接口方法:

映射接口: mapper.UserMapper

接口方法: insert()

  • xml配置SQL
  • UserController中自动装配,完成添加用户功能并返回响应
  • 重启工程,完成测试( .http 后缀文件)

8.4 用户列表

8.4.1 接口说明

  • 请求地址: /v1/users/userList
  • 请求方法:GET
  • 查询参数:无
  • 返回响应: List

8.4.2 操作步骤

  • 定义映射接口方法: mapper.UserMapper
  • xml 配置 SQL
  • 处理请求并返回响应: UserController 测试

8.5 删除用户

8.5.1 接口说明

  • 请求地址:/v1/users/delete?id=用户id
  • 请求方法:GET
  • 查询参数:用户id
  • 返回响应:String "删除成功"

8.5.2 操作步骤

  • 定义映射接口方法: mapper.UserMapper
  • xml 配置 SQL
  • 处理请求并返回响应: UserController
  • 测试

8.6 更新用户

8.6.1 接口说明

  • 请求地址:/v1/users/update
  • 请求方法:POST
  • 请求体数据:用户id、用户名username、密码password、昵称nickname
  • 返回响应:String "修改成功"

注意:如果用户提交给服务端的为空字符串 或者 NULL,则不修改该用户信息。

8.6.2 操作步骤

  • 定义接口方法:UserMapper
  • xml 配置 SQL
  • UserController 处理请求并返回响应

8.7 工程优化

8.7.1 @RestController注解优化

  • 问题

controller中能否不要每个方法都写 @Responsebody 注解?

  • 解决

在类上将原来的 @Controller 注解替换为: @RestController

  • 说明

@RestController 注解作用于类上;

作用是将类中的方法返回值直接作为HTTP响应的内容;

在控制器类中加入该注解后,无需在每个方法上添加 @ResponseBody 注解;

可以让Spring框架自动将方法的返回值序列化并填充到HTTP响应中,实现Web服务端点的快 速开发。

8.7.2 @RequestMapping注解优化

  • 问题

@RequestMapping注解中每个都有 /v1/users/xxx,能否简化一下?

  • 解决

在类上添加@RequestMapping注解,填写相同部分的地址,比如

XML 复制代码
1.类中注解:@RequestMapping("/v1/users/")
2.方法注解:@RequestMapping("login")

8.7.3 @Mapper注解优化

  • 问题

能否不用在每个XxxMapper映射接口上都添加 @Mapper 注解?

  • 解决

创建配置类,设置自动扫描 @Mapper 注解

在工程中新建config.MyBatisConfig类,添加 @MapperScan 注解设置自动扫描。

  • @MapperScan 注解说明

添加在 Spring配置类 上;

用于告诉 Spring 扫描 MyBatis Mapper 接口并创建对应的 Mapper 实现;

可以指定扫描 MyBatis 映射器接口的包名。

XML 复制代码
// 1.Configuration注解:设置当前类为配置类,启动工程时会自动运行
@Configuration
// 2.MapperScan为扫描注解,省去了每个Mapper映射接口上面添加@Mapper注解
//   参数为mapper的包的完整路径
@MapperScan("cn.tedu._052mvcboot02.mapper")
public class MybatisConfig {
}

9. 总结:

SpringMVC是一个功能强大且易于使用的Web框架,它提供了一种优雅的方式来构建Java Web应用程序。本文介绍了SpringMVC的基本概念和核心组件,并演示了如何使用SpringMVC构建一个简单的Web应用程序。上面的demo可以当做小练习。希望这篇文章对想要学习和使用SpringMVC的开发者有所帮助。如果你想深入了解更多关于SpringMVC的知识,可以参考官方文档或其他相关资源。

相关推荐
清梚不喝粥7 分钟前
Java运算符
java·蓝桥杯
小沈同学呀7 分钟前
SpringBoot中使用 ThreadLocal 进行多线程上下文管理及其注意事项
java·spring boot·后端·线程·thread·threadlocal
wyk123_0461 小时前
Django 连接(sqlserver)数据库方法
数据库·sqlserver·django
敲代码的小王!2 小时前
MD5加密算法和BCrypt密码加密算法
java·算法·安全
魔尔助理顾问3 小时前
一个简洁高效的Flask用户管理示例
后端·python·flask
李长渊哦7 小时前
使用Druid连接池优化Spring Boot应用中的数据库连接
数据库·spring boot·后端
web135085886357 小时前
【Spring Boot】Spring AOP动态代理,以及静态代理
spring boot·后端·spring
罗政7 小时前
冒险岛079 V8 整合版源码搭建教程+IDEA启动
java·ide·intellij-idea
斗-匕7 小时前
Spring Boot自动装配:约定大于配置的魔法解密
数据库
nbsaas-boot8 小时前
Go 自动升级依赖版本
开发语言·后端·golang