转发与重定向
不仅Servlet存在转发与重定向,SpringMVC中也存在转发与重定向。一张图来解释他们的区别:
那么如何使用呢?
转发:
在使用ModelAndView时,默认情况下是转发,也可以显式的设置转发与重定向
demo:
转发到jsp界面
/**
* 转发到jsp界面
* @return
*/
@RequestMapping("/forward1.do")
public ModelAndView handle1(){
ModelAndView mv = new ModelAndView();
mv.addObject("type","转发的界面");
mv.setViewName("result");
return mv;
}
结果:
转发到另外的controller,用另外的controller处理这个请求
/**
*转发到另外的controller
* @return
*/
@RequestMapping("/forward2.do")
public ModelAndView handle(){
ModelAndView mv = new ModelAndView();
//当手动显示转发时 配置文件的使徒解析器会失效
mv.setViewName("forward:other.do");
return mv;
}
另外的controller:
@RequestMapping("/other.do")
public ModelAndView handle1(){
ModelAndView mv = new ModelAndView();
mv.addObject("type","跳转到另外的controller发送的信息");
mv.setViewName("result");
return mv;
}
结果:
这样返回给前端的数据就是不一样的。
重定向:
如果要实现重定向,则需在setViewName()指定的视图前添加redirect:,此时springmvc.xml文件中配置的视图解析器将会失效,即需要在setViewName中写上jsp相对于项目根的路径。重定向的方式在request域中的数据会失效,此时可以通过ModelAndView来传递数据,但是只能传递基本数据类型和String类型,因为spring mvc会将传递的数据以请求参数的方式放到url的后面,此时任何数据类型都会被转换为普通的字符串。另外,我们在jsp中取值的时候需要使用 EL 表达式中的请求参数param读取 。
demo:
/**
* 重定向到jsp界面
* @return
*/
@RequestMapping("/redirect1.do")
public ModelAndView handle2(){
ModelAndView mv = new ModelAndView();
mv.addObject("type","重定向的结果");
mv.setViewName("redirect:/result.jsp");
return mv;
}
jsp:
<%--
Created by IntelliJ IDEA.
User: yzg
Date: 2019/11/28
Time: 19:47
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isELIgnored="false"%>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>测试重定向问题</h1>
<h2>${param.type}</h2>
</body>
</html>
结果:
注意点:
重定向的jsp界面不能是WEB-INF下的
在jsp页面获取参数时,使用param.type才能获得
转发和重定向的问题就解决了!
SpringMVC的异常处理方式
- 使用spring mvc中的异常处理器 SimpleMappingExceptionResolver
- 使用自定义异常处理器
- 使用异常处理注解
最好还是使用第二种方法:
倘若我们要在项目中捕获特定的异常,然后再根据捕获的异常做一些操作的时候,按照以前的写法,我们需要在每次捕获异常之后或者抛出之前进行操作,这段代码就会重复的出现在很多类里面,导致代码冗余,此时,我们可以通过自定义异常处理器来解决。
自定义异常处理器,需要实现org.springframework.web.servlet.HandlerExceptionResolver接口,并且该类需要在Springmvc.xml
配置文件中进行注册。
首先来自定义一个异常实现HandlerExceptionResolver接口,只要有异常发生,都会自动执行接口方法resolveException()。
public class MyExceptionResolver implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
ModelAndView mv = new ModelAndView();
mv.addObject("ex", ex);
//设置默认异常处理页面
mv.setViewName("error/error");
//判断ex是否是MyException
if (ex instanceof MyException) {
//可以在这里面编写捕获到该异常之后的操作
//设置跳转页面
mv.setViewName("error/MyError");
}
return mv;
}
}
在springmvc.xml中配置之后,就可以使用这个异常处理了,以后只要系统发生了异常就会执行resolveException方法。