SpringMVC是Spring框架的一个模块,是一个基于MVC思想设计的框架,它相当于是一个servlet,负责处理客户端的请求并将请求结果返回给用户。
在理解SpringMVC之前,首先我们来了解一下MVC设计思想。
1、MVC设计模式
MVC设计模式是一种软件编程思想。MVC设计模式认为任何软件都可分为三部分组成:
1)Controller: 控制程序流转的控制器;
2)Model:封装数据处理数据的模型;
3)View:负责展示数据的视图;
它们三部分互不干扰,各司其职。这样做软件结构更加清晰,代码更好扩展和维护,也提高了其复用性。
![](https://img.haomeiwen.com/i16230922/3ececa356b41c511.png)
![](https://img.haomeiwen.com/i16230922/3288f6efbd43c462.png)
2、以前网站开发的MVC模式
以前的WEB开发采用的MVC模式为:Servlet+Jsp+JavaBean,此种方式Servlet的处理相当麻烦,下面我们来看一下它的处理流程。
![](https://img.haomeiwen.com/i16230922/8b1a101193d3d561.png)
JavaEE经典架构(SSM)
![](https://img.haomeiwen.com/i16230922/7c7594fa0c2a097e.png)
3、为什么要使用SpringMVC?
当使用Servlet处理请求时我们肯定会遇到下面一系列问题:
1)通常一个请求对应一个servlet,一个servlet类只负责处理一个请求,若项目中有成千上万个请求的话,servlet类会暴增,这会让项目很难维护;
2)每个Servlet都需要在web.xml文件中配置至少8行信息,servlet多的话配置内容就多且繁琐,不利于团队开发;
3)客户端提交到服务器的数据无论是什么格式,servlet都是按照字符串格式接收,后期需要转换处理,很麻烦;
4)一个servlet调用时,需要重新编辑doGet/doPost()方法,代码繁琐;
5)Get与Post乱码问题严重;
6)重定向或转发时业务复杂;
4、SpringMVC核心组件及其执行流程
4.1 核心组件
![](https://img.haomeiwen.com/i16230922/04def499cf02e372.png)
SpringMVC包含了控制器与视图两部分,其核心组件主要有5个;
1)DispatcherServlet(前端控制器):SpringMVC的老大,相当于是转发器、CPU(中央处理器),是整个流程控制的中心,它只做转发(通知)而不去做;
2)HandlerMapping(处理器映射器):负责根据xml配置、注解进行查找请求对应的具体Controller,并将Controller具体方法名返回给前端控制器,处理器映射器中维护的有一个map集合Map<请求的路径,路径对应的方法>;
3)HandlerAdapter(处理器适配器):调用具体的Controller;
4)ViewResolver(视图解析器):根据View(逻辑视图名)解析后返回具体页面;
5)View(视图渲染):根据Model对View进行渲染,即将模型数据填充至视图中。
4.2 执行流程
![](https://img.haomeiwen.com/i16230922/aed002f2edcfb5f1.png)
1)客户端发送请求至前端控制器(DispatcherServlet);
2)前端控制器收到请求后调用处理器映射器(HandlerMapper),处理器映射器找到具体的Controller,并将Controller返回给前端控制器;
3)前端控制器调用处理器适配器(HandlerAdaptor),处理器适配器调用具体的Controller,调用Controller时可能涉及到要调用业务层的方法即(Controller----service----Dao/Mapper----DB),将处理后得到的数据和页面名字(ModelAndView)返回给前端控制器;
4)前端控制器将执行的结果(ModelAndView)传递给视图解析器(ViewResolver),视图解析器根据View(页面逻辑名)解析[给页面加上前缀和后缀完成路径拼接]后返回具体的页面给前端控制器;
5)前端控制器根据Model对View进行渲染,将模型数据填充至视图中,并将填充了数据的网页响应给用户;
整个开发过程中需要编程人员写的有Controller、Service、Dao、View;
Jsp通过EL与JSTL将数据返回给页面,将数据封装在域中(最常用的是request域),四大域对象(page、request,session,application)。
5、SpringMVC参数绑定及传值过程
参数绑定
配置请求路径和方法的映射关系,@RequestMapping(“路径”)、@GetMapping(“路径”)【处理get请求】、@PostMapping(“路径”)【处理post请求】。
当浏览器访问到相应的路径后就会执行路径下面对应的方法。访问路径在整个项目中是独一无二的。
SpringMVC会自动将请求中包含的参数与方法中的参数进行匹配,即只要保证请求中的参数名称与方法中的参数名称相对应,在方法中就可使用这些参数。若要取别名也行,可以使用@PathVariable注解(类型 请求中的参数名)。
5.1、基本类型参数绑定
当需要客户端发送的是少量数据时,可以在controller方法上,通过声明方法参数对其进行接收。接收基本类型的参数时,使用包装类声明其类型。
![](https://img.haomeiwen.com/i16230922/ff7476a62f8e9233.png)
![](https://img.haomeiwen.com/i16230922/9bbb03b21ef776bd.png)
5.2 包装类型参数绑定
当需要客户端发送的数据较多时就是用对象接收(首先得封装好对象),解决了代码冗余问题。
![](https://img.haomeiwen.com/i16230922/8f2f3d3070e7ebd7.png)
![](https://img.haomeiwen.com/i16230922/d8929a307903221c.png)
5.3 日期类型参数绑定
默认日期用/分开不会有错,但若是使用-分隔日期则需要先对请求进行处理,不然会有异常。
![](https://img.haomeiwen.com/i16230922/2f3644c04e6f6d00.png)
![](https://img.haomeiwen.com/i16230922/a152fce849fa01e5.png)
![](https://img.haomeiwen.com/i16230922/cc6ae76a5e7d746d.png)
对异常情况进行处理:
使用注解@InitBinder,用于指定自定义的日期转换格式,在Controller中添加如下代码即可正常转换:
![](https://img.haomeiwen.com/i16230922/e70ef294add38655.png)
包装类型传值过程
1:利用反射机制实例化对象(必须有无参构造)
2:利用对象的getXXX( )方法获取对象的属性名称getUserId( )-----将get去掉之后首字母小写得userId;
3-利用request的getParameter( userId ) 方法为userId赋值
4-利用user对象的setUserId( )方法为user的属性赋值
5-得到user实例对象
6、实现转发和重定向
6.1 转发:forward
一次请求,一次响应;
使用的是同一个request与response;
访问地址不会改变;
![](https://img.haomeiwen.com/i16230922/ea9aa409459722fd.png)
6.2 重定向: redirect
至少两次请求,两次响应;(第一次找到地址后进行访问,访问后服务器会响应其你需要去访问另一个地址,然后又去访问另一个地址);
使用的不是同一个request与response;
访问地址会改变;
![](https://img.haomeiwen.com/i16230922/024602e0f09f57b1.png)
![](https://img.haomeiwen.com/i16230922/79ab02cd934e5b15.png)
7、SpringMVC响应数据
7.1 使用model响应
使用model将数据存储在request域中带到页面中去处理,jsp在页面中使用EL表达式${ }取值。model对象实际上是一个map集合,可以往model中添加属性。
![](https://img.haomeiwen.com/i16230922/402a3b6bfe17ddf6.png)
![](https://img.haomeiwen.com/i16230922/294e793a4f6c5848.png)
7.2 使用JSON响应,返回JSON数据
JSON(JavaScript Object Notation)是JS提供的一种轻量级的数据交换格式。与JS中声明对象的方式类似。
值得注意的是:若使用该类型返回数据,则应在方法上添加@ResponseBody注解。
例:
![](https://img.haomeiwen.com/i16230922/fc8a187136e8fc52.png)
![](https://img.haomeiwen.com/i16230922/89f1a11e12a000da.png)
8、SpringMVC的配置
配置文件的一手资料建议直接上官网查找
8.1 导入SpringMVC依赖的包
![](https://img.haomeiwen.com/i16230922/5d27f32f468d98cd.png)
8.2 首先在web.xml文件中配置前端控制器,拦截所有请求
![](https://img.haomeiwen.com/i16230922/24bf3bbaae5829b3.png)
8.3 SpringMVC的config配置文件
![](https://img.haomeiwen.com/i16230922/bf46dc9b2db23d47.png)
Tomcat启动加载方式
![](https://img.haomeiwen.com/i16230922/1a5d8e02a234762e.png)
![](https://img.haomeiwen.com/i16230922/1da336eb889c6180.png)
Tomcat服务器启动时通首先加载web.xml文件,并调用ServletContainerInitializer初始化servlet,然后底层执行相应的service方法,最后正常关闭时执行destroy()方法,最后servlet由JVM的gc回收。
SpringMVC的请求响应处理
请求处理
404:找不到资源,url不存在或错误;
405:客户端与服务器端的请求方式不一致;
400:与参数有关系,可能参数不匹配;
响应处理
转发,重定向;
响应数据封装(ModelAndView,Model,Map);
响应数据转换(将对象序列化为JSON格式字符串);
9、SpringMVC中传参时常用的注解
1)@PathVariable:告诉spring容器,参数的值来自该注解指定的RestFul风格变量即{ 变量 };使用于RestFul风格的传参,标识定义的变量名与方法的参数名一致。
2)@RequestParam:使用于请求域里面的参数,标识请求域里面的变量与方法参数名一致,若不一样则使用该参数value变量进行标识。该注解通过指定required为true/false来表明是否一定要传参数,true则表示一定要传,false可以不传。
![](https://img.haomeiwen.com/i16230922/74966f13aee8809e.png)
eg: http://localhost:3001/user-service/7/score?score=100,此处request域中变量为score,即score=100中的score。
3)@RequestBody:使用于post请求提交的实体内容。
4)@RequestMapping:指定映射路径,可以为指定的路径取多个名字,并通过method属性指定方法的请求方式。
![](https://img.haomeiwen.com/i16230922/4b949108964fb504.png)
5)若返回的是个页面则直接返回String即可,返回的是数据则需要添加@ResponseBody,直接将数据打印在页面上。springMVC默认支持jackson格式的字符串,它借助Jackson将返回值转换为json格式。
网友评论