(十一)Servlet教程——Request请求转发

1.Web应用在处理客户端的请求的时候,一般的时候都需要多个资源协同处理,比如先经过一个Servlet的处理,然后再经过另外一个Servlet的处理。但是在一个Servlet中又不能直接调用另外一个Servlet的service方法,所以Servlet就提供了请求转发解决方案。

2.这里省略掉创建Java Web项目以及创建包的步骤,直接在原来创建好的项目中直接创建Servlet。

3.创建一个ServletA实现HttpServlet规范,并重写service方法

此时从ServletA中请求转发到ServletB,此时假定ServletB访问路径是req02。

@WebServlet("/req01")

public class ServletA extends HttpServlet {

    @Override

    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        System.out.println("request a");

        request.getRequestDispatcher("req02").forward(request,response);

    }

}

4.创建一个ServletB实现HttpServlet规范,并重写service方法。

@WebServlet("/req02")

public class ServletB extends HttpServlet {

    @Override

    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        System.out.println("request B");

    }

}

5.在浏览器地址栏中输入:http://localhost:8686/s01/req01 ,可以看到控制台中会输入如下信息

可以看到调用完了ServletA后,接着调用ServletB

改写ServletA的代码

@WebServlet("/req01")

public class ServletA extends HttpServlet {

    @Override

    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //设置HTTP响应的编码以及浏览器显示的编码

        response.setContentType("text/html;charset=UTF-8");

        System.out.println("request a");

        request.setAttribute("servletName","第一个Servlet");

        request.setAttribute("url","地址");

        request.getRequestDispatcher("req02").forward(request,response);

    }

}

7.改写ServletB的代码

@WebServlet("/req02")

public class ServletB extends HttpServlet {

    @Override

    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        response.setContentType("text/html;charset=UTF-8");

        System.out.println("request B");

        String servletName = (String) request.getAttribute("servletName");

        String url = (String) request.getAttribute("url");

        System.out.println("servletName:" + servletName + "  url:" + url);

    }

}

8.刷新之前浏览ServletA的网页,Idea控制台中输入内容如下

9.可以看到在ServletA中设置的请求属性可以在ServletB中接收

10.下面总结一下请求转发具有以下特点:

① 请求转发不支持跨域访问,只能跳转到当前应用中的资源。

② 请求转发之后,浏览器地址栏中的 URL 不会发生变化,因此浏览器不知道在服务器内部发生了转发行为,更无法得知转发的次数。

③ 参与请求转发的 Web 资源之间共享同一 request 对象和 response 对象。

④ 由于 forward() 方法会先清空 response 缓冲区,因此只有转发到最后一个 Web 资源时,生成的响应才会被发送到客户端。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/581074.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【嵌入式软件】LWIP 以太网通信

1.互联网模型 1.1 OSI(Open System Interconnection)七层模型 1)应用层: 为上层用户提供应用的接口。常用的应用层的网络协议有:HTTP、FTP、TFTP、SMTP、SNMP、DNS、TELNET、HTTPS、POP3、DHCP 2)表示层&…

【C++】C\C++内存管理

下面是围绕C\C内存管理这一块知识谈论相关的内存管理机制,有需要借鉴即可。 同时,我在下面也放了快速建立链表的模板,方便oj题目拿到vs上进行调试。 内存管理目录 1.CPP内存管理1.1new、delete关键字概念1.2特性1.3总结 2.new、delete的底层…

【C语言】贪吃蛇详解(附源码)

一、贪吃蛇实现效果 【C语言】贪吃蛇(控制台) 二、源码 🎈🎈🎈Snake 残风也想永存/C语言项目 - 码云 - 开源中国 (gitee.com)🎈🎈🎈 三、如何使用C语言去实现一个贪吃蛇&#xff1f…

每日一题:地下城游戏

恶魔们抓住了公主并将她关在了地下城 dungeon 的 右下角 。地下城是由 m x n 个房间组成的二维网格。我们英勇的骑士最初被安置在 左上角 的房间里,他必须穿过地下城并通过对抗恶魔来拯救公主。 骑士的初始健康点数为一个正整数。如果他的健康点数在某一时刻降至 0…

ThreeJs 环境配置及遇到问题的解决方法

一、环境搭建 ThreeJs在实际在实际使用中更多的是结合框架开发例如:vue框架、react框架,在使用时需要配置开发环境,本文使用的是vscode ThreeJs NodeJs vue 1、ThreeJs安装 下载路径:GitHub - mrdoob/three.js: JavaScript…

CentOS命令大全:掌握关键命令及其精妙用法!

CentOS是一种流行的开源企业级Linux发行版,它基于Red Hat Enterprise Linux (RHEL)的源代码构建。对于系统管理员和运维工程师来说,掌握CentOS的常用命令至关重要。 这些命令不仅可以帮助管理服务器,还可以进行故障排查、性能监控和安全加固等…

【idea】idea 中 git 分支多个提交合并一个提交到新的分支

一、方法原理讲解 我们在 dev 分支对不同的代码文件做了多次提交。现在我们想要把这些提交都合并到 test 分支。首先我们要明白四个 git 操作, commit:命令用于将你的代码变更保存到本地代码仓库中,它创建了一个新的提交(commit…

Ubuntu编译安装MariaDB并进行初始化配置

Ubuntu编译安装MariaDB并进行初始化配置 1. 编译安装MariaDB2. 配置MariaDB3. Docker安装MariaDB 1. 编译安装MariaDB MariaDB官方安装文档:https://mariadb.com/kb/en/Build_Environment_Setup_for_Linux/    下载MariaDB源码:https://mariadb.org/ma…

Spring Boot 如何实现缓存预热

Spring Boot 实现缓存预热 1、使用启动监听事件实现缓存预热。2、使用 PostConstruct 注解实现缓存预热。3、使用 CommandLineRunner 或 ApplicationRunner 实现缓存预热。4、通过实现 InitializingBean 接口,并重写 afterPropertiesSet 方法实现缓存预热。 1、使用…

TCP-模拟BS架构通信

简介 bs是通过浏览器进行访问的每次访问都会开启一个短期的socket用来访问服务器的资源 响应报文的格式 服务端 bs架构中的b是浏览器,不需要我们书写,我们只需要书写服务端即可 服务端 public class Server {public static void main(String[] args) {S…

[C++]22:C++11_part_one

C11 一.列表初始化:1.{}初始化:2.C11扩大了列表初始化的范围:3.std::initializer_list1.简单类型的列表初始化:2.复杂类型的列表初始化3.实现vector的列表初始化4.实现list的列表初始化:5.不支持列表初始化&#xff1a…

制作一个RISC-V的操作系统十六-系统调用

文章目录 用户态和内核态mstatus设置模式切换核心流程封装代码背景解释代码示例解析解释目的 用户态和内核态 mstatus设置 此时UIE设置为1和MPIE为1,MPP设置为0 代表当前权限允许UIE中断发生,并且在第一个mret后将权限恢复为用户态,同时MIE也…

易错知识点(学习过程中不断记录)

快捷键专区: 注释:ctrl/ ctrlshift/ 保存:ctrls 调试: 知识点专区: 1基本数据类型 基本数据类型有四类:整型、浮点型、字符型、布尔型(Boolean), 分为八种&#xff…

UE5 GAS开发P40 周期性效果,持续治疗

Periodic Gameplay Effects周期性的游戏效果 它们在一段时间内以固定的间隔重复应用到目标上。这种效果通常用于表示持续性伤害、治疗或其他影响,例如中毒、灼烧或回复效果。 修改GE_CrystalHeal,在Period改为每0.1秒执行一次 假如同时有三个持续时间在进行,那么这…

STM32与OLED显示屏通信(四针脚和七阵脚)

系列文章目录 STM32单片机系列专栏 C语言术语和结构总结专栏 文章目录 1. 单片机调试 2. OLED简介 3. 接线 4. OLED驱动函数 4.1 四针脚版本 OLED.c OLED.h OLED_Font.h 4.2 七针脚版本 引脚连接 OLED.c OLED.h OLED_Font.h 5. 主函数 工程文件模板 1. 单片机…

linux下安装deepspeed

安装步骤 一开始安装deepspeed不可以使用pip直接进行安装。 这时我们需要利用git进行clone下载到本地: git clone https://github.com/microsoft/DeepSpeed.git 进入到deepspeed的安装目录下 cd /home/bingxing2/ailab/group/ai4agr/wzf/Tools/DeepSpeed 激活…

verilog 从入门到看得懂---matlab 自动生成verilog

matlab 的强大不用多说,以前经常用simulink 生成c,最近尝试用simulink进行了verilog的生成,方法也很简单。 一个简单的示例如下。 1,新建一个模型文件,并且根据需要进行模型搭建 2.配置HDL生成模块 3.点击 generation…

纯血鸿蒙APP实战开发——全局状态保留能力弹窗

全局状态保留能力弹窗 介绍 全局状态保留能力弹窗一种很常见的能力,能够保持状态,且支持全局控制显隐状态以及自定义布局。使用效果参考评论组件 效果图预览 使用说明 使用案例参考短视频案例 首先程序入口页对全局弹窗初始化,使用Globa…

Linux学习之路 -- 进程篇 -- 自定义shell的编写

前面介绍了进程程序替换的相关知识&#xff0c;接下来&#xff0c;我将介绍如何基于前面的知识&#xff0c;编写一个简单的shell&#xff0c;另外本文的所展示的shell可能仅供参考。 目录 <1>获取用户的输入和打印命令行提示符 <2>切割字符串 <3>执行这个…

qt-C++笔记之滑动条QSlider和QProgressBar进度条

qt-C笔记之滑动条QSlider和QProgressBar进度条 —— 2024-04-28 杭州 本例来自《Qt6 C开发指南》 文章目录 qt-C笔记之滑动条QSlider和QProgressBar进度条1.运行2.阅读笔记3.文件结构4.samp4_06.pro5.main.cpp6.widget.h7.widget.cpp8.widget.ui 1.运行 2.阅读笔记 3.文件结构…