前言:本篇博客将从三个方面来写我们要学习SpringMVC的什么:
- 连接:当用户在游览器中输入一个url之后,能将这个url请求映射到自己写的程序,也就是访问一个地址时,能够连接到门自己写的服务器.
- 获取参数:用户访问时如果带一些参数,我该怎样获取.
- 返回数据:执行业务代码之后,将结果返回给用户(前端).
学习SpringMVC,我们就要先搞定这三点,至于业务代码,那就看各自的需求了.
目录
1. 什么是Spring MVC
2.实现前端与后端的连接(交互)
2.1 @RequestMapping注解
3.获取前端传过来的参数
3.1 获取简单的基本类型参数
3.2 获取对象
3.3 获取表单参数
3.4 获取JSON对象参数
3.5 获取文件并上传
3.5 获取 Cookie
3.6 设置Session并读取
3.7 获取Header
3.8 重命名前端参数
4.返回响应结果
1. 什么是Spring MVC
Spring MVC 全称Spring Web MVC,Spring Web MVC 又被简称为SpringMVC或SpringWeb.SpringMVC是基于Servlet API构建的一个Web框架.
MVC是一种思想,是Model View Controller的缩写,译为模型,视图,控制器.它是软件工程中的一种软件架构模式,Spring MVC就是实现了MVC思想的一个具体框架.MVC它们之间的关系如下:
Spring/SpringBoot/Spring MVC有什么区别?
Spring是一个框架,是一个包含了众多工具的IoC容器,其核心思想就是IoC;而 SpringBoot 就是为了Spring的创建而诞生的,就是为了快速去开发Spring框架.而它的底层就是依赖的Spring.它给Spring自动添加了很多依赖,可以理解为SpringBoot是依赖Spring框架来管理对象的依赖的.它更方便我们去开发一个Spring项目;而SpringMVC是Spring中一个专门面向Web开发的框架,它是基于Spring的.可以理解为它使用了Spring框架,基于MVC模式一种Web框架.
Spring和SpringMVC你可以理解为全能干细胞和分化后的细胞.Spring是原生的一种框架,有无限种可能,可以开发各种java项目.而Spring MVC是基于Spring,被特化为一种专注于MVC模式的Web框架.
知道了什么是SpringMVC之后,我们现在就来学习前面提到的三点:连接.获取参数,返回数据.
2.实现前端与后端的连接(交互)
我们先来创建一个SpringMVC项目,之后的讲解也都是基于这个项目的.
其实在创建Spring Boot项目时勾选中Spring Web的第三方框架支持,这样就是SpringMVC项目了.如下:
这样我们就有了一个SpringMVC的项目.
然后现在有这么一个情景:当我访问地址 http://localhost:8080/user/hi 时,页面上能打印"Hello World!"这行字符串.
很显然,如果要完成这么一个任务,我肯定要将这个 url 映射到我后端的代码,也就是说要与后端连接起来.连接起来之后才能去完成一些任务.怎么实现呢,我们来看.
我们创建一个 UserController 类,实现用户与程序的连接,具体实现代码如下:
如图所示,建立起和前端的连接需要用到@RequestMapping这个注解.
注意:在此种情况下,@Controller和@ResponseBody这两个注解必须要加上.加上@Controller注解后该类才会在启动时被加载到容器中;因为Spring默认是返回一个页面,而加上@ResponseBody就是告诉Spring,该类返回的是一个数据,而不是一个面.@ResponseBody这个注解可以加载类上,也可以加在方法上.另外,@Controller和@ResponseBody这两个注解可以用一个@RestController注解来代替.
2.1 @RequestMapping注解
- @RequestMapping 是Spring Web应用程序中最常被用到的注解之一,它是用来注册接口的路由映射的.
路由映射:当用户访问一个url时,将用户的请求对应到程序中的某个类的某个方法的过程就叫路由映射.
- 与Servlet不同,Servlet的路由注解只能用来修饰类,而@RequestMapping可以修饰类,也可以修饰方法,还可以同时修饰.如上图代码所示,既修饰了类也修饰了方法.
- @RequestMapping 既能接受post请求也能接受get请求.
如果想只接受Get请求或只接受Post请求,可以按照以下这种写法:
也可以使用注解@GetMapping或@PostMapping去专门指定一种请求.
总结:要想实现前端与后端的连接,主要是靠@RequestMapping,@GetMapping或@PostMapping注解来实现的.
3.获取前端传过来的参数
要知道,SpringMVC是基于Servlet API构建的一个Web框架,所以它获取参数是可以和Servlet相同的的.对于SpringMVC,其内部默认内置隐藏了两个参数,一个是HttpSevletRequest对象,一个是HttpSevletResponse对象.如果你想用的这两个对象,可以在路由映射的方法的参数中直接声明这两个对象即可.如以下代码:
启动服务器,游览器访问 localhost:8080/user/hi?name=张三 ,结果如下:
但是作为更高级的SpringMVC框架来说,有更简单的获取参数的方法,接下来我将介绍在SpringMVC中常见的几种获取参数的方法.
3.1 获取简单的基本类型参数
如图,我只需要路由映射的方法的参数列表中声明参数类型即可,这样就可以接收前端传递过来的参数啦.启动服务器,访问localhost:8080/user/get1 ,结果如下:
为什么age的类型要用Integer而不是int呢?
首先说明一下,这里是可以用int的,但是我们不能确定前端一定会给后端传递一个int型的参数,也就是说前端可能什么都不传,为了防止空指针异常,我们这里使用int的包装类Integer.
如果前端要传入多个参数的话,后端这边要接收的话,只需要在路由映射的方法的参数列表中一一声明即可,比如这样:
3.2 获取对象
上面说到,如果获取多个参数的话,可以在方法的参数列表中一一声明即可.那如果前端传过来几十上百个参数呢,还是一一列举吗?这种方式肯定也行的通,但是非常麻烦,而且不利于后期维护.所以面对这种情况,我们通常将前端要传递的参数封装成一个类,我们只需要维护这个类的属性即可.
比如前端要传递给后端一个学生的信息(编号,姓名,年龄...),那我后端怎么来接收呢,可以将其一一写在参数列表里面,但是太麻烦.这里我们将其封装成一个Student类,代码如下:
然后在路由映射的方法的参数列表中写上Student这一个类型的参数就行了,如下 :
启动服务器,访问localhost:8080/user/get2?age=45&name=张三&id=1,结果如下:
3.3 获取表单参数
如果现在有一个表单页面,如下:
表单源代码如下:
现在我将在表单的用户栏上填写"张三",密码栏上填写"123",点击提交,将数据发送给后端,后端要怎么来接收呢?
因为表单数据比较少,只有两条,所以我可以直接在后端中声明两个参数来接收即可.代码如下:
运行结果如下:
很显然,用这种方法是可以获取到表单的参数的.
但是如果遇到表单参数比较多的呢,还是一一声明吗,肯定也可以,只不过太麻烦,所以我们通常用另外一种获取表单参数的方法来解决表单参数比较多的情况----将需要接收的参数用一个类封装起来.
比如前端通过表单数据传递给后端一个用户的信息(姓名,密码...),然后我就可以在后端将这些属性用一个User类给封装起来,如果以后前端有什么其他属性要修改啥的,我后端就只需要维护那个User类里面的属性就行了.代码如下:
如果前端通过表单传递这些信息过来的话,我后端的参数就只需要写User类型即可,代码如下:
启动服务器,访问localhost:8080/login.html ,页面如下:
点击提交,结果如下:
这样就说明我们后端通过封装对象这个方法成功获取到了前端通过表单传递过来的数据.
3.4 获取JSON对象参数
我现在通过Postman向后端传递一个JSON类型的参数,如下:
则后端可以这样来接收这个JSON对象,代码如下:
注意看,参数列表中除了有参数以外,还有一个@RequestBody注解,在这里,这个注解的作用就是告诉后端,参数的获取应该到http请求的body里面去找,因为JSON对象就是在http请求的body里面.如果不加这个注解,后端将拿不到JSON对象.
另外还需要注意,后端这边对于JSON参数的接收,只能用一个对象来接收,因为JSON的出现一定是以对象的形式出现的,而不会以单个属性出现.
3.5 获取文件并上传
后端对于文件的接收是怎样的呢?又是怎样保存文件的呢?直接看以下代码的实现:
我们现在来验证一下.用postman给后端发以下请求:
点击Send后,看收到的返回信息:
显然,不出意料的得到了自己想要的结果.我们再来看一下文件是否真的上传到了指定位置:
因此,文件的获取和保存就成功了.
3.5 获取 Cookie
获取Cookie的方法不止一种,这里只讲一种简洁的获取Cookie的方式--使用@CookieValue注解,代码如下:
接着我们来验证一下这段代码是否真的获取能获取到前端的Cookie.
在谷歌游览器上构造以下Cookie:
然后访问localhost:8080/user/get5,结果如下:
验证成功!
3.6 设置Session并读取
设置Session:
获取Session:
先访问localhost:8080/user/setsession来设置一个session,然后访问localhost/user/getsesion,结果如下:
3.7 获取Header
使用@RequestHeader注解就行,在参数中声明需要获取的某一个即可:
游览器访问localhost:8080/user/header,可得到以下结果:
3.8 重命名前端参数
按照上面讲的,如果前端传递了一个name给后端,而后端用username来接收的话,会出现后端参数接收不到的情况,比如以下代码:
如果前端这样访问:localhost:8080/user/getname?name=张三,很显然肯定是访问不到的.但是在日常的开发中,有时会有前后端都坚持自己的参数命名,而作为一个后端人员,我必须拿到前端数据,但是我又不想使用前端规定的参数名称,这时我就可以使用 @RequestParam 注解来重命名前端的参数值.如以下代码:
现在通过 localhost:8080/user/getname?name=张三 就可以访问到了.结果如下:
补充:使用@RequestParam注解还可以对参数设置是否必须接收到,代码如下:
4.返回响应结果
返回数据给前端就很简单,直接return就行,我上面写的那些代码里面都有返回数据的,可以仔细看一下.
这里要补充几点:
(1).如果返回的是一个HashMap的话,会自动被转化为JSON格式的.
(2).如果要返回一个静态页面的话,就不用加@ResponseBody.这样返回的话就是一个页面的地址,比如以下代码:
访问 localhost:8080/test/index ,可得到如下结果:
(3).return 不仅可以返回一个页面,还可以实现跳转,跳转的方式有两种:
- forword:请求转发
- redirect:请求重定向
以下是这两种方式的使用:
关于SpringMVC的学习就到这了,看完这篇博客,文章开篇说的那三点知道了吗,如何与前端连接,如何接收参数以及如何返回结果.是不是发现越是高级的框架越简单呢,因为很多它已经帮我们内置好了,我们可以直接使用注解来实现.好啦好啦,就先到这了,拜拜~~~