Spring MVC

目录

[什么是Spring MVC](#什么是Spring MVC)

[Spring MVC的执行流程](#Spring MVC的执行流程)

[创建Spring MVC项目](#创建Spring MVC项目)

[怎么学习Spring MVC](#怎么学习Spring MVC)

[Spring MVC 的使用](#Spring MVC 的使用)

1.连接

2.获取

1.获取单个参数

2..获取对象

3.获取参数的重命名

4.获取JSON对象

5.获取URL参数

6.获取上传文件

7.获取Cookie

8.获取session

9.获取header

3.输出

[1.返回 text 与静态页面](#1.返回 text 与静态页面)

实现一个网页计算器

2.返回一个JSON对象

实现一个登录界面

[3.请求转发 与 请求重定位 (重点)](#3.请求转发 与 请求重定位 (重点))

请求转发与请求重定位的区别


什么是Spring MVC

Spring MVC 是一个web框架,而且是基于servlet API 构建的.

MVC 的全称是 model(模型) view(视图) controller(控制)

MVC是一种设计思想,而Spring MVC就是具体实现它的方式. 就好比IoC容器的设计思想,具体实现是通过依赖注入(DI) 依赖查找

MVC 是 Model View Controller 的缩写,它是软件工程中的一种软件架构模式,它把软件系统分为模型、视图和控制器三个基本部分。

  • 控制器: 在应用程序中用于处理前后端数据交互的部分,负责从视图读取数据,控制用户输入发送给模型
  • 模型: 在应用程序中用于处理数据逻辑的部分,负责在数据库存取数据
  • 视图: 在应用程序中用于处理数据显示的部分,负责将模型响应的数据生成视图给用户

Spring MVC的执行流程

如上图

用户的请求首先到Controller

Controller将请求信息发送给model

model在数据库获取数据后返回给Controller

Controller再将数据返回给view

最后由view将数据生成最终的页面提供给用户

创建Spring MVC项目

在项目创建中勾选Spring Web 就是勾选了Spring MVC项目

通过下面的描述中我们也可以看到,它说使用了Spring MVC

怎么学习Spring MVC

当我们学会了以下三种功能后,就基本上掌握了Spring MVC

  • 连接 将用户(浏览器)与Java程序连接起来,使用用户可以通过地址访问程序
  • 获取参数 获取用户访问请求中的参数
  • 输出数据 把程序的执行结果返回给用户

Spring MVC 的使用

1.连接

在 Spring MVC 中使⽤ @RequestMapping 来实现 URL 路由映射,也就是浏览器连接程序的作⽤。
接下来要实现的功能是访问地址: http://localhost:8080/user/hi ,能打印"hello,spring mvc"信息。

新建一个User类

java 复制代码
package com.example.demo.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class User {

    @RequestMapping("/user/hi")
    public String sayHi(){
        return "Hi , Spring MVC";
    }
}

@RequestMapping 默认是Get 请求 Post请求都能接收

如果我们想指定接收 Get请求

// 写法 1
@ RequestMapping ( "/index" )
// 写法2
@ RequestMapping ( value = "/index" , method = RequestMethod . GET )
// 写法3
@GetMapping( "/index" )

如果想指定接收 Post请求

// 写法2
@ RequestMapping ( value = "/index" , method = RequestMethod . POST )
// 写法3
@PostMapping( "/index" )

如图,设置为Post 后再用 Get请求就会报错, Post请求则能成功获取

Post:

2.获取

1.获取单个参数

这里创建的对象名必须与请求中的key值一致,才可成功获取

2..获取对象

如果要获取多个参数,再如上一个一个输入就太麻烦了,我们通过一个对象来接收

model包里新建Student类 通过@Data 注解自动生成getter,setter等方法

controller包里新建StudentController类,方法是获取这个对象然后返回这个对象

启动后打开网址 localhost:8080/object

3.获取参数的重命名

如果用户传递参数的key值是 n , 我们觉得太粗略,可以通过@RequestParam 注解进行重命名

我们将其重命名为 name , 然后返回name

此时 n 是必传的参数,如果程序没获取到就会报错

参数不是n,报错了

我们再补充n上去,就正常了

如果参数 n 可传可不传,则要添加一个说明

此时不报错了

4.获取JSON对象

java程序是不能直接获取JSON对象的,我们通过Postman来演示

构造了一个JSON对象后发送给java程序,返回的值都是null,说明JSON对象没有被获取到

通过注解@RequestBody 实现获取JSON对象

此处就是成功接收到了JSON对象 并返回了各参数的值

5.获取URL参数

此处的URL参数不是指URL字符串里的参数,而是URL地址的参数

传递参数有两种方式

如图,csdn还是常规的URL格式,,存在键值对

而掘金网站的网页则是只有文章id, 这样就很简洁, 唯一定位到这篇文章

通过注解 @PathVariable

6.获取上传文件

通过注解 @RequestPart

然后通过postman来实现一下,文件传输

选择Post请求,body,form-data,选择 File文件格式

key值一定要与注解 @RequestPart 的参数一致, 然后发送,后台就提示已成功保存到哪个路径里

打开这个路径就找到了保存的文件了

但这样的写法,是把文件名 和 文件后缀给写死的,因此我们要改进设置保存路径的代码

UUID通过一系列算法,保证了生成的id是全球唯一的

randomUUID() 生成随机值

toString() 将随机值打印为字符串

replace("-","") 去掉随机值中的横杠

通过 getOriginalFilename() 可以获取到原文件的名称

substring() 选择这一段字符串

lastIndexOf(".") 获取到从最后一个 "." 开始的字符串片段

再通过postman发送可以发现每次生成的图片名称都是不一样的,且文件后缀都是正确的

7.获取Cookie

通过注解 @CookieValue

然后在网页按F12进入控制台

点击应用程序,Cookie, 右键新增一个cookie

key值要与注解 @CookieValue 的参数一致, value值随意

刷新网页,返回了value值,表示Java程序已经成功获取到了网页cookie

8.获取session

通过注解 @SessionAttribute

该注解有两个属性, value 表示需要获取 Session 对象里面内容的 key 值,还有一个 require 表示修饰的参数是否必须,一般需要设置为 false,如果设置成 true,没有获取到对应的value就会返回一个400的页面。

9.获取header

通过注解 @RequestHeader

header(请求报头)包含哪些内容,可以点击了解 http://t.csdnimg.cn/6idLb

3.输出

1.返回 text 与静态页面

在Spring MVC诞生之初, 前后端是不分离的, Spring通过注解 @Controller

因此后端向浏览器返回的不是一个数据,而是一个页面.

例如,当我们想返回一个字符串(text) " computer.html " , 却发现他返回了一个静态页面

所以, 如果需要传输的是数据, 而不是页面, 需要再添加一个注解 @ResponseBody

表明传输的是body数据

这样就能成功获取到字符串 computer.html 了

我们也可使用更简洁的注解 @RestController

@RestController = @Controller + @ResponseBody

实现一个网页计算器

前端页面:

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>computer</title>
</head>
<body>
    <form action="computer">
        <h1>计算器</h1>
        数字1:<input name="num1" type="text"><br>
        数字2:<input name="num2" type="text"><br>
        <input type="submit" value="查看结果">
    </form>
</body>
</html>

后端代码:

java 复制代码
package com.example.demo.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ComputerController {
    @RequestMapping("/computer")
    public String computer(Integer num1,Integer num2){
        // 非空验证
        if (num1 == null || num2 == null) {
            return "<h2>参数错误!</h2><a href='javascript:history.go(-1)'>返回</a>";
        }
        return "<h1>"+ (num1+num2) +"<h1>";
    }
}

访问网页: localhost:8080/computer

效果:

2.返回一个JSON对象

实现一个登录界面

通过这行代码,写死 登录成功的用户名是 张三 密码是 123456

succ 是一个用于表示操作结果的状态码,此处我们设置为200,

更常见的做法是,登录成功时返回200,登录失败时返回其他的状态码,比如400或401

前端代码:

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
    <title>login</title>
    <script>
    function mysub() {
      let username = jQuery("#username").val();
      let password = jQuery("#password").val();
      jQuery.getJSON("/login",
            {
              "username":username,
              "password":password
            },
            function (result) {
              if(result.succ==200){
                alert("返回结果:"+result.msg);
              }else{
                alert("操作失败,请重试。");
              }
            });
    }
  </script>
</head>
<body>
<div style="text-align: center;">
    <h1>登录</h1>
    ⽤户:<input id="username">
    <br>
    密码:<input id="password" type="password">
    <br>
    <input type="button" value=" 提交 " onclick="mysub()" style="margin-top: 20px; margin-left: 50px;">
</div>
</body>
</html>

后端代码:

java 复制代码
package com.example.demo.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;

@RestController
public class LoginCController {

    @RequestMapping("/login")
    public HashMap<String,String> res(String username,String password){
        HashMap<String,String> response = new HashMap<>();
        int succ = 200;
        if(username != null && password != null
                && username.equals("张三") && password.equals("123456")){
            response.put("msg","登录成功");
        }else {
            response.put("msg","登录失败");
        }
        response.put("succ","200");
        return response;
    }
}

3.请求转发 与 请求重定位 (重点)

return 不但可以返回一个视图,还可以实现跳转,跳转的方式分别为两种:

  1. forward:请求转发
  2. redirect:请求重定向

用法:

java 复制代码
// 请求重定向
@RequestMapping("/computer")
public String computer(){
 return "redirect:/computer.html";
}

// 请求转发
@RequestMapping("/computer2")
public String computer2(){
 return "forward:/computer2.html";
}

请求转发:

浏览器通过 URL 访问某个地址获取资源, 这个地址是指向服务器的, 然后服务器会去访问资源所在的地址, 获取到资源后, 将资源返回给浏览器, 这期间 浏览器的 URL 是不变的

请求重定位:

浏览器通过 URL 访问某个地址获取资源, 这个地址是指向服务器的, 然后服务器会将资源所在的地址返回给浏览器, 然后浏览器会根据这个资源地址去访问获取资源, 这期间 浏览器的 URL 改变了

示例分析:

请求转发:

注意要将注解改为 @Controller , 不然会将返回值识别成字符串, 而不是html静态页面资源

请求重定位:

请求转发与请求重定位的区别

  1. 定义不同: 请求转发 发生在服务器内部程序上, 当服务器接收到客户端的请求后,服务器会去访问资源地址获取资源, 再将返回结果发送给客户端. 请求重定位 服务器接收到客户端的请求后, 会生成一个临时报头返回给客户端告知 资源所在地址URL, 客户端再通过这个资源地址自己去获取资源
  2. 资源的请求方不同: 请求转发 是由服务器帮客户端请求资源, 资源请求方是服务器 请求重定位 是由客户端自己去请求资源, 资源请求方是客户端
  3. 数据共享不同: 请求转发是服务器端实现的,所以整个执行流程中,客户端(浏览器端)只需要发送一次请求,因此整个交互过程中使用的都是同一个 Request 请求对象和一个 Response 响应对象,所以整个请求过程中,请求和返回的数据是共享的;而请求重定向客户端发送两次完全不同的请求,所以两次请求中的数据是不同的
  4. 最终的URL地址不同: 请求转发 指向的地址不变 请求重定位 指向的地址会变为资源所在地址
  5. 代码实现不同
相关推荐
爱学的小涛8 分钟前
【NIO基础】基于 NIO 中的组件实现对文件的操作(文件编程),FileChannel 详解
java·开发语言·笔记·后端·nio
吹老师个人app编程教学8 分钟前
详解Java中的BIO、NIO、AIO
java·开发语言·nio
爱学的小涛9 分钟前
【NIO基础】NIO(非阻塞 I/O)和 IO(传统 I/O)的区别,以及 NIO 的三大组件详解
java·开发语言·笔记·后端·nio
北极无雪13 分钟前
Spring源码学习:SpringMVC(4)DispatcherServlet请求入口分析
java·开发语言·后端·学习·spring
琴智冰17 分钟前
SpringBoot
java·数据库·spring boot
binqian17 分钟前
【SpringSecurity】基本流程
java·spring
爱码少年19 分钟前
springboot工程中使用tcp协议
spring boot·后端·tcp/ip
《源码好优多》36 分钟前
基于SpringBoot+Vue+Uniapp的植物园管理小程序系统(2024最新,源码+文档+远程部署+讲解视频等)
vue.js·spring boot·uni-app
猿小蔡-Cool1 小时前
CPU 多级缓存
java·spring·缓存
gopher95111 小时前
final,finally,finalize的区别
java·开发语言·jvm