区别
序号 |
问题 |
重定向 |
请求转发 |
1 |
第二次请求谁请求的? |
浏览器 |
服务器 |
2 |
浏览器发送了几次请求? |
2次以上 |
1次 |
3 |
servlet可以共享request吗? |
不可以 |
可以 |
4 |
地址栏是否发生改变? |
是 |
不是 |
5 |
浏览器地址栏显示的哪一次访问地址? |
最后一次 |
第一次 |
6 |
可以跳转到什么资源? |
任意资源 |
项目内部 |
7 |
第二次的请求路径是? |
绝对路径 |
内部路径 |
举个栗子
-
重定向
graph TD
才华横溢的小A == 1.帮我拿个快递 ==> 无所畏惧的小B == 2. 我没空你找乐于助人的小C ==> 才华横溢的小A ==3. 帮我带个快递==> 乐于助人的小C ==4. OK,取到快递了==> 才华横溢的小A
①:A对B说,帮忙拿下快递
②:B对A说,没有空,你找下C吧
③:A对C说,帮忙拿下快递
④:C然后拿了快递给A
-
请求转发
graph LR
才华横溢的小A == 1.帮我拿个快递 ==> 无所畏惧的小B == 2. 帮才华横溢的小A拿个快递 ==> 乐于助人的小C ==3. OK,取到快递了==> 才华横溢的小A
①:A对B说,帮忙拿下快递
②:第二步,B没有空,直接找让C帮A拿下快递
③:C拿到了快递并返回给A
重定向-流程图、代码
流程图
graph TD
subgraph 服务器
BoyServlet[BoyServlet <br/> A对B说:帮我拿下快递 <br/> B对A说: 我没空, 你找C <br /> //重定向,通知浏览器访问其他路径 <br/> 1. 设置响应码 <br/> 2. 设置响应头]
GirlServlet[ GirlServlet <br/> A对C说: 帮我拿下快递 <br/> C对A说: 好的]
end
subgraph 浏览器
Req[ /redirect/boy?id=10001 ]
302[302 <br/> localhost: /redirect/girl]
Girl[ /redirect/girl ]
return
end
Req --请求行 头 实体--> BoyServlet
BoyServlet --响应码: 302 <br/> 响应头: localhost--> 302
302 ----> Girl
Girl --请求行 头 实体--> GirlServlet
GirlServlet --拿到快递了--> return
代码BoyServlet
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class BoyServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String id = request.getParameter("id"); System.out.println("A对B说:帮我拿下快递,id号是:" + id); System.out.println("B对A说:我没有空,你找下C"); System.out.println("----分割线----"); response.setStatus(302); response.setHeader("location", "/redirect/girl"); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
|
代码GirlServlet
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class GirlServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); String id = request.getParameter("id"); System.out.println("A对C说,帮我拿下快递,id号是:"+id); System.out.println("拿到快递了"); PrintWriter writer = response.getWriter(); writer.println("拿到快递了"); } 2.3web.xml文件 请求转发-流程图、代码 1.流程图 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
|
web.xml文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>redirect</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <servlet> <description></description> <display-name>BoyServlet</display-name> <servlet-name>BoyServlet</servlet-name> <servlet-class>com.redirect.BoyServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>BoyServlet</servlet-name> <url-pattern>/boy</url-pattern> </servlet-mapping> <servlet> <description></description> <display-name>GirlServlet</display-name> <servlet-name>GirlServlet</servlet-name> <servlet-class>com.redirect.GirlServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>GirlServlet</servlet-name> <url-pattern>/girl</url-pattern> </servlet-mapping> </web-app>
|
请求转发-流程图、代码
流程图
graph TD
subgraph 服务器
BoyServlet[BoyServlet <br/> A对B说:帮我拿下快递 <br/> B对A说: 我没空, 你找C <br /> //重定向,通知浏览器访问其他路径 <br/> 1. 设置响应码 <br/> 2. 设置响应头]
GirlServlet[ GirlServlet <br/> A对C说: 帮我拿下快递 <br/> C对A说: 好的]
end
subgraph 浏览器
Req[ /redirect/boy?id=10001 ]
return
end
Req ----> BoyServlet
BoyServlet -----> GirlServlet
GirlServlet --拿到快递了--> return
代码BoyServlet
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class BoyServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String id = request.getParameter("id"); System.out.println("A对B说:帮我拿下快递,id号是:" + id); System.out.println("B对A说:好的"); System.out.println("----分割线----"); RequestDispatcher dispatcher = request.getRequestDispatcher("/girl"); dispatcher.forward(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
|
代码GirlServlet
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class GirlServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); String id = request.getParameter("id"); System.out.println("B对C说:帮A拿下快递,id号是:" + id); System.out.println("拿到快递了"); PrintWriter writer = response.getWriter(); writer.println("拿到快递了"); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
|
web.xml文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>dispatcher</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <servlet> <description></description> <display-name>BoyServlet</display-name> <servlet-name>BoyServlet</servlet-name> <servlet-class>com.dispatcher.BoyServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>BoyServlet</servlet-name> <url-pattern>/boy</url-pattern> </servlet-mapping> <servlet> <description></description> <display-name>GirlServlet</display-name> <servlet-name>GirlServlet</servlet-name> <servlet-class>com.dispatcher.GirlServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>GirlServlet</servlet-name> <url-pattern>/girl</url-pattern> </servlet-mapping> </web-app>
|
请求转发和重定向时的路径问题
转发或重定向时路径上带"/“和不带”/"的区别
-
对于重定向
如果资源的路径前面有"/“,此时”/“参照 web 服务器的根路径,会丢失 web 应用的根路径,解决方案: 在”/"前面加上
1 2
| request.getContextPath() response.sendRedirect(request.getContextPath()+"/show.jsp")
|
如果路径前没有"/",那么路径相对于当前的 servlet 或 jsp 的路径的,是一个相对路径。
-
对于请求转发
如果资源的路径前没有"/“,那么路径相对于当前的 servlet 或 jsp 的路径;如果路径前带了”/“,此时”/"参照 web 应用的根路径。
总结:如果请求是客户端的请求(发生在客户端的跳转),那么路径前不要带"/“, 因为带了”/"会丢失 web 应用的根路径。