SpringMVC详解

文章目录

    • [1 什么是MVC](#1 什么是MVC)
      • [1.1 MVC设计思想](#1.1 MVC设计思想)
      • [1.2 Spring MVC](#1.2 Spring MVC)
    • [2 SpringMVC快速入门](#2 SpringMVC快速入门)
    • [3 SpringMVC处理请求](#3 SpringMVC处理请求)
      • [3.1 请求分类及处理方式](#3.1 请求分类及处理方式)
        • [3.1.1 静态请求](#3.1.1 静态请求)
        • [3.1.2 动态请求](#3.1.2 动态请求)
      • [3.2 处理静态请求](#3.2 处理静态请求)
        • [3.2.1 处理html文件请求](#3.2.1 处理html文件请求)
        • [3.2.2 处理图片等请求](#3.2.2 处理图片等请求)
      • [3.3 处理动态请求](#3.3 处理动态请求)
        • [3.3.1 注解说明](#3.3.1 注解说明)
        • [3.3.2 示例](#3.3.2 示例)
      • [3.4 常见问题](#3.4 常见问题)
    • [4 HTTP](#4 HTTP)
      • [4.1 HTTP协议](#4.1 HTTP协议)
      • [4.2 访问网页流程](#4.2 访问网页流程)
      • [4.3 请求和响应](#4.3 请求和响应)
        • [4.3.1 HTTP请求 Request](#4.3.1 HTTP请求 Request)
        • [4.3.2 HTTP响应 Response](#4.3.2 HTTP响应 Response)
      • [4.4 URL](#4.4 URL)
        • [4.4.1 定义](#4.4.1 定义)
        • [4.4.2 URL组成](#4.4.2 URL组成)
        • [4.4.3 注意事项](#4.4.3 注意事项)
      • [4.5 请求方法](#4.5 请求方法)
        • [4.5.1 GET请求](#4.5.1 GET请求)
        • [4.5.2 POST请求](#4.5.2 POST请求)
      • [4.6 传递数据方式](#4.6 传递数据方式)
        • [4.6.1 GET请求](#4.6.1 GET请求)
        • [4.6.2 POST请求](#4.6.2 POST请求)
    • [5 服务端接收参数](#5 服务端接收参数)
      • [5.1 HttpServletRequest接收](#5.1 HttpServletRequest接收)
      • [5.2 声明参数接收](#5.2 声明参数接收)
      • [5.3 声明POJO类接收](#5.3 声明POJO类接收)
    • [6 HttpClient测试](#6 HttpClient测试)
      • [6.1 HttpClient说明](#6.1 HttpClient说明)
    • [7 POJO](#7 POJO)
      • [7.1 定义](#7.1 定义)
      • [7.2 entity实体类|DTO|VO](#7.2 entity实体类|DTO|VO)

1 什么是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. 通过处理器适配器HandlerAdapter找到具体执行该方法的实现类;
  5. Controller处理请求,并返回ModelAndView;
  6. DispatcherServlet通过ViewReslover(视图解析器)确定负责显示数据的具体View;
  7. DispatcherServlet对View进行渲染视图(即将Model填充至视图组件中),并将完整的视图响应到客户端。

2 SpringMVC快速入门

  • 第1步:创建工程 _051MVC-BOOT01

  • 第2步:选择 2.7.17 版本,并勾选 Spring Web 依赖项

    properties 复制代码
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
  • 第3步:启动工程

  • 第4步:在resources/static目录下创建index.html

    html 复制代码
    <h1>
        工程首页
    </h1>
  • 第5步:Rebuild static

3 SpringMVC处理请求

3.1 请求分类及处理方式

3.1.1 静态请求
  • 定义

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

  • 处理方式

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

3.1.2 动态请求
  • 定义

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

  • 处理方式

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

3.2 处理静态请求

3.2.1 处理html文件请求
3.2.2 处理图片等请求

3.3 处理动态请求

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

3.3.1 注解说明
  • @Controller

    添加在类上;

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

  • @RequestMapping

    请求注解;

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

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

    • 控制器类上:为整个控制器指定一个基础路径
    • 控制器方法上:指定相对于基础路径的具体路径
  • @ResponseBody

    响应注解;

    添加在控制器方法上;

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

3.3.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 常见问题

  • 工程已修改,但是浏览器刷新未出现效果
    • 工程static目录下文件修改后必须 Rebuild static
    • 浏览器有之前页面的缓存,Shift + F5 刷新页面
  • 404错误码代表找不到资源
    • 找不到静态资源

      • 检查请求的路径是否正确
      • 检查静态资源文件的存储位置是否在static里面
      • 选中static文件夹 ReBuild 重新编译再测试
    • 找不到动态资源

      • 检查请求的路径是否正确
      • 检查@Controller注解是否添加
      • 检查@RequestMapping注解里面的处理路径是否正确

4 HTTP

4.1 HTTP协议

超文本传输协议

HTTP协议是浏览器与服务器通讯的应用层协议,规定了浏览器与服务器之间的交互规则以及交互数据的格式信息等。

  • 用途 : 网页获取,数据的传输
  • 特点
    • 应用层协议,使用tcp进行数据传输;
    • 有丰富的请求类型;
    • 可以传输的数据类型众多.

4.2 访问网页流程

  1. 客户端(浏览器)通过tcp传输,发送http请求给服务端;
  2. 服务端接收到http请求后进行解析;
  3. 服务端处理请求内容,组织响应内容;
  4. 服务端将响应内容以http响应格式发送给浏览器;
  5. 浏览器接收到响应内容,解析展示.

4.3 请求和响应

4.3.1 HTTP请求 Request

浏览器给服务端发送的内容称为请求Request,一个请求包含三部分:请求行,请求头,请求体

  • 请求行 : 具体的请求类别和请求内容

    java 复制代码
    GET         /        HTTP/1.1
    请求类别   抽象路径     协议版本
    
    /**关于请求类别*/
    请求类别:每个请求类别表示向服务器端发请求做不同的操作
       GET : 获取服务器资源
       POST :新增服务器资源
       PUT : 更新服务器资源
       DELETE : 删除服务器资源
        
    /**关于抽象路径*/
    请求URL地址为:http://localhost:8080/
    请求行为:    GET / HTTP/1.1
    
    请求URL地址为:http://localhost:8080/v1/users/login
    请求行为:    GET /v1/users/login HTTP/1.1
    
    请求URL地址为:http://localhost:8080/v1/users/reg
                GET /v1/users/reg HTTP/1.1
  • 请求头:对请求的进一步解释和描述

    请求头是浏览器可以给服务端发送的一些附加信息,有的用来说明浏览器自身内容,有的用来告知服务端交互细节,有的告知服务端消息正文详情等。

    http 复制代码
    Host: localhost:8080
    Connection: keep-alive
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
    Accept-Encoding: gzip, deflate, br
    Accept-Language: zh-CN,zh;q=0.9
  • 请求体: 请求参数或者提交内容

    请求体通常是用户上传的信息,比如:在页面输入的注册信息,上传的附件等内容。

4.3.2 HTTP响应 Response

服务端给浏览器发送的内容称为响应Response,一个响应包含三部分:响应行,响应头,响应体。

  • 响应行

    java 复制代码
    HTTP/1.1     200       OK
    版本信息    响应码   附加信息
    响应码 : 
        1xx:保留
        2xx:成功,表示处理成功,并正常响应
        3xx:重定向,表示处理成功,但是需要浏览器进一步请求
        4xx:客户端错误,表示客户端请求错误导致服务端无法处理
        5xx:服务端错误,表示服务端处理请求过程出现了错误
  • 响应头

    响应头与请求中的消息头格式一致,表示的是服务端发送给客户端的附加信息。

    java 复制代码
    HTTP/1.1 200 OK
    Content-Type: text/html
    Content-Length: 3546
         
    //Content-Length是用来告知浏览器响应正文的长度,单位是字节。

    Content-Type 是用来告知浏览器响应正文中的内容是什么类型的数据(图片,页面等等)不同的类型对应的值是不同,浏览器接收正文前会根据上述两个响应头来得知长度和类型从而读取出来做对应的处理以渲染给用户看。

    文件类型 Content-Type对应的值
    html text/html
    css text/css
    js application/javascript
    png image/png
    gif image/gif
    jpg image/jpeg
  • 响应体

    响应的主体内容信息

4.4 URL

4.4.1 定义

​ URL(Uniform Resource Locator)是互联网上 统一资源定位符 的简称,用于标识和定位互联网上资源的地址。在Web浏览器中,URL是用于访问网页的地址。

4.4.2 URL组成

http://localhost:8080/v1/users/login?username=xxx\&password=yyy

  • 协议(Protocol):指定访问资源的协议类型,常见的协议包括HTTP、HTTPS等。

  • 主机名(Hostname):指定要访问的服务器的主机名或域名。

  • 端口号(Port):指定服务器的端口号,不同的协议和应用程序使用不同的端口号。

  • 路径(Path):指定要访问的资源的路径,即文件或文件夹的路径。

  • 查询参数(Query Parameters):用于传递一些额外的信息给服务器,例如参数化的查询条件。

    查询参数和路径Path之间使用 ?分隔,多个查询参数之间使用 & 分隔。

4.4.3 注意事项
  • URL地址是区分大小写的,因此在输入时要注意大小写的一致性。

  • URL地址中不能包含非法字符,例如空格、特殊符号等。如果需要传递参数或附加信息,可以使用查询参数或POST请求等方式。

4.5 请求方法

4.5.1 GET请求

​ GET请求是HTTP协议中最常见的请求方式之一,它用于从服务器获取数据

​ GET请求将查询参数附加在URL之后,通过"?"符号进行分隔。

  • 查询参数

    GET请求的参数通常以键值对的形式附加在URL之后。例如,以下URL中,"?name=John&age=25"是两个查询参数,分别表示名字和年龄

    html 复制代码
    http://example.com/users?name=John&age=25
  • 注意事项

    • GET请求的参数是可见的,因此在URL中传递敏感信息时需谨慎。
    • GET请求的长度有限制,因为URL的长度有限制,因此当传递大量数据时,应考虑使用POST或其他方式。
  • 发送GET请求

    在浏览器中输入URL地址确认即可向服务端发送GET请求。

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

4.5.2 POST请求

​ POST请求是另一种常见的HTTP请求方式,它用于向服务器提交数据。与GET请求不同,POST请求将数据放在请求体(Request Body)中,而不是URL中。

  • 请求体

​ POST请求的请求体中包含要提交的数据。这些数据可以是JSON、XML或其他格式。请求体中的数据通过Content-Type头部指定。

  • 请求示例

    http 复制代码
    POST /users HTTP/1.1  
    Host: example.com  
    Content-Type: application/json  
    Request Body: {"username": "john", "password": "secret"}
  • 使用POST请求的注意事项

    • POST请求的数据是私密的,不会显示在URL中,因此更适合传递敏感信息。

    • POST请求的长度没有限制,可以提交大量的数据。

  • 发送POST请求

    经常在 form 表单中发送。

    html 复制代码
    <form action="请求地址" method="post">
        <input type="text" name="username">
        <input type="text" name="password">
        <input type="submit" name="登录">
    </form>

4.6 传递数据方式

客户端向服务端传递数据的方式分为GET请求和POST请求两种方式。

4.6.1 GET请求

在查询参数中传递,比如:

html 复制代码
http://localhost:8080/v1/users/login?username=xxx&password=xxx
4.6.2 POST请求

在请求体中传递,比如:

html 复制代码
<form action="请求地址" method="post">
    <input type="text" name="username">
    <input type="text" name="password">
    <input type="submit" name="登录">
</form>

5 服务端接收参数

5.1 HttpServletRequest接收

  • HttpServletRequest是Java Servlet规范中定义的一个接口,它提供了与HTTP请求相关的方法和属性。

  • 在Java Web应用程序中,当客户端发送HTTP请求时,容器(例如Tomcat)会创建一个HttpServletRequest对象,该对象包含了客户端请求的所有信息,如请求的URL、请求方法、请求头、请求参数等。

  • 在请求处理过程中,开发人员可以使用HttpServletRequest对象来获取客户端发送过来的请求参数。通过调用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步:重启工程测试

5.2 声明参数接收

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

应用分析

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

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

5.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步:重启工程后测试

6 HttpClient测试

6.1 HttpClient说明

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

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

应用分析

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

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

    http 复制代码
    ### 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步:执行对应的请求方法测试

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) 登录成功后的列表页显示当前用户信息。

相关推荐
不爱学习的YY酱6 分钟前
【操作系统不挂科】<CPU调度(13)>选择题(带答案与解析)
java·linux·前端·算法·操作系统
丁总学Java12 分钟前
Maven项目打包,com.sun.tools.javac.processing
java·maven
kikyo哎哟喂22 分钟前
Java 代理模式详解
java·开发语言·代理模式
Doker 多克25 分钟前
Spring AI 框架使用的核心概念
人工智能·spring·chatgpt
duration~28 分钟前
SpringAOP模拟实现
java·开发语言
小码ssim34 分钟前
IDEA使用tips(LTS✍)
java·ide·intellij-idea
潜洋1 小时前
Spring Boot教程之五:在 IntelliJ IDEA 中运行第一个 Spring Boot 应用程序
java·spring boot·后端
暮志未晚Webgl1 小时前
109. UE5 GAS RPG 实现检查点的存档功能
android·java·ue5
小叶lr2 小时前
idea 配置 leetcode插件 代码模版
java·leetcode·intellij-idea
qq_429856572 小时前
idea启动服务报错Application run failed
java·ide·intellij-idea