目录
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;
}
二、SpringMVC的异常处理
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" />