目录
- SpringMVC的简介
- 开发步骤
- 快速入门
- SpringMVC的组件解析
- 执行流程
- 注解解析
- XML配置解析
- 知识小结
- SpringMVC的数据响应、
- 数据响应的方式
- 页面跳转
- 需要什么对象,就添加什么对象到形参
- 回写数据
- 回写一般字符串数据
- 回写json格式的字符串
- 回写对象集合
- 小结
- SpringMVC获取请求数据
- 获取请求参数
- 获得基本类型的数据
- 获得POJO类型的数据
- 获取数组类型的数据
- 获取集合类型的数据
- 请求数据的乱码问题
- 参数绑定注解
- 获得Restful风格的参数
- 自定义类型转换器
- 获取请求头数据
- 文件上传
- SpringMVC拦截器
- 快速入门
- 知识小结
- 拦截器登录权限控制小案例
- SpringMVC异常处理机制
- 简单异常处理器
- 自定义异常处理器
- 小结
开始
一、SpringMVC的简介
轻量级 基于 MVC 开发模式 的 Web框架
有一套轻量完善的注解配置机制
之前web层有很多Servlet,每个Servlet基本都需要
- 接受使用参数、
- 封装实体、
- 指派视图
框架可以帮我们 将 一些 共同的操作 抽取出来,框架进行封装
对于特有功能的Servlet,只需要一个POJOBean(控制器Controller)来完成 相应功能
1.1开发步骤
- 导坐标
- 配置 前端控制器Servlet,也就是DispathcerServlet核心控制器
- 编写 POJO(Controller)
- 将Controller配置到Spring容器中(使用注解@Component或者衍生注解@Controller ,或者使用xml配置)
- 配置组件扫描(可以在applicationContext.xml中组件扫描,一般在spring-mvc.xml中配置web层的扫描器)
- 执行测试
1.2快速入门
导包
配置web.xml,设置前端控制器的虚拟目录,/ 就是代表所有的资源 都需要经过 前端控制器
这里后面会出现一些静态资源js,css等被拦截的问题,需要配置放行
配置跳转的view页面
配置 组件扫描,因为 在 UserController中使用注解 将 Bean 放到了Spring中
而且 访问的 资源的 和 方法 的映射,也是使用注解来配置的
web.xml,类似配置全局参数加载applicationContext.xml 配置文件那样 加载 spring-mvc.xml文件
二、SpringMVC的组件解析
2.1SpringMVC的执行流程
核心 前端控制器DispatcherServlet 完成的主要任务 是 调度 完成相应功能的 组件
- HandlerMapping:处理映射器,目标Controller之前可能会有很多拦截器,返回执行的很多资源的顺序
- HandlerAdaptor处理器适配器:调度需要执行的资源,也就是自己写的POJO,最后返回给DispatcherServlet 核心控制器Model and View
- Handler:处理器,可认为自己写的POJO对象,执行完返回 Model and View
- ViewResolver:视图解析器:从Model and View 将视图解析出来
2.2SpringMVC注解解析
因为 自定义UserController 上 加 @Controller 表示 将 Bean 放到 Spring中,需要在 spring-mvc.xml中进行组件扫描
和 applicationContext.xml 中的 组件扫描 各司其职,分管不同的层下的Bean
2.3SpringMVC的XML配置解析
可以在Spring-mvc.xml中配置 组件扫描
还可以配置 指定一些组件,像处理器适配器,处理器,映射器等,可修改缺省时候默认的组件
可以对 某些 组件 内部功能指定增强
在SpringMVC的包下,有DispatcherServlet核心控制器 组件 的配置文件
配置文件中,缺省情况下对 相关 组件 默认配置
我们 可以 重写 配置,在spring-mvc.xml配置文件中 进行 增强组件功能 配置
改用web.xml 的 Servlet-Mapping 来映射 资源
- 发现报错
26-Nov-2020 10:33:13.701 警告 [http-nio-8080-exec-3] org.springframework.web.servlet.DispatcherServlet.noHandlerFound No mapping found for HTTP request with URI [/demo] in DispatcherServlet with name 'DispatcherServlet'
原因是 因为 SpringMVC的拦截器功能太过强大,把我们访问的.jsp文件拦截,导致404,我们需要配置放行
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!-- 全局初始化参数,加载applicationContext.xml文件-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:java/applicationContext.xml</param-value>
</context-param>
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 加载配置文件spring-mvc.xml-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:java/spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 映射资源-->
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 拦截器放行的资源-->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/.jsp</url-pattern>
</servlet-mapping>
</web-app>
2.4知识小结
三、SpringMVC的数据响应、
3.1 数据响应的方式
页面跳转
- 直接返回字符串:
return "success.jsp"
- 返回Model and View ,简单理解就是一个封装,需要 对 Model and View 再解析为 View
回写数据
- 直接返回字符串:
reponse.getWritter().print();
- 返回对象或集合:Ajax访问服务器,返回json格式的字符串,通过json的转换工具,然后在
response.getWriter().print()
进行回写SpringMVC集成之后,只需要 在方法上 返回 对象的集合就行,然后帮助我们转换成串,直接回写
3.2页面跳转
- 直接返回字符串的形式,只写view的字符串形式即可,然后视图跳转字符串指定资源
- 返回ModelAndView
- 其中setViewName()设置 展示 的 view,即 访问 index.jsp
- 方法形参注入思想,当方法 形参包含 ModelAndView对象,Spring调用方法,传入实参,即创建实际的对象,自动注入ModelAndView 对象
- 也可以将ModelAndView拆开,单独返回View
3.3需要什么对象,就添加对象到方法的形参
靠着Spring来注入,如需要request对象(不常用)
和Model model 类似,Model 是 SpringMVC封装好的对象,而request对象是Tomcat服务器创建的原生对象
3.3回写数据
3.3.1回写一般的字符串到页面
通过之前的response对象回写
还可以 通过方法上加注解 区别事务跳转 来直接return “字符串”
-
@ResponseBody
告诉 SpringMVC框架,不进行视图跳转,直接进行数据响应,以HTTP响应体的方式回写
3.3.2回写json格式的字符串
将数据库查询的对象,转化为json格式,然后再回写,需要json转换工具
- 导包
- 创建使用ObjectMapper 对象 通过
objectMapper.writeValueAsString(对象)
得到 json字符串,然后返回
上述 操作,不管是对象,对象集,都需要通过objectMapper来处理为json字符串,很繁琐
可以通过配置SpringMVC来 封装 转换过程,自动将对象、对象集转化为json字符串
3.3.3SpringMVC来返回对象集合
调用 Controller 中方法的是 处理器适配器RequestMappingHandlerAdapter
,但是默认情况下是不能将对象转化为json格式,需要功能增强
因此需要我们在 配置适配器时,指定一个json的转换器,然后在处理器适配器调用方法的时候,完成转换,
就类似之前配置的 资源视图解析器,自动加上 后缀、前缀
- 配置处理器映射器,spring-mvc.xml中对处理器适配器进行注入,功能增强
- mvc注解驱动,底层默认集成jackson转换器
- 导命名空间mvc,配置注解驱动
3.4小结
四、SpringMVC获取请求数据
4.1获取请求参数
SprigMVC接受客户端请求参数类型可以是:
- 基本数据类型:字符串、数字等
- POJO:简单JavaBean,将参数封装到Bean,在进行业务逻辑操作
- 数组类型:例如复选框数据
- 集合类型:和数组类似
4.2获得基本类型数据
客户端 提交基本类型数据 名称 和 SpringMVC 中的Controller中的形参名称相同,完成自动封装
类似request.getParamater(),将获得的请求数据和service、dao层进行交互
4.3获得POJO类型的数据
请求的数据是一个 对象 整体
之前是通过request.getParamaterMap()获取 请求数据封装的 Bean
底层很复杂,但是使用只需 形参设置User user,就可以直接拿到 请求参数 对应的实体Bean
4.3获取数组类型的数据
通过方法形参传入一个数组
对类似多选框的参数进行封装为一个数组
4.4获取集合数据类型的参数
4.4.1封装集合数据到VO对象的List<User>
属性中
就是封装多个User对象数据,封装的对象需要放到List<User>
集合中,但是List集合还要依赖于 某个对象(某个对象作为方法的形参)
即List<User>
作为对象的属性,每个请求的参数数据类型为User集合
相对数组类型的封装较复杂,需要 设置单独的JavaBean,
一般叫做VO对象(value Object值对象) 里面设置一个集合,获取的集合参数 需要 到POJO中的集合中
需要 将请求参数集合 封装到VO
对象中的集合 中,即VO对象的 List<User> userList 成员变量
但是 List<User> userList
是一个 List,并且 List 的元素为 User 对象,就是
4.1.2直接接受json格式的集合数据类型
使用ajax请求数据
不用再封装到VO对象中,直接形参写成List<User> list
使用ajax发送请求数据,可以将数据的格式设置为json格式
开启静态资源访问权限
可能出现页面404错误
问题出现在 前端控制器DispatcherServlet 的 配置,默认的 <url-patten>/<url-patten>
访问的资源都要进行虚拟路径的匹配,都需要经过DIspatcherServlet 前端控制器
把 JQuery的请求也当成Controller 的请求,简单理解就是在SpringMVC框架中找JQuery文件,当然找不到
匹配失败,因此需要 在SpringMVC框架中 开放 某些静态资源 的访问权限
就是当在SpringMVC框架中 找不到 指定资源的时候,将寻找权交给 之前的容器 Tomcat容器 寻找静态资源
或者
对应的三次请求
4.5请求数据的乱码问题
之前我们解决的方法就是 request.setCharacterEnCoding()设置编码
对于get请求,Tomcat服务器解决
对于post请求,使用过滤器解决
现在设置一个 全局过滤器filter 进行编码的过滤
4.6参数绑定注解
请求的参数键名,需要和 Bean的属性名一致,不一致则SpringMVC无法通过 方法形参的方式 获取请求参数
- 通过
@requestParam注解
解决 请求参数名称 和 业务方法参数名称不一致时 的 参数获取问题
其他参数
4.6获得Restful风格的参数
一种风格
参数不是?= 值
的形式,而是作为URL的一部分传递
在方法的形参中,可以设置 占位符 匹配URL中的参数,完成参数获取
4.7自定义类型转换器
SpringMVC内部具备一些内置的数据类型转换器,请求的参数都是字符串,SpringMVC可以把字符串数字 转化为 数字
但是这些内置的 不满足我们的需求,例如对日期 格式 的转换
使用步骤
场景
会报错,需求是封装自定义格式的数据
使用
- 创建convert.DateConverter 实现 converter接口
- spring-mvc.xml声明转换器
声明 转换器服务工厂,让工厂产生我们定义的转换器Bean - 指定转换器工厂来产生 转换器Bean
4.8获取请求头数据
请求头也是键值的的形式,一般根据键获取值
- @RequestHeader注解获取请求头参数
- @CookieVale注解
4.9文件上传
web阶段文件上传客户端需要具备:
- 文件上传项type=“file”
- 表单提交为post
- enctype属性是多表单形式
4.9.1文件上传原理
获取的数据 都在http请求体当中
SpringMVC内部封装的也是apach文件上传小组件,可以直接使用
4.9.2单文件上传
- 导坐标
- 配置文件上传解析器
- 编写文件上传代码
在spring-mvc.xml文件中配置 文件上传解析器,由Spring提供的CommonsMultipartResolver对象
编写文件上传代码,SpringMVC 会将上传的文件 封装成一个对象
4.9.3多文件上传
表单准备对个参数即可,对应方法的参数也增加
五、SpringMVC拦截器
类似之前的 过滤器
简单理解 就是 访问资源目标方法的时候,做一些干预
5.1快速入门
controller.TargetController
然后在spring-mvc.xml配置
测试
5.2知识小结
拦截方法说明
自定义拦截器的步骤
5.3拦截器登录权限控制小案例
实现不登录情况下,不能操作,转到登录页面
在preHandel验证有没有登录,检查有无session中有无user
配置spring-mvc.xml
这里先简单实现 拦截 未登录 跳转到 登录页面的情况,因涉及案例环境,后续实现在补充…
六、SpringMVC异常处理机制
基本环境
之前阶段 对异常的处理就是 在业务层try...catch...
有弊端,抓异常代码和业务耦合,不利于异常定位
我们可以把解决异常抽取出来,让某一个组件进行异常处理
异常处理器可以使用SpringMVC定义好的异常处理器,也可以自定义异常处理器
6.1简单异常处理器
spring-mvc.xml配置默认异常处理器
6.2自定义异常处理器
6.3小结
在业务中直接抛出异常即可,由对应的异常处理组件来处理