【Servlet篇】Request请求转发详细解读
创始人
2024-05-26 10:59:23

文章目录

  • 1. 前言
  • 2. 实战案例
  • 3. 特点

1. 前言

请求转发是一种在服务器内部的资源跳转方式,如图:

image-20230210222559083

上图的大致过程为,浏览器发送请求给服务器,服务器中 a 资源接收到请求,资源 a 处理完请求后将请求发送给资源 b,资源 b 处理完请求以后将结果响应给浏览器。其中请求从资源a到资源b的过程就叫做请求转发。

请求转发的实现方式如下:

request.getRequestDispatcher("资源b路径").foword(request,response);

2. 实战案例

下面练习请求转发。

第一步:创建一个 RequestDemo 类,接收 /demo 的请求,在 doGet() 方法中打印。

@WebServlet("/demo")
public class ServletDemo extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("demo...");}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}

第二步:创建一个 RequestDemo2 类,接收 /demo2 的请求,在 doGet() 方法中打印。

@WebServlet("/demo2")
public class ServletDemo2 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("demo2...");}@Overrideprotected 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

此时控制台执行结果:

image-20230210210348864

控制台除了打印 /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);

下面练习在请求转发时数据的传递。

  1. 在 RequestDemo 的 doGet() 方法中转发请求之前,将数据存入 request 域对象中。

  2. 在 RequestDemo2 的 doGet 方法中从 request 域对象中获取数据,并将数据打印到控制台。

  3. 测试

第一步:修改 RequestDemo 中的方法:

@WebServlet("/demo")
public class ServletDemo extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("demo...");request.setAttribute("msg","hello");request.getRequestDispatcher("/demo2").forward(request,response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}

第二步:修改 RequestDemo2 中的方法:

@WebServlet("/demo2")
public class ServletDemo2 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("demo2...");Object msg = request.getAttribute("msg");System.out.println(msg);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}

第三步:重启服务器,访问 http://localhost:8080/servlet-project/demo,此时控制台输出:

在这里插入图片描述

此时就实现了在转发多个资源之间的数据共享。

3. 特点

在请求转发过程中,服务器内部发生了资源的跳转,所以浏览器的地址栏路径不会发生变化。

请求跳转只能转发到当前服务器的内部资源,不能从一个服务器通过转发跳转到另一台服务器。

请求转发可以在转发资源之间实现数据共享,但是这只是一次请求。


你问我青春还剩几年?我的回答是,趁现在,正当时。身边朋友都在问我怎样学好一门编程语言,怎样学好Java?怎样通过 Java 找到一份满意的工作?推荐学习此专栏:Java编程基础教程系列(零基础小白搬砖逆袭)

下期见。

相关内容

热门资讯

demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
阿西吧是什么意思 阿西吧相当于... 即使你没有受到过任何外语培训,你也懂四国语言。汉语:你好英语:Shit韩语:阿西吧(아,씨발! )日...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...