一、转发的概念
一个Web组件(Servlet/JSP)将未完成的处理通过容器转交给另外一个Web组件继续处理,转发 的各个组件会共享Request和Response对象。
二、代码演示
1、编写转发界面
-
创建空工程,在工程中创建javaEE模块
-
配置中设置tomcat的部署
-
编写register界面
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>转发测试</title> </head> <body><form action="forwardServlet" method="post"><input type="submit" value="转发"></form> </body> </html>
2、编写Servlet 转发
-
编写servlet
-
ForwardServlet
package com.example.forward_demo03;import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.annotation.*; import java.io.IOException;@WebServlet(name = "ForwardServlet", urlPatterns = "/forwardServlet") public class ForwardServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("接收到了转发请求!");//获取另一个web组件,让它进行转发RequestDispatcher requestDispatcher = request.getRequestDispatcher("/targetServlet");requestDispatcher.forward(request, response);} }
这里看到,需要再编写一个 targetServlet,处理转发请求。它会执行真正的转发请求。
-
targetServlet
package com.example.forward_demo03;import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.annotation.*; import java.io.IOException; import java.io.PrintWriter;@WebServlet(name = "TargetServlet", value = "/targetServlet") public class TargetServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("接收到了传递过来的转发请求!");response.setContentType("text/html;charset=utf-8");PrintWriter writer = response.getWriter();writer.write("<h1>" + "转发成功!" + "</h1>");} }
-
-
部署测试:
-
运行tomcat
-
访问转发界面,发送转发请求
-
转发请求发送,浏览器界面显示
-
控制台输出显示
-
F12查看调试信息
可以看到只进行一次请求。
-
3、转发的其他功能
绑定数据到Request对象
-
修改ForwardServlet
package com.example.forward_demo03;import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.annotation.*; import java.io.IOException;@WebServlet(name = "ForwardServlet", urlPatterns = "/forwardServlet") public class ForwardServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("接收到了转发请求!");request.setAttribute("key1", "value1");//获取另一个web组件,让它进行转发RequestDispatcher requestDispatcher = request.getRequestDispatcher("/targetServlet");requestDispatcher.forward(request, response);} }
-
修改TargetServlet
package com.example.forward_demo03;import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.annotation.*; import java.io.IOException; import java.io.PrintWriter;@WebServlet(name = "TargetServlet", value = "/targetServlet") public class TargetServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("接收到了传递过来的转发请求!");Object value = request.getAttribute("key1");System.out.println("获取到的转发来的key1对应的值:" + value);response.setContentType("text/html;charset=utf-8");PrintWriter writer = response.getWriter();writer.write("<h1>" + "转发成功!" + "</h1>");} }
-
测试结果
从这也可以看出,转发的request用的是同一个。
三、转发和重定向的比较
转发 | 重定向 | |
---|---|---|
转发/重定向之后浏览器地址栏的URL会不会发生改变 | 不会 | 会 |
转发/重定向过程中是否共享Request对象 | 是 | 否 |
转发/重定向的URL可不可以是其它项目工程 | 不可以 | 可以 |