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…...

【精选论文 | Capon算法与MUSIC算法性能的比较与分析】
本文编辑:调皮哥的小助理 【正文】 首先说结论: 当信噪比(SNR)足够大时,Capon算法和MUSIC算法的空间谱非常相似,因此在SNR比较大时它们的性能几乎一样,当不同信号源的入射角度比较接近时&…...

卫星、无人机平台的多光谱数据在地质、土壤调查和农业等需要用什么?
近年来,Python编程语言受到越来越多科研人员的喜爱,在多个编程语言排行榜中持续夺冠。同时,伴随着深度学习的快速发展,人工智能技术在各个领域中的应用越来越广泛。机器学习是人工智能的基础,因此,掌握常用…...

30个题型+代码(冲刺2023蓝桥杯)
愿意的可以跟我一起刷,每个类型做1~5题 ,4月前还可以回来系统复习 2月13日 ~ 3月28日,一共32天 一个月时间,0基础省三 --> 省二;基础好点的,省二 --> 省一 目录 🌼前言 🌼…...

快速且有效减小代码包的方法
前言当我们在发布一些APP或者小程序等比较小的程序时候,常常会对其主包大小进行一定的规定,若超过推荐的主包大小则性能会被大大影响,或者再严重一点就不给你过审。如微信小程序中也对主包有一定的大小要求。对此一些比较复杂的小程序就需要考…...

基于matlab评估星载合成孔径雷达性能
一、前言本示例展示了如何评估星载合成孔径雷达 (SAR) 的性能,并将理论极限与 SAR 系统的可实现要求进行比较。SAR利用雷达天线在目标区域上的运动来提供更精细的方位角分辨率。给定雷达的主要参数(例如工作频率、天线尺寸和带宽&…...

Linux_基本指令
新的专栏Linux入门来啦!欢迎各位大佬补充指正!! Linux_基本指令导入文件绝对路径与相对路径隐藏的文件指令ls查看stat查看文件属性cd进入路径mkdir创建目录touch创建文件rm删除man查询手册cp复制mv移动cat查看文件morelessheadtail时间相关的…...

Keras深度学习实战——使用深度Q学习进行SpaceInvaders游戏
Keras深度学习实战——使用深度Q学习进行SpaceInvaders游戏 0. 前言1. 问题与模型分析2. 使用深度 Q 学习进行 SpaceInvaders 游戏相关链接0. 前言 在《深度Q学习算法详解》一节中,我们使用了深度 Q 学习来进行 Cart-Pole 游戏。在本节中,我们将利用深度Q学习来玩“太空侵略…...

从事架构师岗位快2年了,聊一聊我对架构的一些感受和看法
从事架构师岗位快2年了,聊一聊我和ChatGPT对架构的一些感受和看法 职位不分高低,但求每天都能有新的进步,永远向着更高的目标前进。 文章目录踏上新的征程架构是什么?架构师到底是干什么的?你的终极目标又是什么&#…...

零基础机器学习做游戏辅助第十二课--原神自动钓鱼(二)
一、模拟训练环境 上节课我们已经能够判断人物的钓鱼状态,接下来我们就需要对鱼儿上钩后的那个受力框进行DQN训练。 方案有两个: 使用卷积神经网络直接输入图像对网络进行训练。使用普通网络,自己写代码模拟出图像中三个点的动态并把值给神经网络进行训练。这里我们选用第二…...

MapReduce paper(2004)-阅读笔记
文章目录前言摘要(Abstract)一、引言( Introduction)二、编程模型(Programming Model)三、实现(Implementation)3.1、执行概述(Execution Overview)3.2、主节点数据结构(Master Data…...