知识点

  • 处理文件上传
  • 使用flash属性
  • 在控制器中处理异常

关键词

  • 控制器通知 (Controller Advice)

7.1 处理异常

Spring提供了多种方式将异常转换为响应:

  • 特定的Spring异常将会自动映射为指定的HTTP状态码
  • 异常上可以添加@RequestStatus注解,从而将其映射为某一个HTTP状态码
  • 在方法上可以添加@ExceptionHandler注解,使其用来处理异常

最简单的方式就是第二种,映射。

7.1.1 将异常映射为HTTP状态码

在默认情况下,Spring会将自身的一些异常自动转化为合适的状态码。

Spring异常 HTTP状态码
BindException 400-Bad Request
ConversionNotSupportedException 500-Internal Server Error
HttpMessageNotReadableException 400-Bad Request
HttpMessageNotWriteableException 500-Internal Server Error
HttpRequestMethodNotSupportedException 405-Method Not Allowed
MethodArgumentNotValidException 400-Bad Request
MissingServletRequestParameterException 400-Bad Request
MissingServletRequestPartException 400-Bad Request
NoSuchRequestHandlingMethodException 404-Not Found
TypeMismatchException 400-Bad Request
@ResponseStatus(value=HttpStatus.NOT_FOUND, reason="Spittle Not Found")
public class .....

7.2 为控制器添加通知

控制器通知是任意带有@ControllerAdvice注解的类,这个类包含以下的方法:

  • @ExceptionHandler 注解标注的fangfa
  • @InitBinder注解标注的方法
  • @ModelAttribute注解标注的方法

    以上这些方法会自动运用到整个应用程序所有控制器中带有@RequestMapping注解的方法上。
// 写一个控制器异常处理类
package test
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
// 定义控制器类
@ControllerAdvice
public class AppWideExceptionHandler {
// 定义处理异常的方法
@ExceptionHandler(DuplicateSpittleException.class)
public String duplicateSpittleHandler() {
return "error/duplicate";
}
}

如果任何地方抛出DuplicateSpittleException,则会调用duplicateSpittleHandler方法来处理异常。

7.5 跨重定向请求传递数据

在5.4说了重定向的基础功能,Spring还为其提供了其他的辅助功能。

Q:正在发起重定向功能的方法该如何发送数据给重定向的目标方法呢?

当一个处理器方法完成之后,该方法所指定的模型数据将会复制到请求中,并作为请求中的属性,请求会转发到视图上进行渲染。因为控制器方法和视图所处理的是同一个请求,所以在转发中请求属性能够得以保存。

以上是请求的处理内容,但是重定向不同。

当控制器返回的结果是重定向的话,原始的请求就结束了,并且会发起新的一个GET请求。原始请求中带有的参数也会一起消失,在新请求属性中,没有任何来自模型的数据,必须通过方法内获取后,赋值到重定向的结果中,作为新请求的数据。

重定向传递数据的两种方法:

  • 使用URL模板以路径变量和/或查询参数的形式传递数据。
  • 通过flash属性发送数据。

第一种方法

	@RequestMapping(value="/register",method=POST)
public String executeRegister(Spittr spittr,Model model) {\
spitterRepository.save(spittr);
model.addAttribute("username",spitter.getUsername());
// 假设有一个POJO类为spittr,且有一个变量为Username,并生成一个getUsername()的方法
// 5.4中的写法
// return "redirect:/home/" + spittr.getUsername()
return "redirect:/home/{username}"; }

将username作为占位符填充到URL模板中,而不是直接连接字符串,在占位符中重新转义编码,提升了一定的安全性。

例2:

	@RequestMapping(value="/register",method=POST)
public String executeRegister(Spittr spittr,Model model) {\
spitterRepository.save(spittr);
model.addAttribute("username",spitter.getUsername());
model.addAttribute("userId",spitter.getId());
// 假设有一个POJO类为spittr,且有一个变量为Username,并生成一个getUsername()的方法
// 5.4中的写法
// return "redirect:/home/" + spittr.getUsername()
return "redirect:/home/{username}";
}

新增userId,但是在重定向路径中并没有userId的占位符,重定向后它会被加载到尾部,假设ID=47,生成

/home/lihua?userId=47。有没有对这个url比较熟悉,?后面的内容就是这样子加上去的。

该方法的局限性:在于它只可以发送简单的值,比如字符串或者数字等,没办法处理更为复杂的值。处理复杂的值就是flash方法存在的意义。

第二章方法--flash

如果要发送实际的对象等,Spring会将胯重定向存活的数据放到会话中,提供将数据发送为flash属性的功能,按照定义,flash属性会一直携带这些数据直到下一次请求。提供RedirectAttributes设置flash属性的方法。该模块不仅包含了Model的所有功能,还提供几个方法设置flash属性。

	@RequestMapping(value="/register",method=POST)
public String executeRegister(Spittr spittr,RedirectAttributes model) {\
spitterRepository.save(spittr);
model.addAttribute("username",spitter.getUsername());
// 假设有一个POJO类为spittr,且有一个变量为Username,并生成一个getUsername()的方法
// 5.4中的写法
// return "redirect:/home/" + spittr.getUsername();
model.addFlashAttribute("spitter",spitter);
return "redirect:/home/{username}"; }

"spitter"为key,后面spitter为值,而flash会自动进行推断而不需要设置。

最新文章

  1. Linux:cacti环境部署
  2. IIS启动网站出错的几个解决方法
  3. 在SQL2008R2查询分析器出错(在执行批处理时出现错误。错误消息为: 目录名称无效。)
  4. db.properties
  5. duilib List控件,横向滚动时列表项不移动或者移动错位的bug的修复
  6. 3.4 spring- lookup-method 子元素的使用与解析
  7. 禁止 apache 开机启动
  8. Ueditor 1.4.3 jsp utf-8版图片上传问题
  9. poj 3524 Charm Bracelet(01背包)
  10. 如何将App程序发布到苹果App Store
  11. 关于 LindedList 我想说
  12. 径向基网络(RBF network)
  13. Django REST framework+Vue 打造生鲜超市(十三)
  14. rpm 打包的时候 不进行strip
  15. K-Means ++ 和 kmeans 区别
  16. 解决mysql从windows迁移到centos出现乱码问题
  17. CSS 小结笔记之滑动门技术
  18. ASA5520远程配置 telnet,ssh
  19. OI刷题录——hahalidaxin
  20. #用openfiledialog文件和savefileDialog打开和保存文件

热门文章

  1. MODIS系列之NDVI(MOD13Q1)七:时间序列S-G滤波之Python
  2. 使用Golang + lua实现一个值班机器人
  3. tp5中使用ueditor编辑器保存文本到数据库后回显后显示html标签问题解决办法
  4. Idea中查看一个类的所有资料及其层级关系
  5. Git使用教程之从远程库克隆项目(四)
  6. CentOS7 Installing Python3
  7. leeCode刷题 1078
  8. 进程和线程—Python多线程编程
  9. Centos 编译带调试信息的libevent
  10. HTML简单的伪装与造假