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()获取文件大小 – 单位是字节