什么是SpringMVC
MVC全名是Model View Controller,是模型(model)-视图(view)-控制器 (controller)的缩写,它是一种软件设计典范,是一种软件架构设计分层模式。
Model(模型)是应用程序中用于处理应用程序数据逻辑的部分。
View(视图)是应用程序中处理数据显示的部分。
Controller(控制器)是应用程序中处理用户交互的部分。
最典型的MVC就是JSP + servlet + javabean的模式。
SpringMVC运行流程
1、用户发起request请求至前端控制器。前端控制器(DispatcherServlet)。
2、前端控制器发送请求至处理器映射器(HandlerMapping)查找Handler,这个处理器映射器会根据url找到对应的处理器。(可以根据xml配置或者注解进行查找)
3、处理器映射器(HandlerMapping)像前端控制器返回Handler(处理器)
4、前端控制器(DispatcherServlet)调用处理器适配器(HandlerAdapter)去执行Handler。
5、处理器适配器(HandlerAdapter)去执行Handler。
6、Handler执行完成后给适配器返回ModelAndView
ModelAndView是SpringMVC框架的一个底层对象,包括模型和视图。
7、处理器适配器向前端控制器返回ModelAndView。
8、前端控制器请求视图解析器进行视图解析。
根据逻辑视图名称解析真正的视图(jsp)。
9、视图解析器向前端控制器返回View。
10、前端控制器进行视图渲染
视图渲染将模型数据填充到request作用域中。
11、前端控制器向用户做出响应。
组件:
1、前端控制器或中央控制器(DispatcherServlet): --->不需要程序员开发
接收请求,响应结果。用户请求到达前端控制器,相当于MVC中的C,而DispatherServlet是整个流程的核心,它来调用其他组件来处理用户的请求,
而其他组件之间也就没有了交互,前端控制器的存在降低了其他组件之间的耦合度。
2、处理器映射器(HandlerMapping): --->不需要程序员开发
根据请求的url查找Handler。
3、处理器适配器(HandlerAdapter):
按特定规则(DispatcherServlet)去执行Handler。
也就是说在编写Handler时就需要按照HandlerApapter的要求编写,这样处理器适配器才能正确执行Handler。
4、处理器(Handler):
注意:编写Handler时按照HandlerAdapter的要求去做,这样适配器才可以去正确执行Handler
Handler是后端控制器,在前端控制器的控制下后端控制器对具体的用户请求进行处理,Handler涉及到具体的用户业务请求,
所以一般情况下需要程序员根据业务需求开发.
5、视图解析器(ViewResolver): --->不需要程序员开发
进行视图解析,根据逻辑视图解析成View视图。
SpringMVC搭配环境
1、创建web项目
2、导入jar包。
3、在web.xml中添加Spring前端控制器。
4、编写后端控制器,后端控制器在src下编写。(配置式开发,要求处理器实现controller接口,注解式不需要实现接口)。
添加约束头信息
注册后端控制器
<bean id="/请求.do" class="后端控制器的全限定类名"></bean> <!--请求路径-->
![v2-bde9a6b689822503208b98c19cceb142_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=76b03385-1d2f-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-bde9a6b689822503208b98c19cceb142_b.jpg)
![v2-1c21336f6847b4e01d1c9a0b3d9ae458_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=76b03385-1d2f-eb11-8da9-e4434bdf6706&url=https://pic1.zhimg.com/v2-1c21336f6847b4e01d1c9a0b3d9ae458_b.jpg)
url-pattern配置
当时用/*进行拦截,所有资源都会被拦截。
当时用/进行拦截的时候,所有的静态资源都拦截不到了。
当请求方式为restful风格时必须使用/的拦截方式,但是使用/会将所有的静态资源拦截,为了解决这个问题,需要静态资源释放。
静态资源释放
![v2-cdb918082cd7829f2942fece490c6356_b.png](http://img-02.proxy.5ce.com/view/image?&type=2&guid=76b03385-1d2f-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-cdb918082cd7829f2942fece490c6356_b.png)
SpringMVC注解开发
实行注解开发,后端控制器就不用再去实现Controller接口了,只需要在类体上增加相应的注解即可。
环境搭配:
1、在后端控制器类体上增加注解
2、SpringMVC配置文件无需注册Controller。
3、SpringMVC配置文件中添加组件扫描器、注解驱动。
3.1注册组件扫描器,组件扫描器在context标签中
3.2、注册注解驱动
![v2-162deefd9dc30dafa56b429bfd93f95c_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=76b03385-1d2f-eb11-8da9-e4434bdf6706&url=https://pic1.zhimg.com/v2-162deefd9dc30dafa56b429bfd93f95c_b.jpg)
![v2-c769a395fed0be54f3e41d0ae85c5bc8_b.png](http://img-03.proxy.5ce.com/view/image?&type=2&guid=76b03385-1d2f-eb11-8da9-e4434bdf6706&url=https://pic1.zhimg.com/v2-c769a395fed0be54f3e41d0ae85c5bc8_b.png)
![v2-b9d53a1ce2dced0569f55e830c92ffd2_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=76b03385-1d2f-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-b9d53a1ce2dced0569f55e830c92ffd2_b.jpg)
常用注解:
@Controller:该注解表示将当前类交给Spring容器管理。
@Scope:默认是singleton,可以改为prototype。
@RequestMapping,该注解可以放在类体上或者方法体上。
放在类体上表示起到限定范围的作用。
放在方法体上表示请求映射路径。
![v2-225a80af2abeb12df5197666f41cabe1_b.png](http://img-01.proxy.5ce.com/view/image?&type=2&guid=76b03385-1d2f-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-225a80af2abeb12df5197666f41cabe1_b.png)
访问地址为:/springmvc/my 。
![v2-059aa230f8618e15b9714833eff6d518_b.png](http://img-02.proxy.5ce.com/view/image?&type=2&guid=76b03385-1d2f-eb11-8da9-e4434bdf6706&url=https://pic1.zhimg.com/v2-059aa230f8618e15b9714833eff6d518_b.png)
视图解析器:
视图解析器分为前缀和后缀。
当你返回一个视图资源时,后台会自动查找是否配置了视图解析器,如果配置了,那么它会把你的前缀拼接,然后拼接视图名,最后拼接后缀,形成完整路径。
![v2-65272db8e13778a46cc54b6d3e4fc7ed_b.png](http://img-03.proxy.5ce.com/view/image?&type=2&guid=76b03385-1d2f-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-65272db8e13778a46cc54b6d3e4fc7ed_b.png)
处理器方法常用的参数:
1、HttpServletRequest
2、HttpServletResponse
3、HttpSession
4、用于承载数据的Model、Map、ModelMap
5、请求中所携带的请求参数。
接受请求参数:
1、逐个接收
定义ModelAndView对象并返回,这样对象中可添加moderl数据,指定view视图。
从页面发送请求数据至后台处理器中,定义相应的参数,用参数进行接受(在SpringMVC中参数可以自动的进行类型转换),这样就可以完成参数接收。
注意: 接收数据时参数名称要与name属性的值一致,否则接收不到数据。
![v2-4bf89d3d1d984407fc065b1425ef4aab_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=76b03385-1d2f-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-4bf89d3d1d984407fc065b1425ef4aab_b.jpg)
使用注解形式,参数接收之@RequestParam
为了解决传过来的参数与接收的时候参数名称不一致的问题,使用@RequestParam注解("form表单中的name名称")
![v2-e2e5ecc1b75f5363efea52ef528770cb_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=76b03385-1d2f-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-e2e5ecc1b75f5363efea52ef528770cb_b.jpg)
2、以对象形式整体接收:
2.1--->创建pojo实体类,需要注意的是,类中的属性名要和form表单中传过来的name属性值一致,否则无法封装。
2.2--->后台控制器中的方法参数改为实体类。
2.3--->使用get进行赋值。
![v2-ceb8ba760b1253254ab8d014201b1105_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=76b03385-1d2f-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-ceb8ba760b1253254ab8d014201b1105_b.jpg)
3、域属性参数的接收:
在对象中有一个属性,而这个属性是一个对象属性,这样的属性就被称作为域属性。restful风格的参数接收。
![v2-e31dc415e001eaf34d37ebefd9afa7d0_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=76b03385-1d2f-eb11-8da9-e4434bdf6706&url=https://pic1.zhimg.com/v2-e31dc415e001eaf34d37ebefd9afa7d0_b.jpg)
4、数组或集合参数的接收:
数组:后端控制器内的方法参数为数组形式,通过循环遍历获取数据。
集合:在接收的时候,需要在参数内加上@RequestParam进行效正。
![v2-9402be39c7efe0bd34ec2ca69b99bdc6_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=76b03385-1d2f-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-9402be39c7efe0bd34ec2ca69b99bdc6_b.jpg)
5、restfull风格传参:
在方法体上的@RequestMapping中添加值。
@PathVariable:路径变量。 在参数内使用@PathVariable进行接收。
参数作为路径变量的一部分,通过路径传递过来。
![v2-e650903b8fbd2f1101e58fc3fd2483c4_b.png](http://img-03.proxy.5ce.com/view/image?&type=2&guid=76b03385-1d2f-eb11-8da9-e4434bdf6706&url=https://pic1.zhimg.com/v2-e650903b8fbd2f1101e58fc3fd2483c4_b.png)
6、接收json字符串
![v2-bff636a5f9c9789d1344f73c0c185906_b.png](http://img-02.proxy.5ce.com/view/image?&type=2&guid=76b03385-1d2f-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-bff636a5f9c9789d1344f73c0c185906_b.png)
![v2-a744a6437f255b5ed5cdd26f646cd70e_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=76b03385-1d2f-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-a744a6437f255b5ed5cdd26f646cd70e_b.jpg)
![v2-ebdc8e7b752e92dcb6c473a17c6df011_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=76b03385-1d2f-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-ebdc8e7b752e92dcb6c473a17c6df011_b.jpg)
处理器方法返回值类型String数据
如果想承载数据,可以在方法参数内添加承载数据的对象 ,通过对象进行存储数据。
1、后端控制器获取数据
2、将数据封装到Model,Map,ModelMap中。
3、跳转页面。
![v2-2e8f02d2e1fc1971286bbdd6df4e81b8_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=76b03385-1d2f-eb11-8da9-e4434bdf6706&url=https://pic1.zhimg.com/v2-2e8f02d2e1fc1971286bbdd6df4e81b8_b.jpg)
处理器方法返回值类型String之设置编码格式
在RequestMapping中设置编码格式
@ResponseBody:将当前方法的返回值放到响应体中,并且将返回值转换成json格式字符串。
![v2-d7708be93f42db83e3c717935475c9dd_b.png](http://img-01.proxy.5ce.com/view/image?&type=2&guid=76b03385-1d2f-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-d7708be93f42db83e3c717935475c9dd_b.png)
处理器无方法返回值void
1、将HttpServletResponse作为参数。
2、通过对象参数调用方法将字符串响应给前端。
![v2-dd38c3cdb947c8f634ae006af727be0e_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=76b03385-1d2f-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-dd38c3cdb947c8f634ae006af727be0e_b.jpg)
前端如果想取某一个值的话,可以将json格式字符串转换成对象,使用eval。
![v2-4f68780d9e715293c1cfb98764b01e7d_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=76b03385-1d2f-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-4f68780d9e715293c1cfb98764b01e7d_b.jpg)
处理器方法返回值类型Object
在方法体上使用@ResponseBody。
![v2-95bf3466fe528de17de87ff1be88e830_b.png](http://img-03.proxy.5ce.com/view/image?&type=2&guid=76b03385-1d2f-eb11-8da9-e4434bdf6706&url=https://pic1.zhimg.com/v2-95bf3466fe528de17de87ff1be88e830_b.png)