请求转发与请求重定位基础
请求转发
浏览器接收到客户请求后,通知服务器调用另外一个web资源进行处理.称之为请求转发
代码说明:
1.先要获取context域对象 getServletContext()
2.从域对象中获取转发器 getRequestDispatcher()
3.进行请求转发 forward(request, response)
图形示例
![这里写图片描述](https://img-blog.csdn.net/201803272226419?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xpdXJvbmdzaGVuZzEyMw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
demo06
public class Demo06 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("张三找李四借钱");
System.out.println("李四也没钱,但不和张三说自己没钱,而是自己去找王五借钱");
ServletContext context = this.getServletContext();
RequestDispatcher dispatcher = context.getRequestDispatcher("/demo07");
dispatcher.forward(request, response);
System.out.println("李四借完钱给张三了,张三不知道李四是找王五借的");
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
demo07
public class Demo07 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("李四借完钱给张三了,张三不知道李四是找王五借的");
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
结果截图
![这里写图片描述](https://img-blog.csdn.net/20180327222608768?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xpdXJvbmdzaGVuZzEyMw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
请求重定位
浏览器接收到客户请求后,返回在返回响应中会携带一个重定位响应头(头中有重定位访问网址)
浏览器接收到这个响应后 发现重定向头
再一次发起请求 去访问重定向头中的地址
代码解释:
1.添加重定向响应头 response.setHeader("location", "/sh-web-servlet03/demo08")
2.添加重定向状态码 response.setStatus(302)
图形示例
![这里写图片描述](https://img-blog.csdn.net/20180327223322759?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xpdXJvbmdzaGVuZzEyMw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
demo06
public class Demo06 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("张三找李四借钱");
System.out.println("李四也没钱,把王五的地址给张三,让张三去找王五借钱");
response.setHeader("location", "/sh-web-servlet05/demo07");
response.setStatus(302);
System.out.println("张三拿到李四给的地址,去找王五了");
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
demo07
public class Demo07 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("王五见到了张三,并把钱借给了张三");
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
结果截图
![这里写图片描述](https://img-blog.csdn.net/20180327223353711?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xpdXJvbmdzaGVuZzEyMw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
web.xml
<servlet>
<servlet-name>demo06</servlet-name>
<servlet-class>com.lanou3g.Demo06</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demo06</servlet-name>
<url-pattern>/demo06</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>demo07</servlet-name>
<servlet-class>com.lanou3g.Demo07</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demo07</servlet-name>
<url-pattern>/demo07</url-pattern>
</servlet-mapping>
转发与重定向区别
1.请求转发:用户只请求了一次,剩余的请求是服务器自己做的,用户不知道共
请求了多少次
请求重定向:用户请求了多次,服务器只负责将网址告诉用户,还是要用户自己
去访问
2.请求转发:服务器行为,request.getRequsetDispatcher().forward(requset,response);
是一次请求,转发后请求对象会保存,地址栏的URL地址不会改变(服
务器内部转发,所有客户端看不到地址栏的改变)
请求重定向:客户端行为,从本质上讲等同于两次请求,前一次的请求对象不会保持,
地址栏的URL地址会改变