返回json给前端
导包:
controller方法直接返回对象或对象列表,要加@ResponseBody,表示以响应体的形式发送:
controller获取请求体数据
在参数前标识@RequestBody,表示把请求体以字符串的形式封装到参数中:
post类型的表单:
运行结果:
注意:如果表单中有上传文件,那么文件名也会包含在这个字符串中;如果前端在请求体发送了json,controller方法参数用@RequestBody User user也可以吧json直接封装成对象。
HttpEntity
controller方法参数传一个HttpEntity<String> httpEntity,可以把所有请求信息都封装到这个参数中,包括请求头信息,请求体,url参数等。url参数要拿到,必须要是post方式。
ResponseEntity
可以用来自定义响应内容:
文件下载
文件上传
导包:
前端form表单要加enctype=multipart/formdata:
controller方法,使用MultipartFile组件来封装上传的文件:
用到的组件要在springmvc.xml声明一下:
上传多个文件,controller方法参数用数组接收,遍历数组要判空:
拦截器
定义一个拦截器实现Hander
preHandle在controller方法执行前执行,postHandle在controller方法执行后执行,afterCompletion在整个servlet结束后执行,用于清理资源,即使前面报错也会执行。
注意:preHandle返回值必须为true才能让链执行下去,否则会卡住。
多个拦截器以链的方式执行,谁先执行取决于web.xml配置的顺序:
gpreHandle1
preHandle2
handle
postHandle2
postHandle1
afterConpletion2
afterConpletion1
pre的时候顺序遍历列表,post或after的时候逆序遍历列表,
springmvc.xml声明一下,没指定路径,就是对所有请求生效:
Controller异常统一处理
@ExceptionHandler,value指定异常类型,当Controller抛出这个异常就会进入该方法统一处理:
如果同时声明了大范围和小范围的ExceptionHandler,则优先匹配小范围,匹配到了小范围就不会匹配大范围:
在Controller类中声明的ExceptionHandler只能处理当前Controller类的,如果需要定义全局的ExceptionHandler,需要创建一个@ControllerAdvice类:
同样,优先匹配局部Handler,匹配到局部Handler就不会匹配全局Handler。