目录
1. MVC简介
2. SpringMVC简介
3. 路由映射注解
3.1 @RequestMapping
3.2 @GetMapping与@PostMapping
4. 接收前端传递参数
4.1 接收单/多个参数
4.2 接收对象
4.3 接收JSON对象
4.4 后端参数重命名/映射
4.5 设置参数必传/非必传
4.6 获取URL中的参数
4.7 获取文件
4.8 获取Cookie
4.9 获取Session
4.10 获取请求Header中的信息
5. 返回参数给前端
5.1 返回静态资源
5.2 返回text/html
5.3 返回JSON对象
6. 请求转发和请求重定向
1. MVC简介
MVC模型指的是 Model、View和Controller。
- 其中Model模型层用于处理应用程序中数据逻辑,作为实体类与数据库进行交互同时也是数据的载体;
- View视图层主要负责数据向用户的展示;
- Controller控制器层主要用来处理和用户的交互过程,通常负责从View层读取数据并控制Model层的数据逻辑处理。MVC模型的简介图如下:
2. SpringMVC简介
类似于Spring的控制反转容器IOC和依赖注入DI的关系一样,如果说MVC是一种思想,那SpringMVC就是MVC思想的一种具体实现。总的来说,SpringMVC是一个实现了MVC模式的框架结构,并继承了Servlet-api框架,当用户发送请求后,我们的SpringMVC就可以感受到用户的请求。同时,SpringMVC也可以被当作是Spring框架的核心,下面我们主要基于SpringBoot来构建SpringWeb框架。关于SpringBoot项目的创建步骤,可以参照之前的这篇文章:SpringBoot及其配置文件
3. 路由映射注解
3.1 @RequestMapping
这是SpringWeb项目中最容易遇到的注解一个,它的功能与我们之前学习的Servlet中的@WebServlet的功能类似,用户通过其中配置的url信息即可将请求发送到对应的类的方法上。
- @RequestMapping可以修饰类也可以修饰方法,当只修饰方法时,我们可以通过指定一级路由直接访问到该方法;当修饰类和方法时,我们需要使用二级路由才能正确映射。
@RequestMapping的使用图解:
@RequestMapping注解的标注的方法可以接收Get请求也可以接收Post请求,以及其他类型的请求:
3.2 @GetMapping与@PostMapping
这两个注解的功能与@RequestMapping的功能类似,都用来指定后端的路由映射。不过,这两个注解相对于@RequestMapping有以下区别:
- 使用@GetMapping配置的路由信息对应的方法只支持Get请求
- 同理,使用@PstMapping配置的路由对应的方法只支持Post请求
4. 接收前端传递参数
4.1 接收单/多个参数
在SpringMVC中,我们可以直接通过在方法的参数上添加参数来接收前端传递过来的参数,不过,在方法上添加参数时有以下注意事项:
- 添加的参数名称要和前端发送请求时指定的参数名称一致
- 添加参数的类型使用引用数据类型
- 当有多个参数时,后端方法参数的顺序不影响参数值的接收
我们来看看这些注意事项如没有被重视会导致什么后果:
4.2 接收对象
接收对象只是在后端将参数的值集合进行了封装,在前端仍然是按照自己该有的方式传递参数,不过值得注意的是:
- 前端传递的参数的名称要和后端编写的类的属性名称一致;
- 后端类提供了属性的getter和setter方法才能成功获取到参数的值。
下面我们以后端接收User类为例,来学习下后端接收对象的过程:
4.3 接收JSON对象
当我们还是用普通接收对象的方法来接收前端传递过来的json格式的字符串描述的对象时,会发现根本接收不到或者说转换对象不成功。这个时候我们就需要使用@RequestBody来告诉我们的程序前端传递过来的是一个json格式的数据,我们的程序才能够成功将其转化为对应的JSON对象。如下:
4.4 后端参数重命名/映射
我们的接口不是已经和前端约定好了吗?为什么还要有接收参数的重命名呢?
其实这种修改后端参数名称的场景还是存在的,比如项目已经发布了,但是突然发现前后端接口参数不一致,项目功能不能正常运转了!!而前端过年放假回家没有带电脑,这个时候测试又向你提了这个bug,那我们就需要有能力站在后端舞台上解决这个问题。而后端的业务代码又用我自己的变量名称编写了一大堆。那好的解决办法就是先接收前端的参数值,然后再对这个方法参数进行重命名。所以,参数重命名还是有必要的,有备无患嘛!
后端参数重命名通过在对应方法的对应参数的前面加上@RequestParam注解并指定重命名参数的名称即可实现:
4.5 设置参数必传/非必传
对于上面 4.4后端参数重命名/映射 中,如果我们再对参数重命名后,默认情况下这个参数是必传的,如果没有传递就会导致程序出错。我们可以通过设置RequestParam注解中的required属性为false指定当前参数为非必传即可解决上述问题,如下图:
4.6 获取URL中的参数
这里的参数值得不是获取查询字符串中的参数,而是指类似下面这种格式的URL中携带的参数的获取:
要实现上面的参数的获取方式,我们需要
- 修改我们后端程序中的映射URL的格式
- 使用注解@PathVariable
如下图所示:
4.7 获取文件
在Spring中,我们又该怎样获取前端上传的文件信息呢?获取步骤共分为以下两步:
- 使用@RequestPart注解标注参数代表这是一个文件变量
- 指定@RequestPart中的name属性
- 文件变量使用MultipartFile类创建
话不多说,我们现在在前端发送一个文件并通过后端程序接收将文件持久化到本地硬盘上,直接上图:
4.8 获取Cookie
如果要获取所有的Cookie,我们仍然需要使用Servlet的写法;而如果只获取一个Cookie的值,可以直接使用框架为我们提供好的注解@CookieValue。
我来先来使用Servlet获取所有的Cookie信息,以及使用@CookieValue注解获取单个Cookie信息:
4.9 获取Session
要想获取到Session,必须先有session的存储,而对于session的存储,我们只能使用原生servlet来实现,其实想想也好理解,session是和我们后端系统相关的参数,我们也不指望这个参数是从前端传递过来的,因此SpringMVC也没有为我们提供更好的存储session的方法。下面我们先使用原生servlet将session对象存储起来。
存储session:
除了可以用原生Serlvet来获取外,SpringMVC也为我们提供了一种简便的获取Session中具体属性的方法:使用@SessionAttribute注解。
获取Session对象(Servlet +框架两种获取方法):
关于session的使用特性:
我们都知道,由于session是存储在内存上的,按理来说,当我们的程序重启后,内存中存放的session信息应该就不存在了,但是我在将程序重启后,发现session信息依然存在,这是怎么肥事呢?如下:
4.10 获取请求Header中的信息
同样,在SpringMVC中,我们依然可以使用传统的获取方式来获取,SpringMVC也为我们提供了一种更为简便的获取请求Header中信息的方式:使用@RequestHeader注解。
使用传统方式和@RequestHeader注解获取Header中信息:
5. 返回参数给前端
5.1 返回静态资源
SpringMVC默认情况下返回的就是静态页面,我们只需要:
- 不标注@ResponseBody注解,方法的返回值类型为Object/String都可以
- 将返回的信息修改为静态页面路径信息即可
如下:
5.2 返回text/html
默认情况下,标注了返回类型为数据的@ResponseBody注解后返回的字符串即为text/html格式:
5.3 返回JSON对象
我们只需要返回一个对象或者一个字典类型的对象如HashMap,并使用注解@ResponseBody指定返回类型为数据格式即可。
- 如果返回的是普通对象:SpringMVC会将对象转换为JSON格式的字符串并以JSON的格式返回给前端。其中JSON对象的key值为对象的属性名称,value值为对象的属性的值。
- 如果返回的是字典类型的对象,SpringMVC也会将其转换为JSON格式的字符串并以JSON格式返回给前端。其中JSON对象的key值为字典类型的key值,JSON对象的value值为字典类型的value值。
如下:
6. 请求转发和请求重定向
再SpringMVC中,方法返回的不仅可以是一个页面或数据,还可以返回一个字符串来实现跳转。实现跳转的方式有以下两种:
- 转发 ——在方法的返回值中返回字符串: "forward:/资源名"
- 重定向 ——在方法的返回值中返回字符串: "redirect:/资源名"
我们来练习下请求转发和请求重定向以及发现一个细节:
请求转发和请求重定向的具体区别:
- 请求重定向将重新定位到资源,相当于一次全新的访问。请求转发由服务器转发。
- 请求转发请求的地址不发生变化,请求重定向请求的地址发生变化。
- 请求重定向与直接访问新地址效果一致;请求转发由服务器端完成,可能存在原外部资源不能访问。
请求转发如果资源和转发的页面不在同一目录下,将会导致转发的页面的外部资源不可访问。