页面跳转有两种形式
请求转发(request.getRequestDispatcher("").forward(request, response);)(例如呼叫转移)
1.转发只是在服务器端对同一个request进行传递,没有产生其它请求,转发的操作,浏览器并不知道
2.只有一个请求,因此跳转前后,可以共享保存在request的数据
3.转发操作,浏览器并不知道,所以地址栏是转发之前的地址
public class Demo2Servlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("Demo2Servlet.service");
System.out.println("keyboard: " + req.getParameter("keyboard"));
// 可以跳转受保护资源, 无法跳转外部资源
req.getRequestDispatcher("WEB-INF/test.html").forward(req, resp);
// req.getRequestDispatcher("http://www.jd.com").forward(req, resp);
System.out.println("ok");
}
}
响应重定向代码(response.sendRedirect("");)
1.服务器发送一个302响应附带下一个跳转的地址,浏览器收到响应后自动向该地址发送一个新的请求
2.跳转前后是两个不同的数据,因此无法共享request数据
3.跳转操作浏览器自动发起,因此地址栏显示的是跳转后的地址
public class Demo2Servlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("Demo2Servlet.service");
System.out.println("keyboard: " + req.getParameter("keyboard"));
// 不能跳转到安全目录, 可以跳转到外部资源
// 跳转到京东: http://www.jd.com
resp.sendRedirect("http://www.jd.com");
}
}
转发:就像送快递;快递送来的时候,你在工作,快递员将东西放在前台,之后你去前台取;
重定向:送快递送错后,给你转运;
区别
1.跳转范围
转发:只限于当前项目,最大也就是当前服务器,可以访问安全目录WEB-INF下的资源
重定向:可以重定向到互联网的任意位置,无法访问WEB-INF下的资源,由客户端发送请求,客户端默认没有此功能
2.语句不同
转发:request.getRequestDispatcher("").forward(request, response);
重定向:response.sendRedirect("");
3.跳转后地址栏路径不同
转发:跳转之前的地址
重定向:跳转之后的地址
4.是否可以共享同一个request的数据
转发:可以共享
重定向:无法共享
5.效率高低
转发:效率高
6.转发和重定向的路径
绝对路径
转发:不能使用绝对路径
重定向:可以使用绝对路径
根路径
转发:/代表当前项目
重定向:/当前服务器(加request.getContextPath()动态获取路径)
相对路径
都可以使用相对路径,但只可以相对于文件自身,不能相对于基准路径
路径选择
跳转到其它服务器,只能使用重定向,也只能使用绝对路径
跳转到当前服务器的其他项目,只能使用重定向,建议使用根路径
跳转到当前服务器的当前项目,可以使用转发,建议使用根路径
到底使用转发还是重定向
1.某些情况下无可选择
希望前后两个组件共享request数据,使用转发
跳转到同一应用的WEB-INF目录下只能用于转发
跳转到不同的应用只能使用重定向
使用Cookie存储数据需要使用重定向
2.跳转到同一应用
使用转发效率高,尽量使用转发
使用转发需要解决重复提交问题,尤其是添加操作
注销之后一般用重定向
连续表单页面之间建议使用重定向,避免属性冲突