Java高手速成 | 图说重定向与转发
我们先回顾一下Servlet的工作原理,Servlet的工作原理跟小猪同学食堂就餐的过程很类似。小猪同学点了烤鸡腿(要奥尔良风味的),食堂窗口的服务员记下了菜单,想了想后厨的所有厨师,然后将菜单和餐盘交给专门制作烤鸡腿的厨师,这位大厨根据菜单制作出奥尔良烤鸡腿并放进餐盘,交给窗口服务员,服务员将做好的烤鸡腿交给小猪同学,小猪同学饱餐一顿后,菜单和餐盘就都被清理掉了,模拟情景的图示如图1所示。
■ 图1 Servlet工作原理模拟情景
上述过程对应到java中其实就是用户通过浏览器向Web服务器发出HTTP请求,服务器选择相应的Servlet响应浏览器的请求,并将响应结果返回给浏览器。服务器在选择相应Servlet的时候会出现一些问题,如果该Servlet无法完成本次请求,它会怎么处理这种情况呢?在Servlet中有两种机制可以帮助我们解决上述问题,Servlet工作原理解释如图2所示。
■ 图2 Servlet工作原理
如果厨师不会做这道菜怎么办呢?有两种解决方案,就是我们本节的内容请求转发与重定向,模拟情景如图3所示。
■ 图3 重定向和转发的由来
01、请求转发原理
如果小猪到饭店点了麻辣凉粉,饭店的服务员记下了菜单,把这道菜交给了面点师傅。虽然凉粉是淀粉类食品,可是这道菜面点师傅不会做,应该交给炒菜的师傅来完成这道菜,于是面点师傅将菜单还给服务员,让服务员去找炒菜的师傅。服务员知道自己搞错了之后立刻把菜单交给炒菜师傅,炒菜师傅根据菜单制作出了麻辣凉粉并放入盘中交给服务员,服务员再将做好的凉粉交给小猪同学。这种在同一个饭店更换厨师并且不需要顾客再次点菜的处理方式叫做请求转发,其模拟情景如图4所示。
■ 图4 请求转发模拟情景
用户通过访问Web浏览器提出请求,由Servlet引擎创建Servlet1实例以及request和response对象,然后调用Servlet1的service()函数响应用户请求,service方法读取请求内容,写入响应内容,其工作原理如图5所示。
■ 图5 Servlet工作原理
在执行service()方法时如果遇到了请求转发forward命令,说明当前Servlet处理不了用户的请求,就要立刻调整请求头为forward命令中请求的Servlet2,清空响应对象的响应体,然后返回到Servlet引擎,请求转发中执行service方法的工作原理解释如图6所示。
■ 图6请求转发的工作原理图示2
service函数执行完毕后返回,服务器将响应结果发送到Web浏览器中,请求转发中service方法执行完毕后的工作原理解释如图7所示。
■ 图7 请求转发的工作原理图示3
02、重定向原理
可是如果饭店里的厨师都不会做小猪同学点的菜该怎么办呢?我们接下来就介绍另一种方式。如果小猪到川菜馆点了一份寿司,服务员将菜单递给厨师之后大厨发现所有的厨师都不会做寿司,于是川菜师傅将菜单还给服务员并告诉他日料馆的地址,再由川菜馆的服务员告诉小猪川菜馆做不了寿司,他应该去吃货街的日料馆。知道自己找错地方之后小猪就来到吃货街找到日料馆向服务员点了一份寿司,经过点菜,做菜,上菜的流程之后小猪终于如愿吃到了寿司。这种顾客需要到别的饭店重新提出请求的方式叫做重定向,如图7和8所示。
■ 图8 重定向模拟情景1
■ 图9 重定向模拟情景2
用户通过访问Web浏览器提出请求,由Servlet引擎创建Servlet1实例以及request和response对象,然后调用Servlet1的service()函数响应用户请求,其工作原理如图10所示。
■图10 Servlet工作原理
但是若在service中执行到了sendRedirect重定向命令,说明当前Servlet响应不了用户的请求,需要清空响应体中已经写入的内容,将能够响应用户请求的Servlet2的地址写入响应体中,然后将结果返回至服务器,执行sendRedirect方法的工作原理如图11所示。
■ 图11 重定向工作原理1
浏览器接到包含重定向地址的响应信息后会自动重新提交请求,Servlet引擎创建Servlet2实例同时创建新的request和response对象,然后调用Servlet2的service()函数响应用户请求,request和response方法的工作原理如图12所示。
■ 图12 重定向工作原理2
浏览器接到包含重定向地址的响应信息后会自动重新提交请求,Servlet引擎创建Servlet2实例同时创建新的request和response对象,然后调用Servlet2的service()函数响应用户请求,新的Servlet引擎执行service方法的工作原理如图13所示。
■ 图13 重定向工作原理3
service方法读取请求信息,写入响应信息,执行完毕之后返回,由服务器将结果发送至浏览器。
03、请求转发和重定向
实现请求转发的方式:
(1)得到RequestDispatcher对象:RequestDispatcher dispatcher=
request.getRequestDispatcher("a.jsp");
(2)转发 dispatcher.forward (request,response);
实现重定向的方式:
重定向response.sendRedirect("a.jsp");
RequestDispatcher.forward方法只能在同一个Web应用程序内的资源之间转发请求。
sendRedirect方法还可以重定向到同一个站点上的其他应用程序中的资源,甚至是使用绝对URL重定向到其他站点的资源。
案例1: 中用判断三角形的三边是否满足构成三角形的条件来实现请求转发和重定向,通过Example1_b_triangle_judge.jsp页面输入三角形的三标,然后提交到相应的Servlet进行处理和逻辑的判断,在Servlet代码中获取来自JSP页面的三边数据信息,若三边不构成三角形或者输入的三边均小于0则会重定向到初始页面,即Example1_b_triangle_judge.jsp页面重新输入数据信息,若三边满足构成三角形的条件则会转发到Example1_c_triangle_judge_show.jsp页面,并在该页面中输出三边的边长和面积。
注意:
web.xml<servlet>
<servlet-name>triangleServlet</servlet-name>
<servlet-class>com.programs.Example1_a_triangleServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>triangleServlet</servlet-name>
<url-pattern>/triangle_judge</url-pattern>
</servlet-mapping>Example1_a_triangleServlet.java
JSP页面提交的目的地址对应的Servlet需要与Web.xml文件中的<url-pattern>相对应,而不是<servlet-name>对应。
@WebServlet(name = "triangleServlet")
public class Example1_a_triangleServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String sidea = request.getParameter("sidea");String sideb = request.getParameter("sideb");String sidec = request.getParameter("sidec");int sideA = Integer.parseInt(sidea);int sideB = Integer.parseInt(sideb);int sideC = Integer.parseInt(sidec);if (sideA < 0 || sideB < 0 || sideC < 0 ||(sideA + sideB <= sideC || sideB + sideC <= sideA || sideA + sideC <= sideB)) {response.sendRedirect("Example1_b_triangle_judge.jsp");} else {RequestDispatcher dispatcher = request.getRequestDispatcher("Example1_c_triangle_judge_show.jsp");dispatcher.forward(request, response);//请求转发}}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request,response);}
}Example1_b_triangle_judge.jsp<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>三角形判断</title>
</head>
<body>
<form action="triangle_judge">
<p>使用三角形案例实现转发和重定向</p>
<b>输入边长a:</b><input type="text" name="sidea"><br>
<b>输入边长b:</b><input type="text" name="sideb"><br>
<b>输入边长c:</b><input type="text" name="sidec"><br>
<input type="submit" value="提交">
</form>
</body>
</html>Example1_c_triangle_judge_show.jsp<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>符合三角形</title>
</head>
<body>
<h3>这是请求转发得到的界面</h3>
<p>输入的三角形三边满足构成三角形的条件</p>
<%String sidea = request.getParameter("sidea");String sideb = request.getParameter("sideb");String sidec = request.getParameter("sidec");
%>
<p>三边分别为:<%= sidea%>、<%= sideb%>、<%= sidec%>
</p>
<%int sideA = Integer.parseInt(sidea);int sideB = Integer.parseInt(sideb);int sideC = Integer.parseInt(sidec);double p = (sideA + sideB + sideC) / 2.0;double area = Math.sqrt(p * (p - sideA) * (p - sideB) * (p - sideC));
%>
其面积为<%= area%>
</body>
</html>
请求转发和重定向的案例页面显示如图14、15、16、17所示,当输入的三边满足构成三角形条件时,转发到显示页面并输出三角形各边信息和三角形的面积,若不满足构成三角形条件时,则重定向到初始页面中。
■ 图14 请求转发和重定向案例6_6初始化页面显示
■ 图15 请求转发和重定向案例6_6提交页面显示
■ 图16 请求转发和重定向案例6_6转发页面显示
■ 图17 请求转发和重定向案例6_6重定向页面显示
04、重定向与转发区别
第一:资源使用范围不一样。请求转发的转发对象只能是当前Web应用程序的服务器中的资源;重定向不仅可以在同一服务器中使用,还可以将请求重定向到其他Web服务器;
第二:请求响应的次数不一样,请求转发只需要一次请求与响应过程,重定向需要两次请求与响应过程;
第三:请求转发的URL地址栏是不变,因为只有一次请求与响应,重定向会改变地址栏,因为有两次请求与响应过程;
第四:请求转发的两个Servlet实例共用请求响应对象,重定向需要创建两次请求与响应对象。
相关文章:

Java高手速成 | 图说重定向与转发
我们先回顾一下Servlet的工作原理,Servlet的工作原理跟小猪同学食堂就餐的过程很类似。小猪同学点了烤鸡腿(要奥尔良风味的),食堂窗口的服务员记下了菜单,想了想后厨的所有厨师,然后将菜单和餐盘交给专门制…...
Git:不小心在主分支master上进行修改,怎么才能将修改的数据保存到正确的分支中
1.如果还没有push commit 代码第一步:将所修改的代码提交到暂存区git stash第二步:切换到正确的分支git checkout 分支名第三步:从暂存区中取出保存到正确的分支中git stash pop第四步:重新提交git push origin 分支名2.如果已经p…...

都2023年了,如果不会Stream流、函数式编程?你确定能看懂公司代码?
👳我亲爱的各位大佬们好😘😘😘 ♨️本篇文章记录的为 Stream流、函数式编程 相关内容,适合在学Java的小白,帮助新手快速上手,也适合复习中,面试中的大佬🙉🙉🙉。 ♨️如果…...

亚马逊云科技汽车行业解决方案
当今,随着万物智联、云计算等领域的高速发展,创新智能网联汽车和车路协同技术正在成为车企加速发展的关键途径,推动着汽车产品从出行代步工具向着“超级智能移动终端”快速转变。 挑战无处不在,如何抢先预判? 随着近…...

为什么学了模数电还是看不懂较复杂的电路图
看懂电路并不难。 (1) 首先要摆正心态,不要看到错综复杂的电路图就一脸懵逼,不知所错。你要明白,再复杂的电路也是由一个个的基本电路拼装出来的。 (2) 基础知识当然是少不了的,常用的基本电路结构搞搞清楚。 (3) 分析电路之前先要…...

帮公司面试了一个30岁培训班出来的程序员,没啥工作经验...
首先,我说一句:培训出来的,优秀学员大有人在,我不希望因为带着培训的标签而无法达到用人单位和候选人的双向匹配,是非常遗憾的事情。 最近,在网上看到这样一个留言,引发了程序员这个圈子不少的…...

勒索软件、网络钓鱼、零信任和网络安全的新常态
当疫情来袭时,网络罪犯看到了他们的机会。随着公司办公、政府机构、学校和大学从以往的工作模式转向远程线上办公模式,甚至许多医疗保健设施都转向线上,这种快速的过渡性质导致了不可避免的网络安全漏洞。消费者宽带和个人设备破坏了企业安全…...
python3 字符串拼接与抽取
我们经常会有对字符串进行拼接和抽取的需求,下面有几个例子可以作为参考。 需求1:取出ip地址的网络地址与网络掩码进行拼接,分别使用shell脚本和python3实现 # echo "192.168.0.1"|awk -F. {print $1"."$2"."…...
Linux就该这么学:存储结构与管理硬盘
Linux系统中常见的目录名称以及相应内容 目录名称应放置文件的内容/boot开机所需文件—内核、开机菜单以及所需配置文件等/dev以文件形式存放任何设备与接口/etc配置文件/home用户主目录/bin存放单用户模式下还可以操作的命令/lib开机时用到的函数库,以及/bin与/sbin下面的命令…...
JSP四大作用域,九大内置对象
面试题:JSP和Servlet的区别?JSP的本质就是servleJSP更加侧重于视图的展示,servlet更注重逻辑的处理。面试题:include指令和jsp:include标签的区别?从效果上来说,没区别。include指令是把两个页面合成一个js…...

机器学习笔记之生成模型综述(五)重参数化技巧(随机反向传播)
机器学习笔记之生成模型综述——重参数化技巧[随机反向传播]引言回顾神经网络的执行过程变分推断——重参数化技巧重参数化技巧(随机反向传播)介绍示例描述——联合概率分布示例描述——条件概率分布总结引言 本节将系统介绍重参数化技巧。 回顾 神经网络的执行过程 上一节…...

1、创建第一个Android项目
1.1、创建Android工程项目:双击打开Android Studio。在菜单栏File中new-->new project3、在界面中选择Empty Activity,然后选择next4、在下面界面中修改工程名称,工程保存路径选择java语言,然后点击finishAndroid studio自动为…...

【python百炼成魔】手把手带你学会python数据类型
文章目录前言一. python的基本数据类型1.1 如何查看数据类型1.2 数值数据类型1.2.1 整数类型1.2.2 浮点数类型1.2.3 bool 布尔数值类型1.2.4 字符串类型二. 数据类型强制转换2.1 强制转换为字符串类型2.2 强制转换为int类型2.3 强制转换函数之float() 函数三. 拓展几个运算函数…...

数据储存以及大小端判断
目录 数据存储 1,二进制存储方式(补码,反码,源码) 2,指针类型 3,大端,小段判断 1,二进制存储方式(补码,反码,源码) 我…...
GRASP设计原则
GRASP设计原则介绍9种基本原则创建者 Creator问题解决方法何时不使用?好处信息专家 Information Expert问题解决方法信息怎么做优点低耦合 Low Coupling耦合问题解决方法原则何时不使用?控制器 Controller问题解决方法外观控制器会话控制器优点臃肿控制器的解决方法高内聚 Hi…...
再遇周杰伦隐私协议
本隐私信息保护政策版本:2021 V1 一、重要提示 请您(以下亦称“用户”)在使用本平台App时仔细阅读本协议之全部条款,并确认您已完全理解本协议之规定,尤其是涉及您的重大权益及义务的加粗或划线条款。如您对协议有任…...

关于项目上的一些小操作记录
一 如何在项目的readme.md文件中插入图片说明 1 准备一张图片命名为test.png 2 在maven项目的resources目录下新建文件夹picture,将图片放入该目录下 3 在readme.md文件中期望插入图片的地方编辑如下:  此时&#…...
sql查询不以某些指定字符开头(正则表达式)
我们用到的最多的是:查询以特定字符或字符串开头的记录 字符^用来匹配以特定字符或字符串开头的记录。 例 1 在 tb_students_info 表中,查询 name 字段以“J”开头的记录,SQL 语句和执行过程如下。 mysql> SELECT * FROM tb_students_…...

35.网络结构与模型压缩、加速-2
35.1 Depthwise separable convolution Depthwise separable convolution是由depthwise conv和pointwise conv构成depthwise conv(DW)有效减少参数数量并提升运算速度 但是由于每个feature map只被一个卷积核卷积,因此经过DW输出的feature map不能只包含输入特征图的全部信息,…...

FreeSWITCH跨NAT部署配置详解
本文仅讨论FreeSWITCH部署在NAT之后(里面)这种场景,假设私网地址与公网地址有一个确定的映射关系。这里只涉及mod_sofia(SIP信令及媒体)相关配置,其他模块不在本文讨论之列。配置mod_sofia默认提供两个prof…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...

19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...

dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...