请转转发与重定向是多个servlet之间调用的实现方案
请求转发
请求转发的实现原理
-
手动交给服务器一个任务
-
完成任务以后,通过当前请求对象代替浏览器向Tomcat发起请求,申请调用twoservlet(如图所示)
-
Tomcat接受这个请求后自动调用
重定向
原理
-
用户通过第一次手动方式通知浏览器访问OneServlet,OneServlet工作完成完毕以后,将TwoServlet地址写入响应头location属性当中,导致tomcat将302的状态码写入状态行
-
在浏览器接收到响应包之后,会读取302状态码,此时浏览器自动根据响应头中的location属性地址发起第二次请求。访问TwoServlet以完成剩余任务。
-
实现
response.sendRedirect("请求地址"); System.out.println("这个负责洗韭菜"); //重定向解决方案 response.sendRedirect("/myweb/two");
两者比较
请求转发 | 重定向 | |
---|---|---|
请求地址 | 请求地址只能是当前网站下的资源文件 | 可以是网站内的资源也可以是网站外的 |
请求次数 | 一次 | 两次 |
请求方式 | 与浏览器发送请求方式保持 | 重定向解决方案中,通过地址栏通知浏览器发起下一次请求 因此调用资源文件方式一定是get |
为什么请求转发的请求方式要与浏览器请求方式保持一致? 在请求转发的过程中,浏览器只发送了一个请求协议包,参与本次请求的所有servlet共享同一个请求协议包。因此这些servlet接受请求法范式与浏览器发送的请求方式保持一致。
转发和重定向该如何选则?
-
如果在上一个Servlet当中向request域中绑定了数据,希望从下一个servlet当中把request域里面的数据取出来,使用请求转发
-
剩下的情况都可以选用重定向,但是重定向需要在浏览器与服务端之间进行多次的往返,会消耗大量的时间在往返上面,具体使用可以根据使用场景选则。