![369c8345e70140c879b2c8f80e4ae198.png](https://img-blog.csdnimg.cn/img_convert/369c8345e70140c879b2c8f80e4ae198.png)
Springmvc
springmvc是spring框架的一个模块,springmvc和spring无需通过中间整合层进行整合。
springmvc是一个基于mvc的web框架。
![b65ed5e7cafb9f5d88e008905d380a33.png](https://img-blog.csdnimg.cn/img_convert/b65ed5e7cafb9f5d88e008905d380a33.png)
基本概念和执行过程
第一步:浏览器发起请求到前端(核心)控制器(DispatcherServlet)
前端控制器决定什么类型的请求会进入springmvc框架。
第二步:前端控制器请求处理器映射器(HandlerMapping)查找处理器(Handler)
映射器作用:根据特定规则查找处理器,找不到报异常。
第三步:处理器映射器(HandlerMapping)向前端控制器返回找到的处理器(Handler)
第四步:前端控制器调用处理器适配器(HandlerAdapter)去执行Handler
适配器作用:执行某种特定的Handler
第五步:处理器适配器去执行处理器(Handler)
第六步:处理器(Handler)执行完成后给处理器适配器返回模型视图(ModelAndView)
第七步:处理器适配器向前端控制器继续返回ModelAndView
第八步:前端控制器请求视图解析器(ViewReslover)去解析视图
第九步:视图解析器向前端控制器返回视图View
第十步:前端控制器进行视图渲染
第十一步:前端控制器向用户响应结果
入门程序
l 准备环境和jar包
Spring的4+1
Spring的Spring-web
Spring的Spring-webmvc
jstl
l 创建springmvc配置文件
在classpath下创建springmvc的配置文件,文件名习惯是:springmvc.xml
l 配置前端(核心)控制器
在web.xml文件中配置springmvc的前端控制器DispatcherServlet,且向contextConfigLocation属性注入springmvc配置文件的路径。如果不配置contextConfigLocation,默认加载WEB-INF/servletname-servlet.xml
url-pattern的值:*.action、/ 。 /*报错
l 配置处理器适配器
在springmvc的配置文件中,配置处理器适配器类SimpleControllerHandlerAdapter。能执行实现了Controller接口的Handler。
l 编写和配置处理器
处理器类Handler,其实功能等价于strtus2的action动作类。需实现controller接口。才能由SimpleControllerHandlerAdapter适配器执行。
向模型视图填充数据,相当于填充到request域。
在springmvc配置文件中配置处理器类。
<bean name="/hello.action" class="com.springmvc_01.handler.UserHandler"></bean>
l 编写视图
在WEB-INF下创建jsp目录,在目录中创建index.jsp页面
l 配置处理器映射器
在springmvc配置文件中配置处理器映射器类BeanNameUrlHandlerMapping,能根据bean的name属性作为url查找处理器。
l 配置视图解析器
在springmvc配置文件中配置视图解析器InternalResourceViewResolver,解析jsp视图。
l 部署调试
http://ip:port/site/动作名
映射器和适配器
非注解映射器和适配器(掌握)
l 非注解映射器:
org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping
作用:根据bean的name属性作为url查找。
org.springframework.web.servlet.handler.SimpleUrlHandlerMapping
简单url映射,配置时,注入mappings指定url和处理器类的映射关系。
注:多个映射器可以共存,前端控制器自动判断用哪个映射器。
l 非注解适配器:
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter
要求编写的Handler实现Controller接口。
org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter
要求编写的Handler实现HttpRequestHandler接口。
此方法可以通过修改response,设置响应的数据格式,比如响应json等。
多个适配器可以共存
l DispatcherSerlvet.properties文件
位置在:/org/springframework/web/servlet/DispatcherServlet.properties,是框架的配置文件。
前端控制器默认从DispatcherSerlvet.properties文件中加载映射器、适配器、视图解析器等组件,如果不在配置文件中配置,使用默认的加载。
注解映射器和适配器(掌握)
注解映射器:org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping。
注解适配器:org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter。
l 配置注解映射器适配器
配置主键映射器和适配器时,可以用bean配置。
也可以使用<mvc:annotation-driven>配置,默认加载参数绑定方法,json转换解析器等功能。
开发中使用<mvc:annotation-driven>。
注:注解映射器和适配器必须配对使用。
l 开发注解Handler
n 编写Handler类
使用@Controller标识它是一个Handler动作类
用@RequestMapping实现方法和url的映射,建议url和方法名一样
n 配置Handler
可以使用bean单独配置Handler
也可以使用<context:component-scan>标签指定扫描的包,自动扫描Handler。
小结
理解springmvc的前端控制器、处理器映射器、处理器适配器、视图解析器用法。
前端控制器url-pattern的配置:*.action、/
<mvc:annotation-driven>配置注解适配器和映射器
<context:component-scan>配置注解类扫描包
视图解析器前缀和后缀
配置视图解析器时,可以注入prefix前缀,和suffix后缀。
用户访问的路径=prefix+用户url+suffix
Handler详解
@RequestMapping
l url映射
将handler中的方法映射到url上。
l 窄化请求映射
在动作类上用@RequestMapping指定访问当前动作类中方法的父路径。
l 限制请求方式
指定只接受get类型或post类型的请求。
![05e88a9cebf150cf31e34c0d71008ab5.png](https://img-blog.csdnimg.cn/img_convert/05e88a9cebf150cf31e34c0d71008ab5.png)
handler方法返回值
l 返回ModelAndView
Handler中的方法可以返回ModelAndView
l 返回String
1. 返回逻辑视图。
return "/jsp2";真正路径=前缀+逻辑视图+后缀
2. 重定向
return "redirect:/index.jsp";
3. 页面转发
return "forward:/index.jsp";
l 返回void
当方法返回void时,可以使用request转发页面,也可以使用response页面重定向,也可以使用response指定响应结果,例如响应json数据。
参数绑定
客户端发送的请求是key/value,经过参数绑定,将请求参数绑定到handler方法的形参上。
![84cd6f6370af7ee4965d2c833e9a1249.png](https://img-blog.csdnimg.cn/img_convert/84cd6f6370af7ee4965d2c833e9a1249.png)
l 默认参数绑定
直接在controller方法形参上定义以下类型,可以直接使用。
n HttpServletRequest
n HttpServletResponse
n HttpSession
n Model/ModelMap:Model是一个接口,ModelMap是一个接口实现。
l 简单类型参数绑定
当请求参数名和controller方法的形参名一致,参数会自动绑定成功。
参数名和方法形参名可以不一致,可以通过@RequestParam对参数进行绑定,。
![90afec78c073ada5db58b2edb910d03d.png](https://img-blog.csdnimg.cn/img_convert/90afec78c073ada5db58b2edb910d03d.png)
l Pojo类型参数绑定
页面中<input>的name属性的值和handler中的方法的pojo形参中的属性名一致,自动将页面中数据绑定到pojo。
l 包装pojo类型参数绑定
Handler方法中形参类型是包装pojo,pojo的属性又是pojo。
让<input>标签name属性的值是handler中方法形参的pojo对象中的pojo属性的属性。会自动参数绑定。
集合类型参数绑定
l 数组绑定
页面发送多个相同key不同value的数据。在handler方法形参中定义数组接收。
l list绑定
在包装pojo中定义list类型属性
<input type="text" name="list[0]" value="b">
l map绑定
在包装pojo中定义map类型属性。
<input type="checkbox" name="map[key1]" value="c">
自定义converter
controller形参中的pojo对象,如果属性中有日期类型,可能需要自定义参数绑定。
l 自定义类
自定义类实现Converter接口,重写方法。
![997e16835e73329801dc5c38638e88bf.png](https://img-blog.csdnimg.cn/img_convert/997e16835e73329801dc5c38638e88bf.png)
l 配置转换器
配置自定义参数绑定bean,对应的类是FormattingConversionServiceFactoryBean类,注入converters,指定转换器类。
![4bea333b332f21046b526c15f8141019.png](https://img-blog.csdnimg.cn/img_convert/4bea333b332f21046b526c15f8141019.png)
在注解配置中用conversion-service引用参数绑定类。
![1f60918603ed3b6cc70fdab92d3d7bcf.png](https://img-blog.csdnimg.cn/img_convert/1f60918603ed3b6cc70fdab92d3d7bcf.png)