教程揭秘 | 动力节点内部Java零基础教学文档第十一篇:SpringMVC
接上期后续
本期分享第十一章节
SpringMVC
已经分享过半了,你们都跟上了吗?
每天都在学习嘛?
有什么不会的嘛?
今日教学文档分享来了

今日新篇章
【SpringMVC】
【主要内容】
1. SpringMVC的概念引入
2. SpringMVC的数据绑定
3. SpringMVC跳转
4. SpringMVC内置对象
5. SpringMVC参数传递
6. SpringMVC获取内置作用域
7. Spring+Mybatis+SpringMVC整合
8. SpringMVC内置编码过滤器
9. SpringMVC返回JSON数据
10. SpringMVC文件上传下载
11. SpringMVC拦截器
12. SpringMVC异常处理器
13. Restful
【学习目标】

1. SpringMVC介绍
SpringMVC是Spring框架中的一个组件,是一个轻量级的web的MVC框架,充当controller,其本质就是一个Servlet。
1.1 传统Servlet的不足
每个请求,都需要定义一个Servlet。虽然可以在service方法中,根据业务标识进行业务分发,但是每个Servlet中的service方法的实现是重复。如果想要对service进行更高层次的封装,就可以解决service的重复代码问题。
每个请求的参数,都需要根据request对象,从Map逐一的获取,单调且含量低。将所有的参数,自动封装映射,简化开发。
request.getParameter(“”)
每个Servlet,向客户端返回数据时,需要单独的处理。
request.getRequestDispatcher(“/路径”).forward(request,response)
Response.sendRedirect(“/路径”)
针对于Servlet在实际使用中的不便,Spring中提供了组件,SpringMVC,更进一步的简化了Servlet的开发。
1.2 SpringMVC的架构

1.2.1 DispatcherServlet
核心控制器,本质上就是一个Servlet,处理所有的客户端的请求。根据请求的资源路径,在处理器映射器中查找对应的处理器。
1.2.2 HandlerMapping
处理器映射器,存储所有当前程序中的处理器,如果在处理器映射器中查找不到资源路径,直接返回404。
1.2.3 HandlerAdapter
处理器适配器,用于适配各种处理器,调用具体的处理器程序。
1.2.4 Handler
具体处理器,开发者实现相应接口或者使用注解声明的程序。用于处理具体的请求。
1.2.5 ViewResolver
视图解析器,根据处理器返回的数据,进行数据处理,将数据处理成相应的格式。
JSP/JSON等等。
2. SpringMVC使用
2.1 SpringMVC入门使用
2.1.1 导入SpringMVC相关jar包
2.1.2 编写SpringMVC配置文件
2.1.3 编写相关类
2.1.4 在web.xml中配置SpringMVC
2.1.5 进行测试
使用bean标签的name属性进行访问。注意,每个名字必须有个/,如果多个名字,之间使用逗号。
2.2 SpringMVC的数据绑定
在SpringMVC中为了简化开发,SpringMVC对请求的参数进行预处理,SpringMVC支持按照参数名称,直接将请求参数封装传递给处理器中的方法,处理无需单独的获取。
2.2.1 请求参数
请求参数,是指基本数据类型和字符串、对象、数组、Map等。
2.2.2 获取请求参数
2.2.3 页面代码
2.3 SpringMVC的跳转
在SpringMVC中,默认的跳转方式内部转发,,每个URL前面默认有forward:
,默认会将方法的返回值当做视图的路径处理。并且,在SpringMVC中,/表示当前项目根目录。如果想要使用重定向,则使用关键字:redirect:/路径。
2.3.1 代码示例
2.4 SpringMVC支持内置的对象
在SpringMVC中,支持为处理器中的方法注入内置的对象,如:HttpServletRequest、HttpServletResponse、HttpSession、Model等。
2.5 Spring+SpringMVC+Mybatis整合
2.5.1 创建项目导入jar包
2.5.2 定义相关类
2.5.2.1 domain
2.5.2.2 mapper
2.5.2.3 service
2.5.2.4 controller
2.5.2.5 页面
2.5.3 配置文件
2.5.3.1 数据库配置文件
2.5.3.2 日志配置文件
2.5.3.3 spring核心配置文件
2.5.3.4 springmvc配置文件
2.5.3.5 Mapper配置文件
2.5.3.6 web.xml
2.6 SpringMVC获取Servlet作用域
2.7 SpringMVC内置的编码过滤器
在springmvc中,为了解决乱码问题,springmvc提供了内置的编码过滤器。在使用时,只需要在web.xml中进行配置即可。
2.8 SpringMVC返回JSON
{key1:value1,key2:value2}:key为String,value为Object
[{},{},{}...]
实体类对象、Map<String,Object>、List<实体类>、List<Map<String,Object>>
fastjson.jar: JSON.toJSONString(Object)
在springmvc中,默认返回的数据不论是什么格式,都当做视图进行解析。会根据返回值的toString的结果,当做路径去查找视图的模板,如果想要返回JSON,则需要使用注解,标识该方法返回的是JSON数据,不要当做视图路径进行路径的查找.该注解为:@ResponseBody.因为springmvc有内置的消息转换器,如果想要特殊设置,需要进行XML配置.
2.8.1 XML配置的形式
XML配置形式,是修改了默认结果处理,全局生效的。使用注解@ResponseBody,标识该方法返回的内容不是URL地址,而是一个消息,使用输出对象输出给客户端。
@RequestMapping
name : 方法映射名称
value/path : 方法访问路径
method : 支持的请求的方法类型:
GET, POST, HEAD, OPTIONS, PUT, PATCH, DELETE, TRACE
params : 请求必须有的参数
headers : 请求必须有的头信息
consumes : 指定请求的数据格式类型 : 普通文本、表单格式、JSON
produces : 指定返回数据的格式类型 :JSON 、HTML
2.8.2 注解
SpringMVC中,有内置的转换器,但是SpringMVC内置的转换器需要相关jar包,需要jackson的jar包。只需要导入jar包后,使用@ResponseBody标识返回的数据是消息即可。SpringMVC自动将返回数据当做JSON字符串处理,并且消息按照UTF-8进行编码。如果@ResponseBody放在类上,类中所有的方法都返回的是消息,不是视图资源。
注意:
@RestController
是 @ResponseBody, @Controller 结合,标识该类是一个处理器,并且处理器中所有的方法都返回的是消息。
2.9 文件上传下载
在springmvc中,也对文件上传进行了封装。更进一步的简化的文件上传,只需导入文件上传相关的jar包和处理文件上传的解析器即可。
2.9.1 文件上传
2.9.1.1 导入jar包
2.9.1.2 配置文件上传的解析器
在SpringMVC的核心配置文件中,新增文件上传解析器配置:
2.9.1.3 处理文件上传请求
页面
处理器
2.9.2 文件下载
2.9.2.1 方案一(推荐):
文件下载的本质,就是获取服务器的文件数据信息,使用字节流将数据传递给客户端。
1. 使用输入流,将磁盘文件读到内存中。
2. 使用网络输出流,将数据输出给客户端。
2.9.2.2 方案二:
springMVC中为了简化文件的下载,封装了实体类:ResponseEntity,可以将文件数据封装在ResponseEntity中。
2.10 SpringMVC中的拦截器
SpringMVC提供HandlerInteceptor接口,这个接口用于拦截处理具体的Handler中的方法,在具体的Handler中的方法执行前后及返回视图之间都可以进行相关扩展操作。
2.10.1 如何使用拦截器
2.10.1.1 创建类实现HandlerInteceptor接口
2.10.1.2 配置拦截器
注意:
1. 在拦截器中,最先执行preHandle,然后执行Handler中具体的方法,再然后执行postHandle和afterCompletion。preHandle就是前置的拦截的方法,返回如果为true,则执行处理器中的方法,如果为false则不执行处理器中的方法。postHandle是在Handler中具体的方法执行完成,但是没有交给视图解析器之前执行,afterCompletion在视图解析器完成了视图解析之后执行的。
2. 拦截器是拦截器的方法,被DispatcherServlet代理调用的方法,如果请求的不是Handler,拦截器是不会拦截的。index.html由于是由tomcat默认的servlet进行返回的,不会执行DispatcherServlet中的doDispatch,那么拦截器无法进行拦截。
2.10.2 Interceptor和Filter的区别
Filter是Java Web的规范,拦截的是请求,任何JavaWeb项目都可以有Filter,但是Interceptor是SpringMVC提供的一套规范HandlerInterceptor,只适用SpringMVC自身,并且只能对DispatherServlet处理器的请求生效,拦截的方法。从范围上说,任何JavaWeb项目都有Filter,但是未必有Interceptor。
1、filter可以应用于任何的javaweb项目;inteceptor应用于springmvc框架
2、Filter可以过滤所有请求资源(不限于html、css、js、images等);Interceptor只能拦截所有的controller方法
3、Filter过滤路径时,没有排除选项;Interceptor可以排除拦截路径
2.11 异常处理器
在spring中,相对完善的异常处理器机制,spring可以自己定义处理异常的规则,这种处理异常规则的程序,就被称之为异常处理器。其实,异常处理器就是对controller的增强,因为异常是向上抛,controller调用service,service调用mapper,controller属于最上层,所以最终异常都会汇集到controller。因此,spring提供了@ControllerAdvice注解,表示对controller增强类。并且还提供了@ExceptionHandler这个注解,当发生异常时,该注解修饰的方法就会执行。
在实际开发中,异常主要分为两类:
1. 系统异常,JDK中定义的异常
2. 业务异常,开发者自己定义的异常
一般是将系统异常转化为业务异常,开发者只处理业务异常。使用try...catch...将代码包裹起来,在catch中抛出自定义的异常,这种方案就是将系统异常转化为业务异常。因为很多数据操作,事务需要异常进行数据回滚。
2.12 springmvc中数据校验
springmvc中的数据校验时通过hibernate-validator实现,对实体类中的字符串有效。
1、引入hibernate-validator依赖
2、在实体类中的字符串(正则表达式)属性上添加相关注解
3、可以用hibernate-validor提供的特有注解对Long、Integer、Float做校验
4、在被校验的实体类前添加@Valid注解
5、当实体类中的数据格式发生错误时,错误信息被封装到了BindResult对象中去,BindResult必须和实体类紧紧挨在一起
2.13 Restful风格
Restful风格适合参数少、参数不敏感的请求地址。使用了restful风格的请求地址,就不能使用.do的方式请求
Resustful风格:
1) 请求地址问题
2) 请求方式问题
http://localhost:8080/getBooksByFenye.do?pageNum=1&pageSize=5
http://localhost:8080/getBooksByFenye/1/5
2.13.1 Http协议设计的初衷
HTTP协议在设计时,期望使用一个URL表示一个资源。然后,根据不同的动作:GET、POST、PUT、DELETE等等表示对一个资源的各种操作。
如:
获取这个资源就使用GET, @GetMapping(“/”)
修改这个资源PUT, @PutMapping()
删除这个资源用DELETE,@DeleteMapping()
创建这个资源使用POST。 @PostMapping()
但是在实际使用中,多个URL表示一个资源,例如:新增用户: addUser.do,修改用户:updateUser.do,删除用户:deleteUser.do,查询一个用户:getUser.do。这时候,出现一个资源存在多个URL。在一定程度声,违背了HTTP协议的设计初衷,并且命名也是个问题。
2.13.2 Restful设计思想
1. 使用一个URL表示一种资源
2. 客户端使用GET、POST、PUT、DELETE4个表示操作方式的动词对服务端资源进行操作:GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源
3. 通过操作资源的表现形式来操作资源
2.13.3 在SpringMVC中使用Restful
SpringMVC也支持Restful风格,但是目前存在一些问题。主要不是很好支持PUT请求,没有办法获取到PUT请求的数据。
2.13.3.1 将DispatherServlet的映射地址改为
由于将DispatherServlet的映射路径,改为了/,则所有的请求都由DispatherServlet处理,静态的资源文件不在处理器映射器中,会出现404。并拦截器拦截DispatherServlet中调用Handler中的方法,改为/,则所有的请求都会被拦截。
则需要在SpringMVC的核心配置文件中,新增启用默认的Servlet的处理器。
<!-- 启用默认Servlet -->
<mvc:default-servlet-handler/>
并且注意,配置拦截器时,将静态资源不进行拦截,要排除:
<mvc:exclude-mapping path="/resouces/**"/>
2.13.3.2 配置处理PUT请求的拦截器
2.13.3.3 处理器代码
2.13.3.4 页面代码

更多干货我们下期再说!
下期会分享
第十二章节
Linux
相关知识~
下期见!
