Spring MVC介绍

news2024/11/18 20:29:20

Spring MVC 简介

  • 什么是Spring MVC
  • 了解 MVC
  • MVC 和Spring MVC的联系
  • 如何创建一个Spring Web项目
  • 在Spring Web 项目中,如何连接Http请求
    • @Controller注解可以用其他类注解代替吗
    • 连接其他类型的请求
  • 如何获取请求中的数据
    • 获取单个请求参数
    • 获取多个请求参数
    • 获取对象
    • 获取表单参数
    • 获取JSON对象
    • 获取请求中的文件
    • 获取请求中Cookie/Session/header
      • 获取请求中Cookie
      • 获取请求中Session
      • 获取请求中Header
    • 获取请求数据的特殊情况
      • 后端参数重名
      • 获取URL中参数
  • 返回数据给前端
    • 返回静态⻚⾯
    • 返回数据
  • 请求转发或请求重定向
      • 请求转发vs请求重定向

什么是Spring MVC

Spring MVC 全名是 Spring Web MVC,简称 Spring MVC或者 Spring Web.
Spring MVC 是基于Servlet API的web框架,从一开始Spring框架是包含Spring MVC部分,也就是说Spring MVC是Spring 框架的一部分。

了解 MVC

MVC的英文全称是 Model View Controller,它是软件工程的软件架构模式,它把软件系统分为视图,模型,控制器三个部分。
在这里插入图片描述
model :程序逻辑部分
controller:前后端交互部分
view: 页面显示部分

MVC 和Spring MVC的联系

MVC只是软件架构模式,是一种思想,而Spring MVC这是MVC的一种具体的实现。

如何创建一个Spring Web项目

创建Spring Web项目的创建方式有很多种,这里介绍通过Spring Boot来创建一个Spring Web项目

通过Spring Boot来创建Spring Web 项目是一个非常简单的是,我们只需要在添加依赖的步骤添加一个Spring Web依赖就可以了
在这里插入图片描述

在Spring Web 项目中,如何连接Http请求

我们在学习Serlvet API的时候,是通过@WebServlet()来配置路由的。

而我们在使用Spring MVC的时候,则是通过@RequestMapping()这个注解来配置路由。

@RequestMapping()注解的作用:只有一个,就是用来配置路由,用来连接http请求

@RequestMapping()注解可以放在类前,也可以放在方法前。放在类前表示一级路径,放在方法前表示二级路径

有了@RequestMapping()注解还不够,还要加一个类注解@Controller,让Spring容器能够加载该类。

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

    @RequestMapping("/m")
    public String user() {
        return "ok";
    }
}

这样写还是有一些问题,这样写默认返回的并不是ok这个信息,而是一个视图,根我们想的不太一样。如何返回信息能?

使用@ResponseBody可以解决这个问题

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

    @RequestMapping("/m")
    public String user() {
        return "ok";
    }
}

@ResponseBody注解的用法:
@ResponseBody注解可以作用在类前,也可以作用在方法前
@ResponseBody注解作用在类前表示该类里面设置的路由返回的都是数据不是视图
@ResponseBody注解作用在方法前表示只有该路由返回的是数据不是视图

如果,我们觉得写@Controller,@ResponseBody这两个注解太麻烦了,这里还有一个组合注解包含了这两个部分:@RestController注解

  @RestController
public class UserController {
    @PostMapping("/user")
    public String user() {
        return "ok";
    }
}

@Controller注解可以用其他类注解代替吗

不能,虽然五大类注解都可把对象交给Spring容器进行管理,但是,五大类注解不仅仅只有这个功能,他们分工明确,@Controller是用来进行前后端交互的,其他类注解是无法替代。

连接其他类型的请求

@RequestMapping()注解比较强大,默认情况下,get和post类型的请求都可以连接
【连接get请求】

//方法一
@RequestMapping("/user")
//方法二
@RequestMapping(value = "/user",method = RequestMethod.GET)
//方法三
@GetMapping("/user")

【连接post请求】

//方法一
@RequestMapping("/user")
//方法二   
@RequestMapping(value = "/user",method = RequestMethod.POST)
//方法三
@PostMapping("/user")

如何获取请求中的数据

获取单个请求参数

【方法一】通过Servlet的request对象来获取

特殊说明:在Spring MVC中默认内置隐藏了两个参数,一个是request(HttpServletRequest),一个是response(HttpServletResponse) 对象,所以如果想要使用这两个对象,只需要在方法中申明即可。

 @GetMapping("/user1")
    public String user1(HttpServletRequest request, HttpServletResponse response) {
        String name = request.getParameter("name");
        return "name:"+name;
    }

【方法二】在 Spring MVC 中可以直接⽤⽅法中的参数来实现传参

 @GetMapping("/user2")
    public String user1(String name) {
        return "name:"+name;
    }

注意:参数变量的名称要和请求中要获取的值的键名相同。
在这里插入图片描述

获取多个请求参数

【方法一】通过Servlet的request对象来获取

【方法二】在 Spring MVC 中可以直接⽤⽅法中的参数来实现传参

注意:参数变量的名称要和请求中要获取的值的键名相同,参数的顺序没必要一一对应。

@GetMapping("/user3")
    public String user3(String name,Integer age) {
        return "name:"+name+" | age:"+age;
    }

获取对象

如果,请求所传递的值太多了,使用参数来接收就有些不太合适了,这时候可以使用对象来接收

注意:
对象里的属性的名称要和请求中要获取的值的键名相同,否则无法赋值,必须要有相对应的setter方法,否则名字相同但是也无法赋值

public class User {
    private String name;
    private Integer age;

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public String getName() {
        return name;
    }

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

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}
 @GetMapping("/user4")
    public String user4(User user){
        return user.toString();

    }

获取表单参数

参数的请求类型:

  1. 通过url方式发送http请求
  2. 通过Ajax方式发送http请求
  3. 通过form表单方式发送http请求

获取表单的参数可以通过上面三种方法:获取单个参数,获取多个参数,获取对象 来获取

获取JSON对象

获取json对象和上面获取对象 是不一样的。上面的介绍获取对象的方法只能获取普通的对象,并不能获取json格式的对象。要获取json格式的对象,就要在参数前面加一个**@RequestBody**

 @PostMapping("/user5")
    public String user5(@RequestBody User user){
        return user.toString();

    }

获取请求中的文件

使用@RequestPart注解来指定接收文件的名称,参数的类型是MultipartFile

 @PostMapping("/ref")
    public String ref(String name, @RequestPart("milfile")MultipartFile file) throws IOException {
        //保存文件到本地电脑,使用transferTo()方法,实参是File类型
        File file1 = new File("D:\\JAVAcode\\Java  Web 练习\\spring mvc - demo03\\ww.png");
        file.transferTo(file1);
        System.out.println(name);
        return "文件保存成功";

    }

在这里插入图片描述

获取请求中Cookie/Session/header

获取请求中Cookie

【方法一】通过Servlet的request对象来获取(最原始的方法)

@GetMapping("/user1")
    public String user1(HttpServletRequest request, HttpServletResponse response) {
        //获取全名cookie
        Cookie[] cookies = request.getCookies();
        return "key:"+cookies[0].getName()+"val:"+cookies[0].getValue();
    }

这种方法比较暴力,将cookie全部获取

【方法二】使用SpringMVC提供的方法

使用@CookieValue注解获取cookie的值,一次只能获取一个cookie的值,通过设置cookie的key值来获取cookie的值,@CookieValue注解是加在方法参数前面的。

@GetMapping("/user6")
    public String user6(@CookieValue("name") String val) {
        return "val:"+val;
    }

获取请求中Session

【方法一】通过Servlet的request对象来获取(最原始的方法)

@GetMapping("/user7")
    public String user7(HttpServletRequest request, HttpServletResponse response) {
        //参数true,如果没有HttpSession对象,会创建一个HttpSession对象
        HttpSession aTrue = request.getSession(true);
        return "ok";
    }

【方法二】使用SpringMVC提供的方法

使用@SessionAttribute注解,设置里面两个参数value和required 。

value是设置要查找值的键名,而required 则是设置是否必须要有值,默认是true表示一定要有值,否则会报错,

false表示不一定要有值,没有则给变量赋一个null。

Session对象里面是通过键值对的方式来保存数据

 @GetMapping("/user8")
    public String user8(@SessionAttribute(value = "age",required = false) Integer age) {
        return "age:"+age;
    }

获取请求中Header

我们学习过Http协议,了解http协议的请求,我们知道请求头是以键值对的方式存在的,键和值之间使用冒号(:)隔开

【方法一】使用request对象来获取Header(最原始的方法)

@Controller
@ResponseBody
public class TeacherController {
    @RequestMapping("/get_header")
    public String getHeader(HttpServletRequest request) {
        String header = request.getHeader("User-Agent");
        return "User-Agent:"+header;
    }
}

【方法二】使用SpringMVC提供的方法

使用@RequestHeader注解来设置我们需要获取请求header的值的键名。

@Controller
@ResponseBody
public class TeacherController {
    @RequestMapping("/get_header1")
    public String getHeader1(@RequestHeader("User-Agent") String header) {
        return "User-Agent:"+header;
    }
}

@RequestHeader注解不仅仅可以设置要获取请求的header,还可以设置required参数

required参数的值可以为true和false

值为true表示如果请求头没有相应的header则会报错

值为false表示如果请求头没有相应的值,则不会报错,会给方法中相对应的参数赋空值

所以,@RequestHeader注解中的required参数的设置就是确保否必须要有值。

获取请求数据的特殊情况

后端参数重名

我们在获取单个参数和获取多个参数时,我们规定请求参数的名称和后端方法参数名称是要相同的,否则后端获取不到请求内容。

但是,如果在实际情况,前后端的参数名称不一致,如果获取请求相对应的参数值呢?

在后端方法参数前使用@RequestParam注解指定获取请求的哪个参数

@RequestParam注解可以设置两个参数

value参数:设置获取请求的哪个参数

required参数:规定前端是否一定要传这个参数,默认是true。true表示必须传,false表示不是必须传,如果没有给后端相对应的参数赋空值

 @RequestMapping("/date")
    public String date(@RequestParam(value = "username",required = false) String name) {
        return "name:"+name;
    }

获取URL中参数

我们一般前端传参是通过Query Params方式来进行,有种特殊的url传参是将参数之间写到路径中。这样我们该如何获取参数呢?

 @RequestMapping("/date1/{name}/{age}")
    public String date1(@PathVariable String name,@PathVariable String age) {
        return "name:"+name+" age:"+age;
    }

我们可以看到,这里配置的路由都跟我们之前有一些不一样,要获取的部分用花括号({})括起来,表示这个是动态的,可变,是需要被后端获取的。

后端则是要在相对应的方法的参数前面加上@PathVariable注解。

@PathVariable注解可以设value参数和required参数,效果和之前注解是一样的,这里就不写了

强调一下,在使用@PathVariable注解但是不设置参数值,那么方法的参数名要与设置路由使用花括号的名字相同,否则获取不到相对应的值。

返回数据给前端

返回静态⻚⾯

要想返回静态页面,首先在resources.static包下要有静态页面,并且与前端交互的xxxController的类不能有@ResponseBody注解。

@Controller
public class PeoController {
    @RequestMapping("/pe")
    public String pe() {
        return "/index.html";
    }
}

返回数据

使用@ResponseBody注解就能解决这个问题,返回数据的类型项目会自己识别,不需要程序员自己设置。

@ResponseBody注解写在类前表示该类每一个方法配置的路由都是返回数据的。

@ResponseBody注解写在方法前表示该方法配置的路由返回的是数据。

 @RequestMapping("/p_user")
    @ResponseBody
    public User getUser(@RequestBody User user) {
        return user;
    }

当返回的类型是对象和HashMap对象的时候,返回的类型是json类型

请求转发或请求重定向

在返回视图的时候,我们不仅仅可以返回视图,还可以实现跳转,跳转的方式有两种:

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

请求转发vs请求重定向

  1. 请求重定向将请求重新定位到资源,而请求转发则是在服务器内部进行转发
  2. 请求重定向地址栏发生变化,请求转发地址栏没有发生变化‘
  3. 请求重定向与直接访问新地址效果一样,不存在原来的外部资源不可访问;请求转发服务器端转发有可能造成外部资源不能访问的情况
@Controller
public class PeoController {

    /**
     * 请求转发
     * @return
     */
    @RequestMapping("/fo")
    public String fo() {
        return "forward:/index.html";
    }

    /**
     * 请求重定向
     * @return
     */
    @RequestMapping("/re")
    public String re() {
        return "redirect:/index.html";
    }
}

注意:千万不能加@ResponseBody注解,否则会被解析成返回数据,则不能实现页面的跳转

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/95963.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

高通平台开发系列讲解(DSI篇)DSI层在拨号中的调用逻辑

沉淀、分享、成长,让自己和他人都能有所收获!😄 📢DSI层在拨号中起到的是承上启下的作用。 拨号初始化: 通过mcm_data_init_srv接口调用dsi_init_ex接口,而dsi_init_ex接口进一步通过依次调用dsi_init_cb_func来初始化注册回调、dsi_init_cb_data来初始化数据回调及dsi…

XXL-Job分布式任务调度框架-- 介绍和服务搭建1

一 xxl-job介绍 1.1 xxl-job介绍 xxl-job是轻量级的分布式任务调度框架,目标是开发迅速、简单、清理、易扩展; 老版本是依赖quartz的定时任务触发,在v2.1.0版本开始 移除quartz依 。 分布式任务调度平台XXL-JOB/ 分布式任务调度平台XXL-JOB 二 xxl-…

Prometheus之集成Flink

目录1. 基本介绍2. 拷贝Flink jar包3. 修改Flink的配置文件flink-conf.yaml4. 重启Flink集群5. 验证是否集成成功1. 基本介绍 Flink提供的Metrics可以在Flink内部收集一些指标,通过这些指标让开发人员更 好地查看作业或集群的状态 2. 拷贝Flink jar包 在Flink集群…

[附源码]Node.js计算机毕业设计互联网在线笔记管理系统Express

项目运行 环境配置: Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境:最好是Nodejs最新版,我…

【C++】list的介绍和使用

​🌠 作者:阿亮joy. 🎆专栏:《吃透西嘎嘎》 🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根 目录👉list 的介…

操作系统原理和接口

这个阶段的课程讲授操作系统的原理和Linux系统给应用层提供的C编程接口。操作系统通过系统调用提供的抽象层是一切中间层和应用软件的根本。 课程建设思路-传统误区 长久以来这个阶段的课程是按照《UNIX环境高级编程》这本书进行讲解的。这个环节的课程甚至曾因此被称为"高…

新能源电动汽车充电桩收费平台

安科瑞 华楠 一、业务模式 平台客户 两种合作方式 1)数据托管方式 安科瑞指导用户完成充电桩的安装,用户的充电桩将数据上传至安科瑞充电桩收费运营云平台,委托安科瑞管理,按规定/约定收取托管费用。 2)用户自建平…

D-028 DDR3硬件电路设计

DDR3硬件电路设计1 简介2 电路设计3 设计要点1 简介 RAM(Random Access Memory)是随机存储器,存储单元中的内容可以按需任意去除或者存入,并且存取的速度与存储单元的位置无关。这种存储器在断电时,将丢失其存储的内容…

@Pointcut 的 12 种用法

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…

数据结构---鸡尾酒排序

鸡尾酒排序是基于冒泡排序的一种升级排序法(双向冒泡排序)冒泡排序:每一轮都是从左到右来比较元素,进行单向的位置交换的。鸡尾酒排序的元素比较和交换过程是双向的。解决的问题如下:从小到大排序{2,3,4,5,6,7,8,1} 如…

微服务框架 SpringCloud微服务架构 多级缓存 48 多级缓存 48.9 Nginx 本地缓存

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 多级缓存 文章目录微服务框架多级缓存48 多级缓存48.9 Nginx 本地缓存48.9.1 Nginx本地缓存需求48.9.2 Nginx 本地缓存48 多级缓存 48.9 Ng…

LCHub:伙伴云荣获21世纪商业模式高峰论坛 低代码平台明星企业

12月13日,由南方财经全媒体集团指导,《21世纪商业评论》、《21世纪经济报道》联合主办的“21 世纪商业模式高峰论坛(2022)”在上海绿地万豪酒店举行。 大会公布了21 世纪商业模式竞争力研究榜单,伙伴云凭借在低/无代码领域的技术创新,领先的商业模式和多维度专业服务能力,…

java设计模式之建造者模式(Builder Pattern)

目的:将产品与产品的创建过程解耦 。他是按照相应的步骤来构建产品 下面看一下UML序列图 对于序列图的一个解释 下面来上一个标准代码 Product.java package com.pxx;public class Product {private String shape;private int height;private String color;publ…

OAuth2四种授权模式

授权码模式 授权码模式(Authorization Code) 是功能最完整、流程最严密、最安全并且使用最广泛的一种OAuth2授权模式。同时也是最复杂的一种授权模式,它的特点就是通过客户端的后台服务器,与服务提供商的认证服务器进行互动。其具…

SpringMVC学习笔记 | SpringMVC从入门到源码分析

一、SpringMVC导学 二、SpringMVC简介 MVC M:模型 Model 指工程中的JavaBean 一类称为实体类Bean:专门存储业务数据的,如 Student、User 等一类称为业务处理 Bean:指 Service 或 Dao 对象,专门用于处理业务逻辑和数据访…

Java IO AIO学习+BIO聊天室+NIO详解

IO第一章 BIO、NIO、AIO课程介绍1.1 说明1.2 可以解决的问题第二章 Java I/O的演进2.1 I/O模型基本说明2.2 I/O模型BIONIOAIO2.3 适用场景第三章 Java BIO深入解剖3.1 Java BIO基本介绍3.2 传统的BIO编程实例3.3 单个客户端下的多发多收3.4 BIO 模式下接收多个客户端概述服务器…

【YOLOv7/v5系列算法改进NO.46】融合DLinkNet模型中协同双注意力机制CDAM2

文章目录前言一、解决问题二、基本原理三、改进办法前言 作为当前先进的深度学习目标检测算法YOLOv7,已经集合了大量的trick,但是还是有提高和改进的空间,针对具体应用场景下的检测难点,可以不同的改进方法。此后的系列文章&…

[附源码]Python计算机毕业设计-哈尔滨旅游项目推荐平台Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等…

[CCS12.1][CC2340] 环境搭建

环境搭建一、 CCS 安装二、打补丁包三、环境修改一、 CCS 安装 CCS12.0 安装并设置中文 CCS12.1.0.00007 下载 注:cc2340只能使用CCS12.1.0.00007以上版本。 其他准备: cc23xx_device_support_0.01.10.284_win64.zip FreeRTOSv202104.00.zip simplel…

WPF聚光灯光源学习

聚光灯,Spotlight;其照亮方式与 PointLight 类似,但是它既有位置又有方向; 它们在 InnerConeAngle 和 OuterConeAngle 属性所设置的锥形区域(以度为单位指定)中投射光; 此光源在一个圆锥形区域…