SpringMVC详解

—、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数据就会丢失.

区别
特性CookieSession
存储位置客户端(浏览器)服务器端
数据安全性较低,容易被篡改或窃取较高,数据存储在服务器端
存储容量较小(通常不超过 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的关系

Spring MVCSpring 框架的一个模块,它是一种基于 MVC 设计模式的 Web 框架,用于开发具有灵活性和可扩展性的 Web 应用程序。Spring MVC 是目前最流行的 Java Web 框架之一,它可以与其他 Spring 框架和第三方框架集成使用,可以满足各种 Web 应用程序的需求。 Spring MVC 框架中的核心组件包括: 1. DispatcherServlet:前端控制器,用于接收客户端请求并将请求分发给相应的控制器。 2. HandlerMapping:用于将请求映射到相应的处理器(Controller)。 3. Controller:用于处理客户端请求并返回相应的视图。 4. ViewResolver:用于将逻辑视图名称解析为实际视图对象。 5. ModelAndView:用于封装处理器的返回值(数据模型和视图名称)。 6. Interceptor:用于在请求处理前或处理后执行一些公共的逻辑。 Spring MVC 框架的工作流程: 1. 客户端发送请求到 DispatcherServlet。 2. DispatcherServlet 根据请求 URL 调用 HandlerMapping 查找相应的处理器(Controller)。 3. Controller 处理请求并返回一个 ModelAndView 对象。 4. DispatcherServlet 调用 ViewResolver 根据逻辑视图名称查找相应的视图对象。 5. View 对象渲染模型数据,并将渲染后的结果返回给客户端。 6. 客户端接收响应并显示。 总的来说,Spring MVC 框架通过提供一种基于 MVC 设计模式的 Web 框架来简化 Web 应用程序的开发,提高应用程序的灵活性和可扩展性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值