1 获取Servlet的API
在Spring MVC获取原生的Servlet中的相关对象:HttpServletRequest request, HttpServletResponse response, HttpSession session
只需要在处理器方法中定义这3种类型的形式参数即可:
1 | public String servletApi(HttpServletRequest request, HttpServletResponse response, HttpSession session) |
相关注解:
@RequestHeader:获取指定的请求头数据
1 | public String headApi( String headMsg) |
@CookieValue:获取指定的cookie数据
1 | public String cookieApi( String jsessionid) |
@SessionAttribute:获取Session中的数据
1 | public String sessionApi( String name, |
@SessionAttributes:把Model中的指定的数据存储到Session中
1 |
|
2 异步请求
2.1 请求体数据的封装
把要异步请求中请求体的数据通过spring mvc进行接收,只需要在方法的形式参数上使用**@RequestBody**进行标注。
1 |
|
2.2 给前端响应数据
使用**@ResponseBody**注解对方法进行标注即可。
@ResponseBody:会使用指定的转换器将方法的返回值转换成指定的类型,然后将这个返回值作为响应体数据,响应到前端。
默认情况下,方法的返回值类型只支持String类型。
1 | public String ajaxReturnString(){ |
如果说我们方法的返回值类型不是String,Spring MVC就会使用指定的转换器将返回值转换成json数据,然后将这个返回值作为响应体数据,响应到前端。
在Spring MVC把一个实体类转换成json数据使用到的转换器:MappingJackson2HttpMessageConverter
要使用这个转换器进行转换,底层使用的就是jackson的工具,因此需要在项目中加入jackson依赖。
1 | <!--json相关坐标3个--> |
示例代码:
1 |
|
2.3 跨域问题
什么跨域?通过一个域的js代码请求另外一个域的后端地址。
同域是可以访问的:什么是同域?协议、ip、域名、端口都是相同的
解决方案?
在方法上或者类上使用**@CrossOrigin**进行标注即可。
1 |
|
3 拦截器
3.1 拦截器概述
作用:拦截请求
为什么要进行请求拦截?
把请求拦截下来的主要作用:对访问权限进行判断
整体请求响应的过程:
Filter和拦截器的区别:
1、Filter是属于JavaEE规范的技术,拦截器是属于Spring MVC的技术
2、Filter可以拦截所有的请求,拦截器只拦截满足DispatcherServlet处理规则的请求
3.2 拦截器的开发
开发步骤:
1、自定义一个拦截器
2、在Spring MVC的配置文件中去配置拦截器
自定义一个拦截器:
1 | public class MyInterceptor implements HandlerInterceptor { |
在Spring MVC的配置文件中去配置拦截器
1 | <!--开启拦截器使用--> |
加入拦截器以后的请求流程:
3.3 拦截器方法参数
方法参数:
- HttpServletRequest request : 请求对象
- HttpServletResponse response : 响应对象
- Object handler : 处理器(就是对应的方法对象)
- ModelAndView modelAndView : 模型和视图信息的对象
- Exception ex : 表示的就是处理器异常信息
拦截规则的配置:
1 | <mvc:mapping path="/*"/> <!-- 拦截所有的一级请求 --> |
3.4 多拦截器的配置
多拦截器的配置:
1 | <!--开启拦截器使用--> |
执行顺序就是配置顺序。
4 异常处理
4.1 传统方式
三层架构中针对每一层的异常应该如何处理?
dao:不处理
service:不处理
controller:肯定需要进行处理
问题怎么处理?
现在我们在Controller中没有对异常进行处理,此时如果程序产生了异常,会交给Spring MVC中的异常处理器(HandlerExceptionResolver)进行处理。这个异常处理器
获取到异常了以后,会把异常的错误信息返回给页面。
这种处理机制不太友好,怎么办?
1、在每一个方法中进行try…catch中(麻烦)
2、进行统一的异常处理(自定义异常处理器)
实现方案:
1 |
|
4.2 注解方式
常见注解:
@Component:把某一个bean纳入到spring容器中
@ControllerAdvice:声明当前这个类就是一个异常处理器
@ExceptionHandler:使用在方法上,用来处理指定的异常
示例代码:
1 |
|
4.3 在项目中去处理异常
上述的异常处理方案存在的弊端:随着异常类型的增多需要不断的去添加新的方法进行异常处理。
分析项目中常见的异常的分类:
1、业务异常
- 不满足业务规则的时候,就可以主动的去产生一些异常
- 举例:系统要求注册的用户的年龄必须在18-100之间
2、系统异常
- 系统级别的异常
- 举例:数据库连接不上了
可以自定义这两种异常,然后当程序真正的产生了异常,此时只需要将这个异常转换成对应的自定义异常即可。这时我们的异常处理器只需要去处理两种类型的异常即可。
如何把程序产生的异常转换成对应的自定义的异常呢?
1 | public class UserServlceImpl { |
异常处理器:
1 |
|
5 文件上传
5.1 实现
页面表单要求:
1、提交方式必须是POST
2、表单的enctype属性必须是:enctype=”multipart/form-data”
3、表单中必须存在一个文件表单项
Spring MVC实现文件上传:
Spring MVC实现文件上传的时候底层也是对Apache下面的fileupload组件进行封装。因此就需要在pom.xml文件中加入依赖:
1 | <dependency> |
默认情况Spring MVC是不支持文件上传的,要进行文件的上传就需要去开启一个文件上传的组件:MultipartResolver(接口)
1 | <!--配置文件上传处理器, 这个bean的id必须是multipartResolver--> |
后端代码:
1 | public String fileupload(MultipartFile file) throws IOException { // MultipartFile封装了文件的相关数据, 参数的名称需要和文件表单项的名称一致 |
5.2 注意事项
注意事项:
1、文件大小的设置
1 | <!--配置文件上传处理器--> |
2、文件名重复问题
思路:给保存的文件设置一个唯一的文件名称即可
1 | String newFileName = UUID.randomUUID().toString().replace("-", ""); |
3、进行目录打撒
常见的打撒算法:
规则:获取文件名所对应的哈希值,使用哈希值第一个作为1级目录 , 使用哈希值第二个作为2级目录 , 使用哈希值第三个作为3级目录
6 Restful接口
6.1 入门案例
接口:其实就是一个http的请求地址。
相关概念:
Rest:其实就是网络资源的一种访问风格。就是把请求参数作为请求路径的一部分。
网络资源的访问就是通过http的接口进行访问:
1、传统的http接口
查询:http://localhost:8080/user/findById?id=1
2、Rest风格
查询:http://localhost:8080/user/findById/1
使用Rest风格的好处:简化url
Restful:就是按照Rest的封装去访问网络资源
网络资源的访问是存在很多的操作的:增,删,改,查
通过Restful的方式去访问网络资源,如何去区分具体的操作呢?
约定:
GET: 表示的就是查询
POST: 表示的就是新增
PUT: 表示的就是修改
DELETE: 表示的就是删除
如何去开发一个Rrestful风格的接口:
1 | // http://localhost:8080/user/1 |
@PathVariable: 主要作用就是从请求地址中获取指定的请求参数
@RequestParam:用来指定请求参数的名称,适用于传统方式的url请求地址:http://localhost:8080/user/findById?id=1
@RequestBody:获取异步请求中请求体的数据将其封装到方法形式参数上
@RestController注解:相当于@Controller和@ResponseBody
1 |
|
6.2 常见注解
常见注解:
1 | 相当于: |
注意事项:
默认情况下页面表单所支持的请求方式只有GET和POST
如果需要通过页面表单来发送PUT或者DELETE的请求,此时就需要进行如下配置:
1、在页面表单中添加一个隐藏域
1 | <form action="/user/1" method="post"> |
隐藏域的名称必须是_method
2、在web.xml文件中去添加一个过滤器HiddenHttpMethodFilter(这个过滤器的主要作用就是把表单的POST请求转换成指定的请求方式)
1 | <!--配置拦截器,解析请求中的参数_method,否则无法发起PUT请求与DELETE请求,配合页面表单使用--> |
6.3 postman工具
工具作用: 可以直接去发送Restful风格的请求,类似于浏览器