1.转发
由上面的图可以知道,浏览器只发送一次请求,转发由服务器完成。可以形象描述为:servletDemo01无法完成某一件事,它request让servletDemo02完成
(2)用Java代码来实现上面过程
在ServletDemo01中
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
String str="aaaaaa";
System.out.println("A:我想喝杯水");
System.out.println("B:我现在在忙,让C(ServletDemo02)干吧");
request.getRequestDispatcher("/servlet/demo02").forward(request, response);
System.out.println("B:给你水");
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("C:我马上帮你倒杯水");
}
结合上面的图很容易理解这个过程,及ServletDemo02将结果放回给ServletDemo01
2.请求重定向
由上面的图可以知道,浏览器发送两次次请求,由浏览器完成。可以形象描述为:servletDemo05无法完成某一件事,它指示浏览器去访问servletDemo06可以完成
(2)用Java代码来实现上面过程
在ServletDemo05中血下面的代码
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("A:我要借钱");
System.out.println("B:我没有,但是我知道谁有");
response.setStatus(302);
response.setHeader("location", "/ee10_request_response/servlet/ServletDemo06");
System.out.println("A:我去了");
}
在ServletDemo07中代码为
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("C:我有钱");
}
细节分析:
①在上面的代码执行顺序来看,首先执行的是ServletDemo05里面的全部内容,其次再是ServletDemo06 的内容,这一点可以通过其执行顺序为:ServletDemo05——浏览器------ServletDemo06。
②由于转发重定向是发生在浏览器,所以在写转发的URL时要注意:该URL地址必须是项目名称+URI地址 。
(3)请求重定向简写
可以使用response.sendRedirect();来实现
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("A:我要借钱");
System.out.println("B:我没有,但是我知道谁有");
//response.setStatus(302);
//response.setHeader("location", "/ee10_request_response/servlet/ServletDemo07");
response.sendRedirect("/ee10_request_response/servlet/ServletDemo07");
System.out.println("A:我去了");
}
3.转发与请求重定向的区别
(1)区别1:转发:客户端只发送一次请求
请求重定向:客户端请求两次
(2)区别2:转发:地址栏不变
请求重定向:地址栏发生变化,例如上面的例子中,地址栏由localhost:8080/ee10_request_response/servlet/ServletDemo05变成localhost:8080/ee10_request_response/servlet/ServletDemo06
(3)区别3:转发:能够传递数据
请求重定向:不能传递数据
看下面的例子:
转发:能够传递数据
新建一个ServletDemo06,使用setAttribute(key,value)方法
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("A:我想办事");
System.out.println("B:我办不了,但我可以找人帮你办");
String str="aaa";
//1.将表单的数据添加到request域中
request.setAttribute("s", str);
//2.1使用转发
request.getRequestDispatcher("/servlet/ServletDemo07").forward(request, response);
System.out.println("B:事办完了");
}
在ServletDemo07中,使用getAttribute(key,value)方法
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("C:我有办");
//获取request域中的对象
String attribute = (String) request.getAttribute("s");
System.out.println(attribute);
}
得到的结果为:
请求重定向:不能传递数据
在ServletDemo06中写一下代码
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("A:我想办事");
System.out.println("B:我办不了,但我可以找人帮你办");
String str="aaa";
//1.将表单的数据添加到request域中
request.setAttribute("s", str);
//2.2请求重定向
response.sendRedirect("/ee10_request_response/servlet/ServletDemo07");
System.out.println("B:事办完了");
}
保持ServletDemo07不变
得到结果为:
故由上面的结论可以得到;利用请求重定向不能数据传递
(4)区别4:转发:不能跳到其他应用
请求重定向:可以跳转到其他应用
利用转发:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("A:我想办事");
System.out.println("B:我办不了,但我可以找人帮你办");
String str="aaa";
//1.将表单的数据添加到request域中
request.setAttribute("s", str);
//2.1使用转发
request.getRequestDispatcher("http://www.baidu.com").forward(request, response);
System.out.println("B:事办完了");
}
得到的结果为:
利用请求重定向:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("A:我想办事");
System.out.println("B:我办不了,但我可以找人帮你办");
String str="aaa";
//1.将表单的数据添加到request域中
request.setAttribute("s", str);
//2.1使用转发
//request.getRequestDispatcher("http://www.baidu.com").forward(request, response);
//2.2请求重定向
response.sendRedirect("http://www.baidu.com");
System.out.println("B:事办完了");
}
得到的结果为:
上面的结果也不难想象,因为转发是发生在服务器内部,塔只会去找服务器内部的内容,而请求重定向发生在客户端浏览器,相当于浏览器再次书如百度的地址。
4.总结