目录
关于web中资源的跳转
1. 包括两种方式
转发
理解: 我找张三借钱, 张三先问李四借钱, 再把钱借给我, 这个过程我是不知道的
我只请求借钱了一次, 而且我不知道这个钱是李四的, 我只知道是张三给我借的
重定向
理解: 我找张三借钱, 张三明确告诉我他没钱, 但是他把李四的地址告诉我, 让我问他借
我请求借钱了两次
2. 代码实现
转发: request.getRequestDispatcher("/b").forward(request, response)
重定向: response.sendRedirect(request.getContextPath() + "/b");
转发
AServlet转发到BServlet
AServlet.java如下
public class AServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 向request范围中存储数据
request.setAttribute("username", "zhangsan");
// 转发 forward
// 注意这里的参数request和response是AServlet的实例对象的
// 当它转发到BServlet时候也是这个原来的参数, 而不是新的参数
// 一次请求和响应对应一个请求对象和一个响应对象, 所以转发是一次请求
request.getRequestDispatcher("/b").forward(request, response);
}
}
BServlet.java如下
public class BServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 从request范围中取数据
Object obj = request.getAttribute("username");
System.out.println(obj);
}
}
当浏览器访问/web项目/a路径时, 就会在窗口打印zhangsan
重定向
AServlet重定向到BServlet
AServlet.java如下
public class AServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 向request范围中存储数据
request.setAttribute("username", "zhangsan");
// 重定向
// 执行到此处之后, 响应对象将"/09/b"这个路径响应给浏览器,
// 浏览器收到响应之后又向服务器发送了一次全新的请求
// 所以是两次请求
response.sendRedirect(request.getContextPath() + "/b");
// request.getContextPath() 获取web项目路径
}
}
BServlet.java如下
public class BServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 从request范围中取数据
Object obj = request.getAttribute("username");
System.out.println(obj);
}
}
此时窗口打印为null
正如注释中所写, 重定向之后是一次全新的请求, 所以BServlet从request中不能取出数据, 因为根本没人存入数据
两者的相同点和不同点
相同点: 都可以完成资源跳转
不同点:
转发是request触发
重定向是response触发
转发是一次请求, 浏览器的地址不会变化
重定向是两次请求, 浏览器地址栏地址发生变化
重定向可以跳转到别的web项目的资源, 所以路径需要加web项目的根路径
转发是在本项目内部完成跳转的, 不需要web项目根路径
跳转的下一个资源可以是什么?
跳转的下一个资源可以是web服务器中任何一种资源, 可以是HTML, Servlet, JSP等等
什么时候采用转发, 什么时候采用重定向
大部分情况下都使用重定向
若想完成跨web项目跳转, 必须使用重定向
若在上一个request范围中存储了数据, 希望在下一个资源中从request取出, 必须使用转发
重定向可以解决浏览器的刷新问题
重定向原理是什么
response.sendRedirect("/jd/login")
程序执行到以上代码, 将请求路径/jd/login反馈给浏览器
浏览器自动又向web服务器发送了一次全新的请求:/jd/login
浏览器地址栏上最终显示的地址是:/jd/login