SpringMVC中的转发和重定向
1.请求转发
A.使用MVC支持的HttpServlet进行数据转发
使用原始的HttpServlet是,controller层返回一个逻辑视图名称,MVC会调用视图解析器进行转发
@Controller
@RequestMapping("/f")
public class Demo2Controller {
@RequestMapping("/h")
public String m1(HttpServletRequest request, HttpServletResponse response){
request.setAttribute("data","123");
return "demo2";
}
}
demo2.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>${data}</h1>
</body>
</html>
显示结果:
b.MVC框架中使用forward:
forward后面传递的是页面或者服务器端其他url地址,不经过视图解析器,所以返回的地址需要加上WEB-INF和.jsp
@RequestMapping("/m")
public String m2(Map map){
map.put("data",456);
return "forward:/WEB-INF/demo2.jsp";
}
2.重定向
因为重定向是两次请求,两次响应,在服务器给定重定向后,实际上只是给了浏览器端一个下一次请求的地址,这时浏览器重新请求,如果jsp在WEB-INF下则会报404错误,因为对于WEB-INF下的jsp文件只能通过请求转发进行,而对于web下的jsp文件能正常进行访问
A.使用MVC支持的HttpServlet进行重定向
@RequestMapping("/h1")
public void m2(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.sendRedirect("/WEB-INF/demo2.jsp");
}
这里response.sendRedirect("/WEB-INF/demo2.jsp");
里面传递的只能是地址,不能是jsp,最终访问结果:
所以想要进行WEB-INF下jsp之间重定向只能通过controller之间跳转一个空的请求转发进行重定向,相当于用户第二次访问的是一个controller:
response.sendRedirect("/f/h");
b.MVC框架中使用redirect:
重定向到web下的jsp
@RequestMapping("/h1")
public String m2() {
return "redirect:/demo2.jsp";
}