目录
一、响应的返回值类型
二、SpringMVC的异常处理
SpringMVC——day02
1、响应的返回值类型是String:它的底层其实也是ModelAndView
//返回类型为String @RequestMapping("/testString") public String testString(){ System.out.println("testString方法被执行了"); return "success"; }2、响应的返回值类型是Void
//返回类型为Void 会默认去pages下寻找testVoid.jsp文件,找不到会包404错误 @RequestMapping("/testVoid") public void testVoid(){ System.out.println("testVoid方法被执行了"); }那么怎么解决这个问题?
1)转发:是一次请求
2)重定向:是两次请求
3)通过输出流直接响应
需要注意的一点是WEB-INF目录下的文件,浏览器一般无法直接方法,如果需要直接访问,可以放在和WEB-INF同级目录下。
/** * 怎么让void不报错 */ @RequestMapping("/testVoid02") public void testVoid02(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("testVoid02方法被执行了"); //编写请求转发的程序 //request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request,response); //重定向,WEB-INF目录下的jsp无法直接请求,所以在建立一个insex.jsp,与WEB-INF同级 //response.sendRedirect(request.getContextPath()+"/index.jsp"); //通过输出流直接响应 response.setCharacterEncoding("UTF-8");//设置中文乱码 response.getWriter().print("你好"); return; }3、响应的返回值类型是ModelAndView
/* 返回类型为ModelAndView */ @RequestMapping("/testModelAndView") public ModelAndView testModelAndView(){ ModelAndView mv = new ModelAndView(); System.out.println("ModelAndView方法被执行了"); User user = new User(); user.setAge("11"); user.setSex("男"); //把user对象存mv中,也会把它存request对象中 mv.addObject("user",user); //想跳转到那个页面 mv.setViewName("success"); return mv; }
1、异常处理思路:向上抛出,最终有前端控制器找出异常进行处理
(小声比比,此处感谢黑马老师画图鬼才)
2、如何实现?
项目结构,在java里创建一个exception包
异常出现
@Controller @RequestMapping("/user") public class UserController { @RequestMapping("/testException") public String testException() throws SysException { try { //模拟异常,实际开发中是捕获到service层的throw语句抛出的异常 int i = 1/0;//选中后 ctrl+aalt+t 快捷生成try...catch } catch (Exception e) { //打印异常信息 e.printStackTrace(); //抛出自定义的异常信息 throw new SysException("这部分出错了");//抛出异常 } return "success"; } }1)编写自定义异常类(SysException),做提示信息,通过构造方法让自定义异常对象包装一段提示信息
/** * 自定义异常处理类 */ public class SysException extends Exception{//在学习Java基础时我们知道自定义异常类一定要继承Exception private String massage; //构造方法,当new一个对象时,该对象会封装一段信息 public SysException(String massage) { this.massage = massage; } public String getMassage() { return massage; } public void setMassage(String massage) { this.massage = massage; } }2)编写异常处理器(SysExceptionResolver),注释很明白了
public class SysExceptionResolver implements HandlerExceptionResolver {//实现异常处理器接口,这个接口是SpringMVC提供 /** * 处理异常的业务逻辑 * @param httpServletRequest * @param httpServletResponse * @param o * @param e * @return */ public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) { //参数中的Exception e,e是UserController中throw new SysException("这部分出错了");这段语句抛出的异常对象 //获取到异常对象 SysException se = null; if (e instanceof SysException){ //instanceof判断左边对象是否为右边类的实例 se = (SysException)e; }else{ se = new SysException("系统正在维护"); } //创建一个ModelAndView对象 ModelAndView mv = new ModelAndView(); mv.addObject("errorMessage",se.getMassage()); mv.setViewName("error");//设置往哪儿跳 return mv; } }3)配置异常处理器(跳转到提示页面),在springmvc.xml中配置
<!-- 配置异常处理器 --> <bean id="SysExceptionResolver" class="com.mvc.exception.SysExceptionResolver" />