• JavaEE - Spring MVC


    1.MVC 定义

    MVC是Model View Controller 的缩写,是软件工程中的一种软件架构设计模式,它把软件系统分 为模型、视图和控制器三个基本部分。

     

    •  View(视图)指在应⽤程序中专门用来与浏览器进行交互,展示数据的资源
    •  Model(模型)是应⽤程序的主体部分,用来处理程序中数据逻辑的部分
    •  Controller(控制器)可以理解为⼀个分发器,用来决定对于视图发来的请求,需要用哪⼀个模型来处理,以及处理完后需要跳回到哪⼀个视图。即⽤来连接视图和模型。 

    MVC是⼀种架构设计模式,也⼀种思想,而Spring Web MVC是对 MVC思想 的具体实现。

    2.什么是Spring MVC

    Spring Web MVC 是基于 Servlet API 构建的原始 Web框架,从⼀开始就包含在 Spring 框架中。它的正式名称“Spring Web MVC”来⾃其源模块的名称(Spring-webmvc),但它通常被称为 “Spring MVC”。

    简言之,Spring Web MVC是一个Web框架 。

    总结来说,Spring MVC是⼀个实现了MVC模式的Web框架。

    在创建SpringBoot项目时,勾选的Spring Web框架其实就是Spring MVC框架。

    SpringBoot只是实现SpringMVC的其中⼀种⽅式⽽已。SpringBoot可以添加很多依赖,借助这些依赖实现不同的功能。SpringBoot通过添加Spring Web MVC框架,来实现web功能。

    就比如厨房可以用来做饭,真正实现做饭功能的是火和各种相关的食材和工具。

    厨房好比是SpringBoot,厨房可以装柜⼦,实现收纳功能,装燃⽓灶等实现做饭功能;做饭这就是MVC,在几千年以前有火有食材就可以实现做饭。

     不过 Spring在实现MVC时也结合了自身的特点做了改进:

     实现了前后端分离的思想,但核心是没有变的。

    3.Spring MVC 功能

    Spring MVC是⼀个实现了MVC模式的Web框架,是web框架,那么当用户在浏览器中输入url之后,Spring MVC项目就可以感知到用户的请求,并给予响应。

    学习SpringMVC重点是 如何通过浏览器和用户程序进行交互。

    主要分三个方面:

    1. 建立连接:将用户(浏览器)和Java程序连接起来,也就是访问⼀个地址能够调⽤到我们的Spring程序
    2. 传递参数:用户请求的时候会带⼀些参数,在程序中要想办法获取到参数,这块主要是获取参数的功能
    3. 结果返回:执行了业务逻辑之后,要把程序执行的结果返回给用户。

     3.1 建立连接

    在Spring MVC中使用 @RequestMapping 来实现 URL路由映射,也就是浏览器连接程序的作用。

    1. package org.example.usercontroller;
    2. import org.springframework.web.bind.annotation.RequestMapping;
    3. import org.springframework.web.bind.annotation.RestController;
    4. @RestController
    5. public class UserController {
    6. @RequestMapping("/hello")
    7. public String say() {
    8. return "this is a test";
    9. }
    10. }

     3.1.1@ResquestMapping 注解

    @ResquestMapping注解 是Spring Web MVC应用程序中最常被用到的注解之一,它是用来注册接口路由映射的。表示服务收到请求时,路径为/hello的请求就会调用say这个方法的代码。

    路由映射:当用户访问一个URL时,将用户的请求对应到程序中某个类的某个方法的过程就叫路由映射。

    搭配 @RestController 注解一起使用。

    一个项目中,会有很多类,每个类可能有很多的方法,Spring程序怎么会知道要执行哪个方法?这时,如果 类 加了注解@RestController ,当Spring对所有的类进行扫描时,Spring就会看到这个类里面的方法有没有@RequestMapping注解。相当于起到一个“标记”的作用(可以先这样理解,后续还会对@RestController详细讲解。

    @RequestMapping 和 @RestController 使用时没有先后顺序,即谁在谁的前面都没关系,不影响代码。

    @RequestMapping 源码:

      3.1.1.1@ResquestMapping 使用

    @ResquestMapping 既可以修饰类,也可以修饰方法。当修饰类和方法时,访问的地址是类路径 + 方法路径。当作用在类上时,该类的所有路径上都要加上 类的路径。

    1. @RequestMapping("/user") //修饰类
    2. @RestController
    3. public class UserController {
    4. @RequestMapping("/hello") //修饰方法
    5. public String say() {
    6. return "this is a test";
    7. }
    8. }

    注意:

    • @RequestMapping 的URL路径 前加不加 /  都可以,Spring程序启动时,会进行判断。如果没加Spring会拼接上一个 “/”。通常情况下加上“/”。
    • @RequestMapping 的URL路径 也可以是多层路径,最终访问时也是 类路径 + 方法路径。
    3.1.1.2 @RequestMapping 的请求属性 

    通过测试看出,@RequestMapping 既支持GET请求,也支持POST请求。进一步测试得出也支持其他的请求方式。

    那么,如何指定@RequestMapping的请求方法类型?

    我们可以显示指定需求:

    1)方式一, 通过method指定请求方式

    注意: 

    2)方式二

     3.2 请求参数

    3.2.1传参介绍

    1.普通传参,通过查询字符串来传参。

    我们通过URL来访问互联网上的某一个资源。

    URL格式:

    其中,查询字符串就是请求的参数。

     

    2.form-data表单传参

    表单提交的数据,在form标签上加上 enctyped="multipart/form-data" ,通常⽤于提交图片/文件。对应 Content-Type: multipart/form-data 。

    3.x-www-form-urlencoded传参

    form表单,对应 Content-Type: application/x-www-from-urlencoded。

    4. raw传参

    可以上传任意格式的文本。

    3.2.2 请求参数 

    访问不同的路径就是发送不同的请求。在访问请求时,可能会带有一些参数。学习Spring的请求 主要是学习如何传递参数到后端以及后端如何接收

    1)同一个路径,不同的请求方式,不报错

    2)同一个路径,同样的请求方式,代码报错

    (1)传递单个参数
    1. package org.example.usercontroller;
    2. import org.springframework.web.bind.annotation.RequestMapping;
    3. import org.springframework.web.bind.annotation.RestController;
    4. @RestController
    5. @RequestMapping("/request")
    6. public class RequestController {
    7. @RequestMapping("/param1")
    8. public String param1(String userName) {
    9. return "接收到的参数:" + userName;
    10. }
    11. }

    Spring MVC会根据方法的参数名,找到对应的参数,赋值给方法。

     如果参数不一致,是获取不到参数的。

    注意事项

    • 使用基本类型来接收参数时,参数必须要传。(除Boolean类型),否则报500错误;类型不匹配报400错误(如,参数是int类型,但是传参数时传成了String类型)。
    • 包装类型,不传参数时SPring接收到的数据为null。
    • 因此对于参数可能为空的数据 建议使用包装类型
    (2)传递多个参数

    和接收单个参数一样,直接使用方法的参数接收即可,使用多个形参。

    当有多个参数时,前后端进行参数匹配时,是以参数的名称进行匹配的,因此参数的位置不影响后端获取参数的结果。 

    3.3 结果返回

  • 相关阅读:
    数据中台选型必读(四):要想中台建的好,数据模型得做好
    Linux下延时一定时间,又不挂起程序。
    【Openstack Train安装】四、MariaDB/RabbitMQ 安装
    这可能是目前最全的Redis高可用技术解决方案
    k8s----集群优化
    如何成为前1%的程序员
    Python部分异常日志缺失
    IPV4报头及IPV6报头
    李宏毅《机器学习》丨7. Conclusion(总结)
    【微信小程序】实现组件间代码共享的behaviors
  • 原文地址:https://blog.csdn.net/QIAO182/article/details/140712221