2021-08-06 SpringMvc基础知识

1、SpringMVC简介

Spring MVC 实现了即用的 MVC 的核心概念。它为控制器和处理程序提供了大量与此模式相关的功能。 并且当向 MVC 添加反转控制(Inversion of Control,IoC)时,它使应用程序高度解耦,提供了通过简 单的配置更改即可动态更改组件的灵活性

Spring MVC 框架是高度可配置的,包含多种视图技术,例如 JSP 、Velocity、themlefy等。Spring MVC 框架并不关心使用的视图技术,也不会强迫开发者只使用 JSP 技术,但教程中使用的视图是 JSP。

MVC 设计不仅限于 Java Web 应用,还包括许多应用,比如前端、PHP、.NET 等语言。之所以那么做的 根本原因在于各个模块的解耦。

MVC 是 Model、View 和 Controller 的缩写,分别代表 Web 应用程序中的 3 种职责。

模型:用于存储数据以及处理用户请求的业务逻辑。

视图:向控制器提交数据,显示模型中的数据。

控制器:根据视图提出的请求判断将请求和数据交给哪个模型处理,将处理后的有关结果交给哪个 视图更新显示

2、Spring MVC初学重点掌握的4个接口:

01:DispatcherServlet

    SpringMVC所有的请求都经过DispatcherServlet来统一分发,在DispatcherServlet将请求发给Controller之前需要借助SpringMVC提供的HandlerMapping定位到具体的Controller

02:HandlerMapping

    HandlerMapping接口负责完成客户请求到Controller映射

03:Controller

    Controller接口将处理用户请求,这和Java Servlet扮演的角色是一致的。一旦Controller处理完用户请求,将返ModelAndView对象给DispatcherServlet前端控制器,ModelAndView中包含了模型(Model)和视图(View)。从宏观角度看DispatcherServlet是整个Web应用的控制器;从微观考虑,Controller是单个Http请求处理过程中的控制器,而ModelAndView是Http请求过程中返回的模型(Model)和视图(View)。

04:ViewResolver

    ViewResolver接口(视图解析器)在Web应用中负责查找View对象,从而将相应结果渲染给用户

3、SpringMvc的工作流程

在这里插入图片描述

DispatcherServlet 收到请求,调用HandlerMapping处理器映射器 -->

处理器映射器找到具体的处理器,生成处理器对象及处理器拦截器一并返回给DispatcherServlet -->

DispatcherServlet 调用HandlerAdapter适配器 -->

HandlerAdapter执行完成返回ModelAndView -->

HandlerAdapter将Controller执行结果ModelAndView返回给DispatchServlet -->

DispatcherServlet将ModelAndView传给ViewReslover视图解析器 -->

ViewReslover解析后返回具体View -->

DispatcherServlet根据View进行渲染视图 -->

DispatcherServlet响应用户

注意:DispatcherServlet也是整个Spring MVC的核心,它负责接收HTTP请求组织协调Spring MVC的各个组成部分

4、Spring MVC注解:

@Controller:

@Controller 用于标记在一个类上,使用它标记的类就是一个SpringMVC Controller 对象。通过Spring 配置的注解扫描,将这个bean注册到Springmvc容器中

@RequestMapping:

       @RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的 所有响应请求的方法都是以该地址作为父路径,作用于方法上,表明该处理器的请求地址=父路径+方法 上url 

@RequestBody:

@RequestBody用于读取Request请求的body部分数据,使用系统默认配置的 HttpMessageConverter 进行解析,然后把相应的数据绑定 到要返回的对象上 ,再把 HttpMessageConverter返回的对象数据绑定到 controller中方法的参数上。 现在更多的是把一个 json 字符串转换成一个定义好映射关系的对象。

@ResponseBody:

ResponseBody用于将Controller的方法返回的对象,通过适当的 HttpMessageConverter转换为指定 格式后,写入到Response对象的 body数据区。 现在主要用于json返回

@RequestParam:

@RequestParam主要用于在SpringMVC后台控制层获取参数,类似request.getParameter(“name”);

@RequestParam注解主要有3个参数:

01、value:参数名字,即入参的请求参数名字,如 value=“userName” 表示请求的参数区中的名字为 userName的参数的值将传入;

02、required:是否必须,默认是true,表示请求中一定要有相应的参数,否则将报404错误码;

03、defaultValue:默认值,表示如果请求中没有同名参数时的默认值, 默认值可以是SpEL表达式,如“#{systemProperties[‘java.vm.version’]}”。

@PathVariable:

     @PathVariable 映射 URL 绑定的占位。带占位符的 URL 是 Spring3.0    新增的功能,主要用于RestFull风 格的URL请求。 通过 @PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中:URL 中的 {xxx} 占位 符可以通过@PathVariable(“xxx“) 绑定到操作方法的入参中

@ModelAttribute:

Controller的所有方法在调用前,先执行此@ModelAttribute方法,可用于注解和方法参数中。 可以把这个@ModelAttribute特性,应用在BaseController当中,所有的Controller继承 BaseController,即可实现在调用Controller时,先执行@ModelAttribute方法

@RestController:

@RestController注解就相当于@ResponseBody + @Controller合在一起的作用。 使用@RestController注解Controller,则Controller中的方法无法返回页面,配置的视图解析器(如: InternalResourceViewResolver)不起作用,返回的内容就是return 的内容

5、解决中文乱码问题:

Spring内部是有编码的、设置方式的

已经设置charset设置为utf-8,如下图
在这里插入图片描述

但是返回的却是ISO-8859-1,如下图
在这里插入图片描述

原因是:在IDEA中最终是要经过springServlet处理一遍,springServlet编码格式有问题,那么就是有问题 不指定的情况下Spring的编码就是ISO-8859-1

解决办法:找到web.xml,配置characterEncodingFilter,如下图
在这里插入图片描述

保证所有的请求编码都是UTF-8

6、SpringMvc时间的处理问题:

@DateTimeFormat只会处理可以直接从request中获取得到,对于传输的JSON字符串中的日期格式,由@JsonFormat处理

对于@JsonFormat时间处理的话,一般都是针对于序列化和反序列化,这个根据所使用的夹包决定,这里主要是引用了Json的包

对于@DateTimeFormat,主要根据的是 请求当在日期类型的参数或者时间类型的参数

7、关于model和request请求间的关系以及转发和重定向的对比

01、model和request请求间的关系

转发的时候,model和request请求间,数据在内部中是通用的,就是上一个方法转给下一个方法的时候,上一个在model的操作也会交给下一个,请求里加的信息也会加给下一个,就相当于他在同一个地方,请求体没有变,model对于的请求体没有改变。就是这两个方法是公用的,转发的时候下一个的东西能共用下一个的

02、转发和重定向的对比

转发是服务器端的转向。重定向是客户端的跳转。

使用转发浏览器的地址不会发生改变。而重定向会发生改变。

转发是一次请求中完成。而重定向是重新发起请求。

转发是在服务器端完成,而重定向是客户端重新发起请求

8、当遇到如下图的问题时,是未没有处理异常的意思
在这里插入图片描述

处理这种异常需要进行如下操作
在这里插入图片描述

选择try…catch…
在这里插入图片描述

9、关于上传文件需要注意的地方

如下图,配置文件中,bean的id必须为multipartResolver !!!
在这里插入图片描述

如下图,在index页面中,必须要写这一句enctype=“multipart/form-data”

同时上传的方法一定是post,get不行
在这里插入图片描述

注意:file.getBytes()获取它的二进制数据或是整个文件的二进制数组

file.getContentType()获取是什么方式或者是什么类型传上来的

file.getInputStream()获取输入流

file.getName()获取名字

file.getOriginalFilename()获取原始的文件名称(即是你上的那个文件的原始名称)

file.getResource()返回资源信息

file.getSize()获取文件大小 – 单位是字节

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值