SpringMVC

简介

springMVC和spring boot息息相关。spring boot把mvc引入了。
MVC是什么?
MVC是"Model-View-Controller"的缩写,是一种软件架构模式。它的目的是将应用程序的逻辑和用户界面分离,以便更好地组织和管理代码。MVC是一种思想;而spring MVC是具体实现;是继承servlet API的web框架
在这里插入图片描述
1:模型(Model):模型代表应用程序的数据和业务逻辑。它负责处理数据的读取、存储、验证和更新等操作。模型并不关心数据如何被展示或被用户操作,它只专注于数据的管理和处理。

2:视图(View):视图负责展示数据给用户,并处理用户界面的交互。它是用户与应用程序交互的界面,可以是图形界面、网页或其他形式。视图从模型中获取数据来显示,并将用户的操作传递给控制器进行处理。

3:控制器(Controller):控制器接收来自用户界面的输入,并根据用户的操作更新模型和视图。它负责协调模型和视图之间的交互,并根据用户的请求调用适当的模型操作。控制器还可以处理应用程序的逻辑,例如验证输入、处理错误等。

创建Spring MVC项目

就是创建spring boot项目;注意添加spring web依赖
在这里插入图片描述

创建连接

类注解@Controller

注解作用:
1:识别为Spring Bean;给spring容器管理。加了这个注解后才能注入其它容器里对象
2:给SpringMvC注册;Spring MVC会认为这是一个Web控制器组件。才能正确处理来自客户端的HTTP请求,Spring就可以根据配置和请求的映射来调度和执行相应的控制器类
在这里插入图片描述

注解@RequestMapping

注解作用:
1:映射Web请求到特定的处理器方法或控制器类。
2:可以设置请求类型:@RequestMapping(value = “/user”, method = RequestMethod.GET)
405是方法不被运行:设置post你用get请求去访问就会报405。你也可以使用相应的注解@GetMapping
3:也可以设置请求参数:@RequestMapping(value = “/hello”, params = “version=2”);当这个参数是version=2请求才会触发这个方法
GET /hello?version=2

4:消费和产生特定的媒体类型
从服务器的角度来看的:consumes属性指定了服务器能够接受的请求内容类型(自己用的就是消费者);produces属性指定了服务器能够发送的响应内容类型(自己发送就是生产者)。
consumes属性:用于指定该方法能够处理的请求的Content-Type值。常见的值有application/json、application/xml等。请求里body的类型
使用:


POST /create
Content-Type: application/json

{
  "name": "John",
  "age": 25
}

@RequestMapping(value = "/create",  consumes = "application/json")
public String createUser(@RequestBody User user) {
    return "User created!";
}

produces属性:produces属性指定的内容类型会被设置在响应报文的Content-Type报头中。响应里body的类型
使用:

@RequestMapping(value = "/user", produces = "application/json")
@ResponseBody
public User getUser() {
    return new User("John", 25);  // 假设User类有相应的构造方法和属性
}

具体响应报文:

HTTP/1.1 200 OK
Content-Type: application/json

{
  "name": "John",
  "age": 25
}

注解@ResponseBody

它会根据你的数据的写法自动判定返回什么数据类型;写入body;如果没法则是返回一个展示在浏览器的页面。Spirng MVC直接是在方法返回值return body。

读取参数

回顾Servlet处理

参数这里还是涉及:前端怎么传、后端怎么接收;后端怎么传;前端怎么接收。前端怎么传和接收还是我们之前的方法。
回顾一下Servlet前端有哪些方式:
1:字符串,url:;query string
2:字符串,form;文本框提交
3:键值对/对象,JSON
js内置JSON转换库
let body={
“from” :from,
“to”:tp,
“messafe”:msg
};
strBody=JSON.stringify(body);
构建请求里的写:data:strBody

后端怎么接收:
通过req这个对象里的方法操作;拿到的是"key:value"

想拿到键值对方式:和解析前端JSON一样;
ObjectMapper objectMapper=new ObjectMapper();
Student student = objectMapper.readValue(req.getInputStream(), Student.class);

后端怎么发:

传字符:

            // 设置响应内容类型
            response.setContentType("text/plain");
            response.setCharacterEncoding("UTF-8");
            // 写入响应内容
            response.getWriter().write("Hello, this is the response string!");

传对象:转成JSON再发送
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(你的对象);

前端怎么接收:回调函数;通过处理body参数接收拿到数据。
这种操作太过时;太繁琐。忘掉先吧;来看一看骑了那么久的自行车;突然发现的摩托车是什么感觉。

1:获取单个参数;地址栏的query string。

在这里插入图片描述
Integer和int怎么选择?·
哪怕你只有一个参数;这个也不能乱写;因为对应不上就获取不到。假设地址栏key是name1;拿不到的时候;或者不给传参数;都是string的默认值null。如果是int类型不传参就报错(状态码500);int你必须得赋值;没有默认值的。所以我们在接收参数推荐使用Integer;至少程序在没参数不报错;我可以加个if(?==null)进行另外逻辑。

2:获取多个参数

和上面也是一样的;参数后面继续写就好了;顺序无关紧要;要key对应上就好了

3:传递对象怎么获取

之前怎么接收;现在就怎么接收。就创建对象类型;里面的属性名得和传过来的对象属性名一样。我们的参数就放这个类型。
在这里插入图片描述

在这里插入图片描述
如果是get传参使用对象接收;key对应也是能赋值到;我明明传的多个参数;怎么就变成对象了。spring mvc帮你的参数映射进行复制的;你只需要属性名保持一致就好了。 它会有方法判断你参数类型、如果是对象就转换成json进行转换;所以你在query string传多个属性用对象接收;请求的类型是Content-Type=applicstion/json。
在这里插入图片描述

上述问题;如果前端的规定是用name;但是后端要求要用username;么处理呢:
使用@RequestParam注解;对象是重命名不了;只能把username拆成多个属性重命名。

现在就只认username;
在这里插入图片描述
但是使用这个注解后就必须要传递参数了;不传就抛异常;我们可以通过设置required = false可以不必传参数。

@GetMapping("/greeting")
public String greeting(@RequestParam(value="username",required = false) String name) {
    if (name != null) {
        return "Hello, " + name;
    } else {
        return "Hello, Guest";
    }
}

4:怎么获取json对象

对象和json对象这是两个东西;上述对象的接收方法是获取不到的;postman模拟一下;确实是获取不到
在这里插入图片描述
在这里插入图片描述
要拿json必须加requestBody注解;这个注解把前端json字符串给搞到对象里。
在这里插入图片描述
postman这里模拟id是int类型不用加双引号也行;string就必须加双引号在这里插入图片描述

5:获取URL中参数@PathVariable(这个是URL的部分)

path(url)=/usser/12345和/user?uid=12345区别
1:搜索引擎在抓取关键字时;url的权重更高
2:url更简洁
在这里插入图片描述
这个花括号里获取:这时候没有key值;加花括号;在层路径下输入什么都可以;按URL目录层级获取顺序。
在这里插入图片描述
下面使用@PathVariable注解;参数名字对应上花括号里的就行;也能进行一个重命名
使用这个注解有个required属性;默认是true;如果名字对应不上;或者是没有参数;直接报错;因为这样子设置是必须给这个name传参数的;可以设置为required=false。上述就是进行一个重命名;

总结:
在这里插入图片描述

6:上传文件

MultipartFile类型接收;接收类型必须是这个类型;其它类型还接收不了。因为这个类型有一个方法;可以让我们把上传的文件流保存成一个图片。这个方法没有返回值。抓包会发现传过来的还是字节流;使用这个方法;相当于把这些字节流写到我们创建的文件里;按照它传递的方式进行写回去。
这里接收我们可以使用@RequestParam(“myimg”) MultipartFile file;不加这个注解;文件名对应上也是能接收到
@RequestParam:主要设计用于处理简单的请求参数,如查询参数、表单数据等。
对于文件上传,当一个表单仅仅上传文件时(例如一个简单的文件上传功能),使用@RequestParam处理这种场景已经足够。
@RequestPart:
特别设计用于处理multipart/form-data请求,这种请求中通常包含多部分内容,例如同时包含文件和其他数据。
如果一个请求中既有文件,又有其他的数据(如JSON数据),那么@RequestPart更适合处理这种场景,因为它可以更明确地分别处理请求中的每一部分

@PostMapping("/upload")
public String handleFileUpload(@RequestPart("file") MultipartFile file,  @RequestPart("metadata") String metadata) {
    // ... 处理文件和元数据
    return "success";
}

在这里插入图片描述
transferTo 是 org.springframework.web.multipart.MultipartFile 接口中的一个方法,通常在处理文件上传时使用。这个方法允许你将上传的文件内容转移到目标文件或路径。
在这里插入图片描述
虽然挺好玩的;但是上述的写法还是漏洞不少;
1:文件超过1MB就被限制;
在这里插入图片描述

2:多个用户进行上传;会把前面的覆盖掉
改造一下代码:
使用uuid命名;全球唯一id;电脑的mac地址(网卡的地址);时间戳;随机数;随机种子;里面也有算法同一时间访问也让你得到的uuid是不一样的。
上传的文件可能是jpg、png……可以使用获取后缀;从.开始获取后面字符
file.getOriginalFilename()获取源文件名;
.substring(file.getOrinalFilename().lastIndexOf(“.”))获取文件扩展名。
file.getOriginalFilename().substring(file.getOrinalFilename().lastIndexOf(“.”))从原始文件名中提取文件的扩展名,例如 “.jpg”、“.png” 等。这个代码意思是从后面往前找到第一个小数点;返回这个小数点的位置;然后从这个位置往后截取。这样子就能准确无误的获取到后缀是啥。
为什么要这样子设计:有时候文件说不准的;不一定是三位;文件名也可能有小数点。我认为直接uuid+文件名即可;但是这样子存多一些没必要的东西。
在这里插入图片描述

7:获取Cookie

http请求的Cookie长这样子:Cookie: myCustomName=someValue; anotherCookie=anotherValue 这里是自定义的cookie名称和值
使用注解@CookieValue即可;也是默认必须传参的。在这里插入图片描述
没传任何的cookie就什么都不显示

在这里插入图片描述
开发者工具伪造cookie:
在这里插入图片描述
传统的方法拿的是所有的cookie;要拿一个还是比较不容易;这个就能直接拿到相应的。具体需求看使用哪种方式。

8:获取Header

使用注解:@RequestHeader;名字对应上就能获取到。
查看有哪些Header内容
在这里插入图片描述
在这里插入图片描述

@Controller
public class HeaderController {
    @RequestMapping(value = "/headerInfo", method = RequestMethod.GET)
    @ResponseBody
    public String getHeaderInfo(@RequestHeader("User-Agent") String userAgent,@RequestHeader("Accept") String accept{
        return "User-Agent: " + userAgent + "\n" +
               "Accept: " + accept;
    }
}

9:获取session

获取session的前提是你存了才能取到;存的方式还是之前的存法;但是取的方式有所不同。
存:套娃;键值对里存键值对。

在这里插入图片描述
存的方式不能使用初始化方法里传request参数:@PostConstruct 注解的方法在 Bean 实例化后,属性注入完成后调用,但在这个阶段,HttpServletRequest 对象还不可用,因为它需要在请求到达时才能被创建。通过 RequestContextHolder.currentRequestAttributes() 方法也能获取;但是避免在bean生命周期依赖HttpServletRequest这样做;解耦性差。

取:
在这里插入图片描述
执行:先在浏览器执行这个set存一下;再get获取。

在这里插入图片描述

spring MVC是基于servlet;所以servlet的写法在这里也是能使用的。我们就可以用servlet的方法去接收也行。我们可以直接在这些方法的参数获取这两个对象;这两个是送的;直接获取就行了。
在这里插入图片描述

返回数据

三类返回数据类型:
1.静态页面;如果单单是一个注解controller;默认返回静态页面。
在这里插入图片描述
注意:/index.html和index.html区别
加了斜杠;表示从根路径去找这个路径(http://localhost:8080/index.html)。不加/是在hi下找的(http://localhost:8080/hi/index/index.html);找得到吗;因为我们静态页面放在根目录下的。
如果是凑巧;static也有hi/index目录下方index.html这时候不加斜杠也能访问到

2.返回JSON数据
使用注解ResponseBody;这个注解;会根据你的返回结果是什么来判断是返回页面;还是返回json 等类型。
在这里插入图片描述
3:返回链接
注意:要实现这两种功能不能有@ResponseBody 注解;请求重定向或请求转发的情况下,需要进行的是URL的跳转或者将请求转发到其他处理器或视图,而不是直接返回数据给客户端。
实现:
在这里插入图片描述

请求转发:当服务器端收到客户端请求;会将请求转发给目标地址;再将目标地址返回的结果转发给客户端。假设:张三找李四借100块;但是李四没钱了;李四就去找王五接100块;最后李四拿着王五给的100块借给张三。(这里内部的过程客户端是感知不到;它只是知道结果)

请求重定向:当服务器端收到客户端请求;会给客户端返回一个临时响应头(记录要重定向的URL地址);客户端收到这个地址后就会再次发送请求到这个新的地址。假设:张三找李四借100块;但是李四没钱了;李四说你去王五那借钱。

区别:
1.请求方不同:
请求转发:服务器端帮客户端去请求。再把结果响应给客户端。
重定向:两次客户端请求。

2.数据的共享不同:
转发的数据是共享;因为但是一次请求。
重定向:两次请求;两次响应;数据是不共享的;地址变化了。url不同

3.代码实现不同

注意:请求转发如果资源和转发的页面不在同一个目录下;会导致外部资源不可访问。()

热部署

JVM是用target运行;你修改idea的代码;但是这里还是老的代码;就得重启服务器。热部署就解决我们手动去重启服务器的工作。但是还是很鸡肋的;因为它会等个3-5秒判断你没修改代码就重启;首先有这个时间我已经手动启动完;如果我在代码写到一半在思考;代码没写完它又自动重启;
1:添加依赖
在这里插入图片描述
在这里插入图片描述
2:进行设置
在这里插入图片描述
两个地方要设置两遍

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

20计科-廖雨旺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值