Spring MVC

一、Spring MVC介绍

a. Spring MVC是一个Web框架
b. Spring MVC是基于Servlet API构成的
在真正理解Spring MVC之前,首先我们要弄清什么是MVC?

1.1什么是MVC

MVC 是 Model View Controller 的缩写。它是软件⼯程中的⼀种软件架构模式,它把软件系统分为模型、视图和控制器三个基本部分。
在这里插入图片描述

  • Model(模型)是应用程序中用于处理应用程序数据逻辑的部分。通常模型对象负责在数据库中存取数据。
  • View(视图)是应用程序中处理数据显示的部分。通常视图是依据模型数据创建的。
  • Controller(控制器)是应用程序中处理用户交互的部分。通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。

1.2 MVC 和 Spring MVC 的关系

MVC 是⼀种思想,而 Spring MVC 是对 MVC 思想的具体实现。
总结来说,Spring MVC 是⼀个实现了 MVC 模式,并继承了 Servlet API 的 Web 框架。既然是 Web 框架,那么当用户在浏览器中输⼊了 url 之后,我们的 Spring MVC 项目就可以感知到用户的请求。

1.3学习SpringMVC的必要性

现在绝大部分的 Java 项目都是基于 Spring(或 Spring Boot)的,而 Spring 的核心就是 SpringMVC。也就是说Spring MVC 是 Spring 框架的核心模块,而 Spring Boot 是 Spring 的脚手架,因此我们可以推断出,现在市⾯上绝⼤部分的 Java 项目约等于 Spring MVC 项目,这是我们要学 SpringMVC 的原因。

1.4学习Spring MVC目标

a.连接功能:将用户(浏览器)和JAVA程序连接起来,也就是访问一个地址能调用到Spring程序。
b.获取参数的功能:用户访问的时候会带一些参数,在程序中想办法获得这些参数。
c.输出数据的功能:执行了业务逻辑之后,要把程序执行结果返回给用户。

二、连接功能实现

2.1 @RequestMapping 注解介绍

用来注册接口的路由映射
即可修饰类,也可以修饰⽅法

package com.example.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequestMapping("/user")
public class UserController {

    @RequestMapping("/sayhi")//路由映射(用户和程序的连接)
    @ResponseBody//当前方法返回的是一个非静态页面的数据
    public String sayHi(){
        return "Hello,Spring MVC";
    }
}

@RequestMapping默认支持GET请求,但也支持Post请求

2.2 只支持GET请求

三种写法:
在这里插入图片描述

2.3只支持Post请求

在这里插入图片描述

二、获取参数实现

2.1 获取单个参数

在这里插入图片描述

在这里插入图片描述

2.2 获取多个参数(或者表单参数)

在这里插入图片描述

在这里插入图片描述

2.3 获取对象

定义UserInfo对象:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.4获取JSON对象

在这里插入图片描述
利用postman结果显示如下:
在这里插入图片描述
在这里插入图片描述

2.5 后端参数重命名(扩展知识)

当前端传递的参数和后端的参数不一致,就可以用这种方式。
使用注解@RequestParam
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.6获取URL中的参数

利用注解@PathVariable
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.7 上传文件(图片)

上传文件一定要使用POST而不使用GET
关键步骤:
a.接受前端传递的文件:
@RequestPart(“file”)MultipartFile file
b.将前端传递过来的文件保存到本地:
file.transferTo(new File(filePath + filename));

第一步:
在这里插入图片描述
具体实现:
在这里插入图片描述

@Controller
@Slf4j
@ResponseBody//当前方法返回的是一个非静态页面的数据
@RequestMapping("/user")
public class UserController {
    @Value("${myfile.path}")
    private String filePath;//从配置文件中获取图片的上传路径

    @RequestMapping("/upfile")
    public boolean upFile(String username, @RequestPart("file")MultipartFile file){
        boolean result = false;
        try {
            //获取原文件的名称
            String fileType = file.getOriginalFilename();
            //获取文件名称后缀
            fileType= fileType.substring(fileType.lastIndexOf("."));
            //文件名称
            String filename = UUID.randomUUID().toString() + fileType;
            file.transferTo(new File(filePath + filename));
            result = true;
            log.info(username+"上传图片成功!");
        } catch (IOException e) {
            System.out.println("图片上传失败");
        }

        return result;
    }

用postman模拟:
在这里插入图片描述

2.8获取cookie

2.8.1传统方式获取

在这里插入图片描述
在这里插入图片描述

2.8.2简洁方式获取

使用注解**@CookieValue**
在这里插入图片描述
在这里插入图片描述

2.9获取请求头header中的信息

使用注解@RequestHeader
在这里插入图片描述
在这里插入图片描述

2.10 获取Session

使用注解@SessionAttribute

 //定义全局的session key
    private final String SESSION_KEY = "SESSION_KEY";

    /**
     * 设置 session
     *
     * @param request
     * @return
     */
    @RequestMapping("/setsess")
    public boolean setsess(HttpServletRequest request){
        boolean result =false;
        //1.得到session对象
        try {
            HttpSession session = request.getSession(true);
            session.setAttribute(SESSION_KEY, "java");
            result = true;
        }catch (Exception e){
            log.info("出现了异常:" + e.getMessage());
        }
        return result;
    }

    /**
     * 获取session
     * @param data
     * @return
     */
    @RequestMapping("/getsess")
    public String getSess(@SessionAttribute(name = "SESSION_KEY",required = false) String data){
    //false表示:如果没有session就不用创建session
        return data;
    }

在这里插入图片描述

三、返回数据实现

默认情况下返回的是一个页面,而不是页面中的数据。
现在因为前后端分离,所以可以只返回数据就可以了。
例如:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
综上可以看到,当不加注解时,返回的是一个页面,而不是页面中的数据。

3.1使用注解@ResponseBody

当@ResponseBody加在类上,说明这个类中的所有方法,返回的都是一个非静态页面的数据。
在这里插入图片描述
在这里插入图片描述

3.2注解@RestController

@RestController = @Controller + @ResponseBody
源码:
在这里插入图片描述
使用@RestController一个注解可以代替之前的两个注解
在这里插入图片描述

四、请求转发和请求重定向

4.1具体实现

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

在这里插入图片描述
请求转发的结果:
在这里插入图片描述
请求重定向的结果:
在这里插入图片描述
举例说明forward(请求转发)和 redirect(请求重定向):
例如,你告诉你妈妈,你想吃辣条,如果你妈妈,说好,我帮你去买,这就是 forward 请求转发;如果你妈妈让你自己去买,那么就是请求 redirect 重定向。

4.2 forward和redirect的具体区别

1.请求重定向(redirect)将请求重新定位到资源;请求转发(forward)服务器端转发。
2.请求重定向地址发⽣变化,请求转发地址不发生变化。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值