spring MVC了解

目录

一.了解

[1.spring wed MVC概念](#1.spring wed MVC概念)

2.MVC

[3.springboot、mvc 与springMvc的关系](#3.springboot、mvc 与springMvc的关系)

核心区别与总结

二.springmvc的使用

1.常用注解了解

1>:@RestController

2>:@RequestMapping

2.@RequestMapping的详解

1>:下载postman或apifox

2>:构造不同的请求

3.@其他方法注解

4.传递参数

1>:传递本质:

2>:方法没有参数但有queryString

3>:当querystring的key-value只有key没有value时

4>:当参数类型不匹配

5>:后端参数重命名(后端参数映射)

6>:⾮必传参数设置

7>:传递数组

8>:传递集合

9>:传递json数据

10>:获取URL中参数@PathVariable

11>:上传⽂件@RequestPart

12>:获取Cookie/Session

(1).回顾

(2).cookie获取

(3).session获取

13>:获取Header

三.有关响应的方法

1.返回静态页面

1>:了解

2>:使用

2.返回数据

3.返回HTML代码⽚段

4.设置状态码

5.设置Header

1>:了解@RequestMapping

2>:设置content-type

3>:设置其他Header


一.了解

1.spring wed MVC概念

Spring Web MVC 是基于 Servlet(动态wed开发核心组件) API 构建的原始 Web 框架,又称spring MVC

2.MVC

MVC 是 Model View Controller 的缩写,是软件⼯程中的⼀种软件架构设计模式 ,它把软件系统分为模型、视图和控制器三个基本部分,并且每个部分各司其职
View(视图) : 指在应⽤程序中专⻔⽤来与浏览器进⾏交互,展⽰数据的资源.
Model(模型) : 是应⽤程序的主体部分 ,⽤来处理程序中数据逻辑
Controller(控制器): 可以理解为⼀个分发器,⽤来连接视图和模型,用于决定对于视图发来的请求⽤哪个模型来处理,以及处理完后需要返回到哪⼀个视图

3.springboot、mvc 与springMvc的关系

a. MVC 是设计模式

b.springmvc是对mvc的实现,且做出优化,比如:让前后端分隔开,让代码变得简洁、更准确;

官方话就是:分层解耦更彻底、Web 开发流程更规范

核心区别与总结

  • 传统 MVC 中,View、Controller、Model 多在同一应用内交互;
  • 前后端分离模式下,View(前端页面)和 Controller/Model(后端服务)通过网络交互,实现了前后端的解耦,更适合大型分布式应用的开发。
  • 前后端分离后,前端不再依赖后端生成的 "视图模板",而是通过 HTTP 请求和后端纯数据交互,自己负责界面渲染

c . Spring Boot 是快速开发脚手架 / 工具集 ,本身无法处理 Web 请求 ,因此在创建 Web 项目引入 Web 依赖 时,会自动引入 Spring MVC(因为 Spring Boot 的 Web 能力完全依赖 Spring MVC 实现)

二.springmvc的使用

前言:**springmvc主要学习建立连接(HTTP 借助 TCP 来建立和管理连接)、请求与响应,**其实我们已经会了一部分,在maven配置中我们通过http请求来获取响应

整体流程给大家回顾:

1.常用注解了解

1>:@RestController

让类成为能处理 HTTP 请求的控制器 + 直接返回数据(而非页面)

其中@RestController是**@Controller与@ResponseBody**组合注解

· @Controller 标识该类是 Spring 中的控制器组件,用于处理 HTTP 请求

· @ResponseBody 使控制器方法的返回值直接以 JSON、XML 等格式写入 HTTP 响应体(浏览器),而非进行视图渲染

常见的使用/问题:

1.注释 @RestController,没有其他替代注解(如 @Controller),会怎么样?

答: 此时该 仅仅是非常普通的类 ,不是spring的控制组件 ,不会处理http请求,换而言是尝试用HTTP请求会报错 404
2.注释 @RestController,但手动添加 @Controller 注解,怎么样?

答: 此时会处理http请求,但不会将值返回到浏览器 ,而是将 作为视图名称 ",Spring 会去查找名为 hello视图页面 (比如 hello.jsphello.html),找不到就会报错404 或者 5XX

2>:@RequestMapping

需求映射/资源路径映射,括号跟某个方法或类的资源路径,一般与类/方法名字相同

**·**当修饰类,描述该类的唯一资源路径

**·**当修饰方法,描述该方法唯一资源路径

· 只要保证访问的路径是唯一 的,修改类/方法资源路径都是可以的
·当只修饰方法时 ,描述该方法唯一资源路径 ,可以通过 协议 + ip + 对应的方法路径访问返回值

·当修饰类和方法 ,描述该类中某个方法的唯一资源路径 ,可以通过 协议 + ip + 类路径 + 对应的方法路径访问返回值

· 只要保证访问的路径是唯一 的,修改类/方法资源路径都是可以的,

**比如:**当两个类路径重复,且方法路径重复了

第一种修改: 为了保证资源路径唯一,只能让其方法路径保持唯一

第二种修改: 修改类路径,保证资源路径是唯一

2.@RequestMapping的详解

前面学习了简单使用,但在http中需要请求格式(post、get、delete等),那在RequestMapping中的请求格式是??

1>:下载postman或apifox

apifox的更优秀,但使用门栏太高了,所以在这用postman

2>:构造不同的请求

目的: 构造不同的请求查看响应,并找到RequestMapping支持那种请求格式

可以看到当前RequestMapping支持全部的格式,那么如何让他支持指定的格式呢??

a.设置单格式

b.设计多格式

3.@其他方法注解

4.传递参数

当我们构造的http请求包括queryString,参数怎么传递?

1>:传递本质:

queryString传递的规则:

将整个字符串传递,对应的Web 开发框架 会自动解析,按照key赋值并强制类型转换

2>:方法没有参数但有queryString

注:只要方法的参数个数 < querystring的key-value个数,响应依然可以获取

3>:当querystring的key-value只有key没有value时

4>:当参数类型不匹配

这个直接进行强制类型转换,转化失败就报错

5>:传递对象

先实现一个简单的person类

java 复制代码
public class Person {
    String name;
    int age;
    Person (String name,int age){
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

开始传递参数

5>:后端参数重命名(后端参数映射)

注意:

  1. 使⽤ @RequestParam 进⾏参数重命名时, 请求参数只能和 @RequestParam 声明的名称⼀致, 才能进⾏参数绑定和赋值.
  2. 使⽤ @RequestParam 进⾏参数重命名时, 参数就变成了必传参数.

6>:⾮必传参数设置

在实际开发时我们发现有些参数可以没必要传递时,就可以尝试设置默认值

7>:传递数组

8>:传递集合

9>:传递json数据

前言:JSON 是一种完全独立于编程轻量的文本格式 ,专门用来传数据、存数据,比如前后端交互、写配置文件,所有编程语言基本都能处理它

(1).认识json

先看代码

json有两种格式:正常格式、压缩格式

java 复制代码
//正常格式
{
  "squadName": "Super hero squad",
  "homeTown": "Metro City",
  "formed": 2016,
  "secretBase": "Super tower",
  "active": true,
  "members": [
    {
      "name": "Molecule Man",
      "age": 29,
      "secretIdentity": "Dan Jukes",
      "powers": [
        "Radiation resistance",
        "Turning tiny",
        "Radiation blast"
      ]
    },
    {
      "name": "Madame Uppercut",
      "age": 39,
      "secretIdentity": "Jane Wilson",
      "powers": [
        "Million tonne punch",
        "Damage resistance",
        "Superhuman reflexes"
      ]
    },
    {
      "name": "Eternal Flame",
      "age": 1000000,
      "secretIdentity": "Unknown",
      "powers": [
        "Immortality",
        "Heat Immunity",
        "Inferno",
        "Teleportation",
        "Interdimensional travel"
      ]
    }
  ]
}

压缩格式

(2).了解语法与结构

建议大家结合(1)的代码观察

(3).特点

a. JSON 是⼀个字符串,其格式⾮常类似于 JavaScript 对象字⾯量的格式

b.语法简单,被多种语言跨平台支持,数据传输更加轻量,语法灵活易于扩展

c. json不包含可执行程序,不会执行恶意代码,所以更安全

(4).json传输转化工具
Spring MVC框架也集成了JSON的转换⼯具, 我们可以直接使⽤, 来完成JSON字符串和Java对象的互转

自己尝试转换工具,第一步:编写json,为了更好地演示效果及,用Person接受

java 复制代码
@SpringBootTest
class SpringBootDemo2ApplicationTests {
	private ObjectMapper objectMapper = new ObjectMapper();
	@Test void contextLoads() throws JsonProcessingException {
		// 设置参数属性
		Person person = new Person();
		person.setName("我是赵六");
		person.setAge(10086);
		person.setEmail("654321@163.com");

		// 转化为字符串
		String strP = objectMapper.writeValueAsString(person);
		System.out.println("字符串json数据>:"+strP);

		// 转化为对象
		Person personJ = objectMapper.readValue(strP, Person.class);
		System.out.println("对象为>:"+personJ);
	}
}

第二步:启动运行

(5).json传输

因为json 一般在请求正文处构造 ,所以在接受参数加上标签**@RequestBody(从body接受参数)**

10>:获取URL中参数@PathVariable

path variable : 路径变量,和字⾯表达的意思⼀样, 这个注解主要作⽤在请求URL路径上的某个数据

11>:上传⽂件@RequestPart

在html中的表单form的提交方式中有文件传输,此时后端就要接受对应的文件进行操作

html 复制代码
 <form action="demo2.html" method="get" type="file">  <!--以文件的形式提交-->

需要两个方法:

getOriginalFilename()方法:获取客户端上传的 "原始文件名

getName()方法

a.文件上传 场景中**,它获取的是前端表单中 <input type="file"name="xxx"/>name 属性值** (比如示例中前端 keyimage,所以返回 "image");

b. 如果是普通文件 操作,它获取的是服务器端文件的 "名称 + 扩展名"

12>:获取Cookie/Session

(1).回顾

先回顾一下http中的cookie:

当我们访问一个web网站,比如登录淘宝+加入购物车,当我们退出web后,因为http中是没有状态的,再次访问就是初始页面

为此,对应的服务器把用户的web操作信息 放到客户端cookie 并保存到本地 ,等再次访问会带着cookie一起,从而加载上一次退出前的操作

延伸: 因为cookie是明文传输,容易被篡改不安全,此时就会通过基于ssl(加密传输)传输把cookie传输过去,从而加加载对应的操作

Session(会话):

每一次与服务器建立连接,都会创建一个专属的唯一会话 ,供客户端与服务器进行交互 ,与此同时,服务器会把该会话的SessionID 通过临时cookie/set-cookie 发送到客户端的本地cookie, 会话的数据则存储在服务器上

再次访问时,不但可以通过cookie加载之前的操作信息 ,也可以通过SeeionID加载上一次会话(若没有加载出来,则默认重新创建会话)

区别:

1.Cookie 是客⼾端保存⽤⼾信息的⼀种机制. SessionID 是服务器端保存⽤⼾信息的⼀种机制.
**2.**Cookie 和 Session之间主要是通过 SessionId 关联起来的, SessionId 是 Cookie 和 Session 之间的 桥梁
**3.**cookie里不一定要有SessionID ,而SessionID 也可以通过其他存储机制表示

(2).cookie获取

a.传统获取cookie

java 复制代码
@RestController
@RequestMapping("HelloWord")
public class HelloWord {
    @RequestMapping("hello")
    public String helloWord(HttpServletRequest request, HttpServletResponse response) {
        Cookie[] cookies = request.getCookies();
        StringBuffer stringBuffer = new StringBuffer();
        if(cookies != null){
            for(Cookie ck : cookies){
                stringBuffer.append("名字>:"+ck.getName()+"  值>:"+ck.getValue()+"\n");
            }
        }
        return stringBuffer.toString().replaceAll("\n","   ");
    }
}

cookie可以伪造 ,但只能用于自己的服务器与客户端 ,因为程序每次访问都会带着对应的cookie访问网站

b.简洁获取Cookie

java 复制代码
@SpringBootApplication
public class SpringBootDemo2Application {
	public static void main(String[] args) {
		SpringApplication.run(SpringBootDemo2Application.class, args);
	}
}
(3).session获取

首先,session属于服务器保存的内容,要想获取先设置session

java 复制代码
    @RequestMapping("setSession")
    public String getSession(HttpServletRequest request){
        // 这里有个方法 request.getSession(boolean b)
        // 当 b = true,存在session会获得并返回,否则创建一个并返回
        // 当 b = false,存在session会获得并返回,否则返回 null
        // 此时的 getSession()方法相当于 b = true时的情况
        HttpSession httpSession = request.getSession();

        // 开始设置值
        httpSession.setAttribute("name","电冰箱");
        httpSession.setAttribute("age",10086);
        httpSession.setAttribute("对象",new Person("我是session",20));
        return "set会话成功";
    }

a.传统的获取方式

java 复制代码
    @RequestMapping("getSession_one")
    public Object getSession_one(HttpServletRequest request){
        HttpSession httpSession = request.getSession();
        return httpSession.getAttribute("对象");
    }

b.简洁获取Cookie(一)

java 复制代码
    @RequestMapping("getSession_two")
    public Object getSession_two(@SessionAttribute("对象")Person person){
        return "对象>:"+person;
    }

c.简洁获取Cookie(二)

java 复制代码
    @RequestMapping("getSession_three")
    public Object getSession_three(HttpSession session){
        return "对象>:"+session.getAttribute("对象");
    }

13>:获取Header

a.传统获取 header

java 复制代码
    @RequestMapping("getHeader")
    public String getHeader(HttpServletRequest request,HttpServletResponse response){
        String userAgent = request.getHeader("User-Agent");
        return "请求电脑的数据>:"+userAgent;
    }

b.简单获取

java 复制代码
    @RequestMapping("getHeader")
    public String getHeader(@RequestHeader("User-Agent")String userAgent){
        return "请求电脑的数据>:"+userAgent;
    }

三.有关响应的方法

1.返回静态页面

1>:了解

当访问地址不添加资源路径,也可以访问页面,此时该页面是静态页面

比如:访问京东

当删除后面的资源路径就可以看到京东的静态页面

2>:使用

注意:

a. 在编写代码时,不希望返回"值",应该返回页面,所以注解 应该为**@RestController**(详细看上面的常用注解了解)

b. 浏览器会加载静态文件,常见的静态首页文件:index.html、index.htm、index.jsp等 ,没有该文件就会报错

java 复制代码
// 重新创建一个类
@Controller
@RequestMapping("Header")
public class Response {
    // 此时就会寻找index.html页面
    @RequestMapping("/index")
    public Object index(){
        return "/index.html";
    }
}

2.返回数据

用到**@ResponseBody**注解:
**a.**加载类上表示该类的所有方法放回数据
**b.**加载方法上表示该方法返回数据
至于其他的细节上面常用注解提到过

3.返回HTML代码⽚段

之前的设置数据都是返回数据,那如果返回html格式会怎么样??

java 复制代码
    @RequestMapping("address")
    public Object address(){
        return "<h1>我是h1</h1></br><h2>我是h2</h2>";
    }

尝试返回其他格式,如:js、css等

java 复制代码
    @RequestMapping("returnJs")
    public Map<String,String> returnJs(){
        Map<String,String> hash = new HashMap<>(){
            {
                put("key1","key1 value");
                put("key2","key2 value");
                put("key3","key3 value");
            }
        };
        return hash;
    }

注:如果返回是test.html、test.plain格式(具体使用时查看)等,前段需要将数据转化为对象使用;若是applaction.js,则直接使用

4.设置状态码

虽然springMvc可以根据接口响应情况 自动设置状态码,但在实际项目会出现技术成功但业务失败的情况

比如:

"用户登录" 接口,技术上请求已处理(参数格式正确、服务器没报错),但业务上可能是 "账号密码错误""账号已冻结",此时默认的200 OK会让前端误解 "请求成功 ",必须手动设置更精准的状态码 + 语义

此时设置状态码可以方便进行前端页面展示与后端数据判断 处理,减少业务失败的可能性

5.设置Header

1>:了解@RequestMapping

Http请求与响应报头也会向客⼾端传递⼀些附加信息, ⽐如服务程序的名称,请求的资源已移动到新地址等,这些信息通过 @RequestMapping 注解的属性来实现

2>:设置content-type

java 复制代码
    // 正常情况下的响应格式
    @RequestMapping(value = "setHeaderType")
    public String setHeaderType(){
        return "{\"OK\"}";
    }

    // 设置返回响应的类型为js
    @RequestMapping(value = "setHeaderTypeJs",produces = "application/json")
    public String setHeaderTypeJs(){
        return "{\"OK\"}";
    }

3>:设置其他Header

比如:在header里面增加一个键值对

java 复制代码
    @RequestMapping("setHeader")
    public String setHeader(HttpServletResponse response){
        response.setHeader("MyAddHeader","MyHeader");
        return "setHeader成功";
    }

这里没什么总结的,因为每一个知识点都很重要

在下一个博客我会列举这些实际应用

如果对你有帮助,点个赞吧!!

相关推荐
-Xie-4 小时前
Redis(八)——多线程与单线程
java·数据库·redis
Kuo-Teng4 小时前
LeetCode 279: Perfect Squares
java·数据结构·算法·leetcode·职场和发展
Filotimo_4 小时前
SpringBoot3整合Druid数据源
java·spring boot
G探险者4 小时前
为什么 VARCHAR(1000) 存不了 1000 个汉字? —— 详解主流数据库“字段长度”的底层差异
数据库·后端·mysql
百锦再4 小时前
第18章 高级特征
android·java·开发语言·后端·python·rust·django
Tony Bai5 小时前
Go 在 Web3 的统治力:2025 年架构与生态综述
开发语言·后端·架构·golang·web3
乄bluefox5 小时前
Reactor 中的 doOnError 与 doOnCancel
java·reactor·rea
CoderYanger5 小时前
B.双指针——3194. 最小元素和最大元素的最小平均值
java·开发语言·数据结构·算法·leetcode·职场和发展·1024程序员节
程序猿20235 小时前
项目结构深度解析:理解Spring Boot项目的标准布局和约定
java·spring boot·后端