文章目录
- 1. 前言
- 2. 实战案例
- 3. 特点
1. 前言
请求转发是一种在服务器内部的资源跳转方式,如图:
上图的大致过程为,浏览器发送请求给服务器,服务器中 a 资源接收到请求,资源 a 处理完请求后将请求发送给资源 b,资源 b 处理完请求以后将结果响应给浏览器。其中请求从资源a到资源b的过程就叫做请求转发。
请求转发的实现方式如下:
request.getRequestDispatcher("资源b路径").foword(request,response);
2. 实战案例
下面练习请求转发。
第一步:创建一个 RequestDemo 类,接收 /demo 的请求,在 doGet() 方法中打印。
@WebServlet("/demo")
public class ServletDemo extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("demo...");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
第二步:创建一个 RequestDemo2 类,接收 /demo2 的请求,在 doGet() 方法中打印。
@WebServlet("/demo2")
public class ServletDemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("demo2...");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
第三步:在 RequestDemo 类中使用请求转发到 /demo2 资源。
request.getRequestDispatcher("/demo2").forward(request,response);
第四步:测试
启动服务器,在浏览器中访问 http://localhost:8080/servlet-project/demo
。
此时控制台执行结果:
控制台除了打印 /demo 的内容,还打印了 /demo2 的内容,说明请求成功转发到了 /demo2 。那么,将请求从 /demo 转发到 /demo2 时,如何将数据传递给 /demo2 呢?此时需要使用 request 对象提供的方法:
存储数据到 request 域(范围,数据存储在 request 对象)中:
void setAttribute(String name,Object o);
根据 key 获取值:
Object getAttribute(String name);
根据 key 删除该键值对:
void removeAttribute(String name);
下面练习在请求转发时数据的传递。
-
在 RequestDemo 的 doGet() 方法中转发请求之前,将数据存入 request 域对象中。
-
在 RequestDemo2 的 doGet 方法中从 request 域对象中获取数据,并将数据打印到控制台。
-
测试
第一步:修改 RequestDemo 中的方法:
@WebServlet("/demo")
public class ServletDemo extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("demo...");
request.setAttribute("msg","hello");
request.getRequestDispatcher("/demo2").forward(request,response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
第二步:修改 RequestDemo2 中的方法:
@WebServlet("/demo2")
public class ServletDemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("demo2...");
Object msg = request.getAttribute("msg");
System.out.println(msg);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
第三步:重启服务器,访问 http://localhost:8080/servlet-project/demo
,此时控制台输出:
此时就实现了在转发多个资源之间的数据共享。
3. 特点
在请求转发过程中,服务器内部发生了资源的跳转,所以浏览器的地址栏路径不会发生变化。
请求跳转只能转发到当前服务器的内部资源,不能从一个服务器通过转发跳转到另一台服务器。
请求转发可以在转发资源之间实现数据共享,但是这只是一次请求。
你问我青春还剩几年?我的回答是,趁现在,正当时。身边朋友都在问我怎样学好一门编程语言,怎样学好Java?怎样通过 Java 找到一份满意的工作?推荐学习此专栏:Java编程基础教程系列(零基础小白搬砖逆袭)
下期见。