文章目录
- —、MVC介绍
- 二、SpringMVC
- Spring Boot
- 2.2建立连接
- 三、总结
—、MVC介绍
MVC是一种设计模式,主要用于用户界面的设计。它将应用程序分为三个部分:
- Model(模型):负责数据和业务逻辑。
- View(视图):负责数据的展示。
- Controller(控制器):负责接收用户输入并调用模型和视图。

二、SpringMVC
2.1 Spring MVC 的核心思想
Spring MVC 是基于 MVC 模式的 Web 框架,但它进一步扩展了 MVC 的思想,引入了三层架构:
- 表现层:负责与用户交互,展示数据和接收用户输入。
- 业务逻辑层:处理应用程序的核心业务逻辑。
- 数据访问层:负责与数据库或其他数据源交互。
-
举例说明:
场景:假设去餐厅吃饭,顾客向服务员点餐,服务员将你的订单交给厨房,厨房根据订单准备食物。做完之后,根据菜单告诉服务员,服务员将食物端给你
在这个过程中:(MVC)
顾客:相当于用户,通过界面(View)与系统交互。
- 菜单展示给顾客,顾客通过菜单点餐。
- 餐桌是顾客用餐的地方,展示最终的食物。
服务员:相当于控制器(Controller),负责接收用户的输入并协调模型和视图。
- 服务员接收顾客的点餐请求,将订单交给厨房。
- 服务员从厨房拿到食物后,端给顾客。
厨房:相当于模型(Model),负责处理业务逻辑和数据。
- 厨房根据订单准备食物。
- 厨房不直接与顾客交互,只负责处理订单。
在这个过程中:(SpringMVC)
服务员和菜单:相当于表现层,负责与用户交互,展示数据和接收用户输入。
- 服务员接收顾客的点餐请求。
- 菜单展示给顾客,顾客通过菜单点餐
厨房:相当于业务逻辑层,处理应用程序的核心业务逻辑。
- 厨房根据订单准备食物。
- 厨房不直接与顾客交互,只负责处理订单。
食材仓库:相当于数据访问层,负责与数据库或其他数据源交互。
- 厨房需要从食材仓库获取食材。
- 食材仓库不直接与顾客或服务员交互
Spring Boot
Spring Boot是实现SpringMVC的其中一种方式.
SpringBoot可以添加很多依赖,借助这些依赖实现不同的功能.
SpringBoot通过添加Spring Web MVC框架,来实现web功能.

学习SpringMVC,主要学习如何通过浏览器和用户程序进行交互.
1.建立连接:访问一个地址能够调用到我们的 Spring程序
2.请求:用户请求的时候会带一些参数,在程序中要想办法获取到参数
3.响应:执行了业务逻辑之后,把程序执行的结果返回给用户
2.2建立连接
2.2.1路由映射
路由映射:当用户访问⼀个URL时,将用户的请求对应到程序中某个类的某个方法的过程
使用 @RequestMapping 注解实现 URL 路由映射。

2.2.2 @RequestMapping 使用
@RequestMapping 可以修饰类和方法,访问地址是类路径 + 方法路径

@RequestMapping 默认支持 GET 和 POST 请求。可以通过 method 属性指定请求类型
举例子:指定GET请求
@RequestMapping("request")
@RestController
public class RequestController {
@RequestMapping(value = "/r2",method =RequestMethod.GET)
public String r2(String userName,String password){
return "接收参数"+userName+" "+password;
}
}
@PostMapping
指定POST请求
@RequestMapping("request")
@RestController
public class RequestController {
@PostMapping("/r3")
public String r3(int age){//当不传参数时,非包装类型不能解包,不能赋值为null
return "接收参数"+age;
}
}
@PostMapping
指定GET请求
@RequestMapping("request")
@RestController
public class RequestController {
@GetMapping("/r3")
public String r3(int age){
return "接收参数"+age;
}
}
不加@RestController会怎么样?

原因: Spring会对所有的类进行扫描 , 如果类加了注解@RestController,Spring才会去看这个类里面的方法有没有加@RequestMapping
@RestController
@RestController 是 Spring MVC 中的一个注解,它是 @Controller 和@ResponseBody 的组合注解。
作用:标记一个类为控制器,并且默认将所有方法的返回值直接作为 HTTP 响应的内容(通常是 JSON 或 XML 格式),而不是跳转到视图页面。
如果需要返回数据(如 JSON),需要在方法上添加@ResponseBody 注解。
通过@RestController的源码可以发现
@RestController=@Controller+@ResponseBody

2.3 Postman 介绍
Postman 是一款用于测试 API 的工具,支持 GET、POST 等多种请求方式。
2.3.1 下载安装 Postman
下载链接:Postman
2.3.2 创建请求
在 Postman 中创建请求,设置请求类型、URL 和参数。


2.4 请求
Spring MVC 的请求处理主要包括获取参数、传递对象、数组、集合、JSON 数据等。
2.4.1 传递单个参数
@RequestMapping("request")
@RestController
public class RequestController {
@RequestMapping("/r1")
public String r1(String keyword){
return "接收参数"+keyword;
}
}

2.4.2 传递多个参数
@RequestMapping("request")
@RestController
public class RequestController {
@RequestMapping("/r2")
public String r2(String userName,String password){
return "接收参数"+userName+" "+password;
}
}

2.4.3 传递对象
public class UserInfo {
private String name;
private Integer age;
private String gender;
public UserInfo() {
}
public UserInfo(String name, Integer age, String gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
//提供get和set方法....
}
@RequestMapping("request")
@RestController
public class RequestController {
@RequestMapping("/r5")
public String r5(UserInfo userInfo){
return "接收参数"+userInfo;
}
}

2.4.4 后端参数重命名
使用 @RequestParam 重命名前后端参数。
@RequestMapping("request")
@RestController
public class RequestController {
//从前端接收参数,赋值给keyword
@RequestMapping("r6")
public String r6(@RequestParam(value ="q",required = false)String keyword){
return "接收参数"+keyword;
}
}

进行参数绑定,传参数只能通重命名后的名称
2.4.5 传递数组
@RequestMapping("request")
@RestController
@RequestMapping("/r7")
public String r7(String[] arr){
return "接收参数:arr="+ Arrays.toString(arr);
}
}

2.4.6 传递集合
@RequestMapping("request")
@RestController
@RequestMapping("/r8")
public String r8(@RequestParam List<Integer> list){
return "接收参数:list="+ list;
}
}

前端传递的默认是以数组的形式传过来,所以要进行参数绑定,将参数转换成list形式
2.4.7 传递 JSON 数据
使用 @RequestBody 接收 JSON 数据。
@RequestMapping("request")
@RestController
@RequestMapping("/r9")
public String r9(@RequestBody UserInfo userInfo){
return "接收参数"+userInfo;
}
}


2.4.8 获取 URL 中的参数
使用 @PathVariable 获取 URL 中的参数
如果方法参数名称和需要绑定的URL中的变量名称不一致时,需要@PathVariable的属性value赋值
@RequestMapping("request")
@RestController
public class RequestController {
@RequestMapping("/r2/{name}{password}")
public String r2(@PathVariable("name") String userName,@PathVariable String password){
return "接收参数"+userName+" "+password;
}
}

2.4.9 上传文件
使用 @RequestPart 上传文件。
@RequestMapping("request")
@RestController
public class RequestController {
@RequestMapping("r10")
public String getFile(@RequestPart("file")MultipartFile file) throws IOException {
//获取文件名称
String fileName=file.getOriginalFilename();
//文件上传到指定路径
file.transferTo(new File("D:/workspace/"+file.getOriginalFilename()));
return "接收到⽂件名称为: "+fileName;
}
}


2.4.10 获取 Cookie/Session
2.4.10.1 Cookie 和 Session 的概念
Cookie的定义
Cookie 是服务器发送到客户端(通常是浏览器)并存储在客户端的一小段数据。
作用
用于在客户端保存一些用户信息,以便在后续请求中发送给服务器。
存储位置
客户端(浏览器)。
生命周期
可以设置过期时间,可以是会话级别的(浏览器关闭后失效)或持久性的(在指定时间内有效)。
Session的定义
Session 是服务器端存储用户会话信息的一种机制。
作用
用于在服务器端保存用户的状态信息,通常通过 Session ID 来标识不同的用户会话。
存储位置
服务器端。
生命周期
通常与用户的会话相关,用户关闭浏览器或会话超时后失效。
2.4.10.2理解会话机制
什么是会话?

举例子:打客服电话
每次打客服电话,是⼀个会话. 挂断电话, 会话就结束了
下次再打客服电话,又是⼀个新的会话.
如果我们长时间不说话, 没有新的请求,会话也会结束.
HTTP 协议是无状态的,即服务器不会自动记住客户端的请求。
每次请求都是独立的,服务器无法直接知道两次请求是否来自同一个用户
为了区分用户,服务器需要一种机制来标识每个用户的会话
但是实际开发中,我们很多时候是需要知道请求之间的关联关系的.
Session是服务器为了保存用户信息而创建的⼀个特殊的对象.

Session的本质就是⼀个"哈希表",存储了一些键值对结构.Key就是SessionID,Value就是用户信息
2.4.10.3 Cookie和Session的关系

例子:
用户登录:
用户输入用户名和密码,提交登录表单。
服务器验证用户信息,生成一个 Session ID,并将 Session ID 存储在服务器的 Session 存储中。
服务器将 Session ID 通过 Set-Cookie 响应头发送给客户端。
在后续请求中:
客户端在后续请求中自动携带包含 Session ID 的 Cookie。
服务器根据 Session ID 查找对应的 Session 数据,验证用户身份,找不到则重新创建Session,并把SessionID返回

Session默认是保存在内存中的.如果重启服务器则Session数据就会丢失.
区别
| 特性 | Cookie | Session |
|---|---|---|
| 存储位置 | 客户端(浏览器) | 服务器端 |
| 数据安全性 | 较低,容易被篡改或窃取 | 较高,数据存储在服务器端 |
| 存储容量 | 较小(通常不超过 4KB) | 较大(受服务器内存限制) |
| 生命周期 | 可以设置过期时间,可以是会话级别或持久性 | 通常与用户会话相关,浏览器关闭或超时后失效 |
| 性能影响 | 每次请求都会携带 Cookie,增加网络传输开销 | 只在服务器端存储数据,减少网络传输开销 |
| 跨域支持 | 支持跨域,但受同源策略限制 | 不支持跨域,Session ID 通常通过 Cookie 传递 |
| 适用场景 | 存储少量非敏感数据,如用户偏好设置 | 存储敏感数据,如用户登录状态 |
获取 Cookie/Session
Spring MVC是基于Servlet API构建的原始Web框架,也是在Servlet的基础上实现的
HttpServletRequest 和HttpServletResponse 是Servlet提供的两个类是Spring MVC方法的内置对象.
需要时直接在方法中添加声明即可.
HttpServletRequest 对象代表客户端的请求
当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中
通过这个对象提供的方法,可以获得客户端请求的所有信息.
HttpServletResponse 对象代表服务器的响应.
HTTP响应的信息都在这个对象中,比如向客户端发送的数据,响应头,状态码等.
通过这个对象提供的方法,可以获得服务器响应的所有内容
Cookie的获取
使用 @CookieValue 获取 Cookie
@RequestMapping("request")
@RestController
public class RequestController {
@RequestMapping("/r14")
public String r14(@CookieValue("name") String name){
return "从cookie中获取的name的值:"+name;
}
}

传统方法,使用HttpServletRequest 和HttpServletResponse
@RequestMapping("request")
@RestController
public class RequestController {
@RequestMapping("/r13")
public String r13(HttpServletRequest request, HttpServletResponse response){
Cookie[] cookies = request.getCookies();//获取到的cookie是数组,键值对
if(cookies!=null){
for(Cookie cookie :cookies){
System.out.println(cookie.getName()+":"+cookie.getValue());
}
}
return "返回cookie成功";
}
}


Session的存取
Session是服务器端的机制,我们需要先存储,才能再获取
Session也是基于HttpServletRequest来存储和获取的
@RequestMapping("request")
@RestController
public class RequestController {
@RequestMapping("/setSession")
public String setSession(HttpServletRequest request){
HttpSession session=request.getSession();
session.setAttribute("userName","zhangsan");
session.setAttribute("age","25");
return "设置session成功";
}
}

getSession操作内部提取到请求中的Cookie里的SessionId,然后根据SessionId获取到对应的Session对象
Session对象用HttpSession来描述
使用 HttpSession 获取 Session。
HttpSession getSession(boolean create)
参数如果为true,则当不存在会话时新建会话
参数如果为false,则当不存在会话时返回null
方法1:HttpServletRequest
@RequestMapping("request")
@RestController
public class RequestController {
@RequestMapping("/getSession")
public String getSession(HttpServletRequest request){
// 从cookie中获取sessionId,根据sessionId获取session对象
HttpSession session=request.getSession(false);
//Session不存在的话,会⾃动进⾏创建
if(session==null){
return "用户未登录";
}else {
String userName= (String)session.getAttribute("userName");
return "登录用户名为:"+userName;
}
}
}


方法2:HttpSession
@RequestMapping("request")
@RestController
public class RequestController {
@RequestMapping("/getSession2")
public String getSession2(HttpSession session){
String userName= (String)session.getAttribute("userName");
return "登录用户名为:"+userName;
}
}

方法3:@SessionAttribute
@RequestMapping("/getSession3")
public String getSession3(@SessionAttribute("userName") String userName){
// HttpSession session=request.getSession(false);==HttpSession seesion
return "登录用户名为:"+userName;
}
}

2.4.11获取Header
使用HttpServletRequest提供的getHeader方法来获取,参数对应HTTP请求报头的"Key"
@RequestMapping("request")
@RestController
public class RequestController {
@RequestMapping("getHeader")
public String getHeader (HttpServletRequest request) {
String userAgent = request.getHeader("User-Agent");
return "从Header中获取的userAgent:"+userAgent;
}
@RequestMapping("getHeader2")
public String getHeader2(@RequestHeader("User-Agent") String userAgent) {
return "从Header中获取的userAgent:"+userAgent;
}
}



2.5 响应
Spring MVC 可以返回静态页面、数据、JSON 等。
2.5.1 返回静态页面
前面讲了MVC模式,后端会返回视图
随着互联网的发展,目前项目开发流行"前后端分离"模式
Java主要是用来做后端项目的开发,所以也就不再处理前端相关的内容了
需要加上@Controller
@RestController :返回的是数据.
@Controller :定义⼀个控制器Spring框架启动时加载,把这个对象交给Spring管理.
@ResponseBody :定义返回的数据格式为非视图, 返回⼀个text/html 信息
@RestController=@Controller+@ResponseBody
@RequestMapping("resp")
@Controller
public class RespController {
@RequestMapping("/r1")
public String returnIndex(){
return "/test.html";
}
}


2.5.2 返回数据
@ResponseBody
既是类注解,又是方法注解
如果作用在类上,表示该类的所有方法,返回的都是数据
如果作用在方法上,表示该方法返回的是数据.
如果⼀个类的方法里,既有返回数据的,又有返回页面的,就把 @ResponseBody 注解添加到对应的方法上
使用 @ResponseBody 返回数据。
@RequestMapping("resp")
@Controller
public class RespController {
@RequestMapping("r2")
@ResponseBody
public String returnData(){
return "返回数据";
}
}

2.5.3 返回 HTML 代码片段
@RequestMapping("resp")
@Controller
public class RespController {
@RequestMapping("r3")
@ResponseBody
public String returnHtml(){
return "<h1>hello,Html,我是index</h1>";
}
}

可以根据fiddle抓包,查看content-type

2.5.4 返回 JSON
返回结果为Json对象
@RequestMapping("resp")
@Controller
public class RespController {
@RequestMapping("r4")
@ResponseBody
public UserInfo returnJson(){
UserInfo userInfo=new UserInfo("zhangsan",15,"女生");
return userInfo;
}
}

同样抓包,观察Content-Type

2.5.5 设置状态码
认识常见的状态码
HTTP 状态码:服务器在响应客户端请求时返回的三位数字代码,用于表示请求的处理结果。
| 状态码 | 类别 | 含义 |
|---|---|---|
| 101 | 信息性 | 切换协议 |
| 200 | 成功 | 请求成功 |
| 201 | 成功 | 资源已创建 |
| 204 | 成功 | 无内容返回 |
| 206 | 成功 | 部分内容返回 |
| 302 | 重定向 | 访问器A让你去找访问器B |
| 400 | 客户端错误 | 请求无效 |
| 403 | 客户端错误 | 禁止访问 |
| 404 | 客户端错误 | 资源未找到 |
| 405 | 客户端错误 | 请求方法不被允许 |
| 429 | 客户端错误 | 请求过多 |
| 500 | 服务器错误 | 服务器内部错误 |
| 502 | 服务器错误 | 网关错误 |
| 503 | 服务器错误 | 服务不可用 |
| 504 | 服务器错误 | 网关超时 |
Spring MVC会根据我们方法的返回结果自动设置响应状态码
程序员也可以手动指定状态码
通过Spring MVC的内置对象HttpServletResponse 提供的方法来进行设置
@RequestMapping("resp")
@Controller
public class RespController {
@RequestMapping("r5")
public String setStatus(HttpServletResponse response){
response.setStatus(406);
return "设置状态码成功";
}
}


2.5.6 设置 Header
设置Content-Type
我们通过设置 produces属性的值, 设置响应的报头Content-Type
@RequestMapping("resp")
@Controller
@RequestMapping(value = "/returnJson2",produces = "application/json")
@ResponseBody
public String returnJson2() {
return "{\"success\":true}";
}
}


如果不设置方法返回结果为String时
Spring MVC默认返回类型是text/html.

设置其它Header
设置一个带有给定的名称和值的header
使用Spring MVC的内置对象HttpServletResponse 提供的方法
@RequestMapping("/resp")
@Controller
public class RespController {
@RequestMapping(value = "/setHeader")
@ResponseBody
public String setHeader(HttpServletResponse response) {
response.setHeader("MyHeader","MyHeaderValue");
return "设置Header成功";
}
}


三、总结
学习SpringMVC,其实就是学习各种Web开发需要用的到注解
a. @RequestMapping: 路由映射
b. @RequestParam: 后端参数重命名
c. @RequestBody : 接收JSON类型的参数
d. @PathVariable: 接收路径参数
e. @RequestPart: 上传文件
f. @ResponseBody: 返回数据
g. @CookieValue: 从Cookie中获取值
h. @SessionAttribute: 从Session中获取值
i. @RequestHeader: 从Header中获取值
j. @Controller: 定义⼀个控制器,Spring框架启动时加载,把这个对象交给Spring管理.默认返回视图.
k. @RestController : @ResponseBody+@Controller返回数据
理解Cookie和Session的关系
1万+

被折叠的 条评论
为什么被折叠?



