【Spring】初识Spring MVC

文章目录


前言

Java中Spring是一个大的集合,包括Spring Boot、Spring Cloud......

而Spring MVC是基于Servlet API构建的原始Web框架,从一开始就在Spring 框架中。

Spring MVC全称为"Spring Web MVC"


一、MVC是什么?

MVC包括三部分:Model、View、Controller

View(视图) 即前端;Model(模型)处理业务逻辑和数据;Controller(控制器)选择处理模型和视图。他们之间的关系可以参考下图。

在IDEA中就可以创建Spring Web项目,Spring Boot只是实现MVC的一种方式而已。

二、学习Spring MVC

因为是Web框架,所以Spring MVC需要接收到用户所发送的请求并返回响应。主要分为以下三个方面:

  1. 建立连接:将用户与Java程序连接起来,使用户能够调用Spring程序
  2. 请求:用户向服务器发起请求,在程序中需要想办法获取到请求中存在的参数(也可能不含参数)
  3. 响应:执行业务逻辑之后将程序执行结果返回给用户。

建立连接

在Spring MVC中使用@RequestMapping实现URL路由映射,使得浏览器能够连接程序。 在程序中,为了能够更快找到路由映射,需要使用**@RestController注解**。

当程序运行时,会根据该注解查找类下面是否存在相应的路径。如果没有添加这个注解,程序是不会进入到类里面进行核验的。

java 复制代码
@RestController
public class demo01 {
    @RequestMapping("/hello")
    //方法名和路径名无需一致
    public String hello() {
        return "hello,Spring MVC";
    }
}

接下来访问: http://127.0.0.1:8080/sayHi, 就可以看到程序返回的数据了

@RequestMapping注解

@RequestMapping 是Spring MVC中最常被用到的注解,也是十分特殊的注解。它是用来注册URL路径的。

  1. 那么它支持哪些请求?答案是全部支持 。即支持Post、Get、Put......请求。(可以在Postman中测试)
    如果我们要让该注解只支持固定类型的请求那么该如何设置?我们可以配置@RequestMapping的参数,控制它请求的方式。当选择参数method,可以理解为以数组的形式放入数据,数据中存放的就是请求的方式。value就是注解的url。
    如果不选择method,那么默认为全部支持。
java 复制代码
@RequestMapping(value = "/hello2",method = {RequestMethod.GET,RequestMethod.PUT})
    public String hello2() {
        return "hello spring mvc";
    }

当然了,只支持单个请求方式的注解也是有的。诸如此类的请求注解都是只允许一种请求方式。

  1. 在上面的使用中,我们通过@RequestMapping、@GetMapping等注解加在每个方法上面,让Spring可以根据路实现客户端和服务器之间的请求响应。在方法上的路径成为"方法路径"。随着项目逐渐扩大,很有可能出现方法路径相同的失误。为了防止路径重复,我们建议每个类都加上"类路径",这样就可以避免不同类之间相同路径难以发现的问题了。

类路径应该如何配置呢?用的就是@RequestMapping ,我们可以通过注解的源码来窥探一二。通过@Target注解,其中有两种:TYPE和METHOD 当为TYPE时,则该注解为类注解,当为METHOD时,该注解为方法注解。


像@RequestMapping 两种方式都有,因此属于类注解也属于方法注解,而例如@PostMapping 就只有一个METHOD 因此它只能用于方法注解上。

注解的使用细节

1、同样的url路径,不同的注解请求是互不影响的。

2、同样的请求方式,同样的路径是会报错的,由于Spring是根据路径进入方法的,而相同路径会造成Spring不知道应该执行哪一个而报错。

运行后报错截图如下。

三、传递参数的情况

后端开发自然有需要接收参数和传递参数的情况需要处理。这时候就像方法一样传入参数并执行逻辑。

传递单个参数

1.传递String

以下面的简单的代码为例,我们在Postman里面进行测试的路径应该为

"http://127.0.0.1:8080/params/param1" 并且我们必须保证 参数为name,在Postman里面的参数名称也必须为name(我们也可以选择参数重命名的方法,即使用@RequestParam注解) 在下文展示。

java 复制代码
@RestController
@RequestMapping("/params")
public class paramDemo {
    @RequestMapping("/param1")
    public String getName(String name) {
        return name;
    }
}

当我们编写的参数名为name1时,是没有办法获取到数据的;

当我们正确的输入传递参数名,就能够正常的处理请求。

2.传递包装类/基本类型

以Integer包装类与基本类型int为例,当传入参数合法时,二者表现无异。当传输参数为空时,Integer返回值为null而int类型则是报错。

在下面的方法中,返回值为String类型,对于传输的数据,Spring能够自动将数据进行类型转换。

java 复制代码
	@RequestMapping("/param2")
    public String getNum(Integer num) {
        return "接收到参数:" + num;
    }
    @RequestMapping("/param3")
    public String getNum1(int num) {
        return "接收到参数:" + num;
    }

对于报错信息状态码为400,大部分表示客户端信息报错,int类型无法处理空值的数据状况。

3.参数重命名(@RequestParam)

在前面我们知道,参数的名称顺序必须一一对应,不然无法成功进行请求和响应。那么当前端与后端发生分歧时,可能导致参数名称不一致,这时我们就需要将前端的变量名调回和后端一致的变量。

使用了@RequestParam之后,将参数名name转变为userName,我们可以理解为废弃掉name这一变量名,以后只用userName。

需要注意的是,以后对参数传递就不能使用name了,而是只能使用userName作为参数名。

在使用了该注解之后,该参数就变成了必填项。我们可以配置required = false改变它是否为必填项。

java 复制代码
	@RequestMapping("/param1")
    public String getName(@RequestParam("userName") String name) {
        return name;
    }
	//修改必填项
	@RequestParam(value = "userName",required = false


传递多个参数

以下面的param4为例,传入两个参数为userName和password,当我们传入数据时,我们对于参数的顺序是不严格要求的。

java 复制代码
	@RequestMapping("/param4")
    public String param4(String userName,String passWord) {
        return "接收到 name:"+userName + "password:"+passWord;
    }

在Postman中的测试以下图为例。在调整了参数传递顺序之后也不会影响结果的改变。

原因:在传入的数据进入Spring之后,存在类似与Map的数据结构,将变量名和数据一一对应,从而不会出现数据乱套的情况。

传递对象

传递对象和传递普通参数的步骤其实是一样的,在对象中已经有了所需要的信息。

在代码中创建了UserInfo类,并存入变量name、age、password 而在"/param5'路径下,我们可以直接放入userInfo对象。

在对象中,int为基本类型,是存在默认值为0的,因此出现age未赋值的情况下也不会报错。

java 复制代码
@RequestMapping("/param5")
    public String param5(UserInfo userInfo) {
        return "接收:"+userInfo;
    }


小细节

在Postman中,暂时用到两种方式,以Params进行参数的传递。这种方式将所有的参数都拼接到了一起,我们可以发现使用Params方式的情况下url路径都将变量拼接起来了。而以form表单进行提交的情况下并不会发生这种情况。

而传输对象数据的情况下,以form表单进行提交是只能使用Post的方式的,而已Params方式提交只能使用Get和Post两种方式。

总结

Spring MVC是Java中十分常用的一个设计思想。其中的注解有多般变化,PostMapping是其中十分重要的注解。此外类注解和方法注解都有自己的标识。传递参数的方式有多种,需要仔细思考。

源码Spring MVC


总结

提示:这里对文章进行总结:

例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

相关推荐
一元咖啡13 分钟前
SpringCloud Gateway转发请求到同一个服务的不同端口
spring·spring cloud·gateway
儿时可乖了20 分钟前
使用 Java 操作 SQLite 数据库
java·数据库·sqlite
ruleslol21 分钟前
java基础概念37:正则表达式2-爬虫
java
xmh-sxh-131438 分钟前
jdk各个版本介绍
java
天天扭码1 小时前
五天SpringCloud计划——DAY2之单体架构和微服务架构的选择和转换原则
java·spring cloud·微服务·架构
程序猿进阶1 小时前
堆外内存泄露排查经历
java·jvm·后端·面试·性能优化·oom·内存泄露
FIN技术铺1 小时前
Spring Boot框架Starter组件整理
java·spring boot·后端
小曲程序1 小时前
vue3 封装request请求
java·前端·typescript·vue