Java高手速成 | 图说重定向与转发

news2024/11/24 13:23:23

 我们先回顾一下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 {
    @Override
    protected 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);//请求转发
        }
    }

    @Override
    protected 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实例共用请求响应对象,重定向需要创建两次请求与响应对象。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RabbitMQ运行机制

消息的TTL&#xff08;Time To Live&#xff09; 消息的TTL就是消息的存活时间。 • RabbitMQ可以对队列和消息分别设置TTL。 • 对队列设置就是队列没有消费者连着的保留时间&#xff0c;也可以对每一个单独的消息做单独的 设置。超过了这个时间&#xff0c;我们认为这个消息…

什么是溶血症?什么是ABO溶血?溶血检查些什么?

什么是溶血症&#xff0c;什么是ABO溶血&#xff1f;女人是O型血&#xff0c;男人是其他血型的夫妻配对&#xff0c;最担心的是胎儿溶血症。从理论上讲&#xff0c;只要夫妻双方血型不同&#xff0c;母亲一定缺乏胎儿从父亲那里遗传的抗原。当任何人接触到他们缺乏的抗原时&…

Vue+node.js火车票订票系统vscode开发的

该系统的基本功能包括管理员、用户二个角色功能模块。 对于管理员可以使用的功能模块主要有&#xff0c;首页、个人中心&#xff0c;用户管理、系统公告管理、车次管理、车票信息管理、订票信息管理、系统管理等功能。 对于用户所使用的功能模块的操作主要是首页、个人中心、订…

【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() 函数三. 拓展几个运算函数…

2023年华为HCIA-Datacom认证视频课

一、下载地址&#xff1a;https://edu.csdn.net/learn/38282/607342?spm1003.2001.3001.4157 一、课程大纲 2023年华为考试大纲 考试分数章目录小节80第1章&#xff1a;网络参考模型1.1OSI网络参考模型介绍1.2OSI网络参考模型各层的作用1.3 OSI与TCP/IP模型的比较1.4 TCP与U…

【转载】通过HAL库实现MODBUS从机程序编写与调试-----STM32CubeMX操作篇

通过HAL库实现MODBUS从机程序编写与调试-----STM32CubeMX操作篇[【STM32】RS485 Modbus协议 采集传感器数据](https://blog.csdn.net/qq_33033059/article/details/106935583)基于STM32的ModbusRtu通信--ModbusRtu协议(一)基于STM32的ModbusRtu通信--终极Demo设计(二)STM32RS48…

TensorRT的C++接口解析

TensorRT的C接口解析 文章目录TensorRT的C接口解析3.1. The Build Phase3.1.1. Creating a Network Definition3.1.2. Importing a Model using the ONNX Parser3.1.3. Building an Engine注意&#xff1a;序列化引擎不能跨平台或 TensorRT 版本移植。引擎特定于它们构建的确切…

“黑铁时代”,地产人如何以客户视角加速房企数字化转型

本文从行业洞察、业务设计、数据建设以及实践探索四个部分详细阐述地产行业数字化的实践、思考和理解。点击文末“阅读原文”&#xff0c;观看完整版直播回放并下载演讲文档。一、洞察&#xff1a;房企经营思路的变化企业的转型都是围绕着业务经营变化进行的&#xff0c;房企数…

P1307 [NOIP2011 普及组] 数字反转

[NOIP2011 普及组] 数字反转 题目描述 给定一个整数 NNN&#xff0c;请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式&#xff0c;即除非给定的原数为零&#xff0c;否则反转后得到的新数的最高位数字不应为零&#xff08;参见样例 2&#xff09;。 输入…

电源口防雷器电路设计方案

电源口防雷电路的设计需要注意的因素较多&#xff0c;有如下几方面&#xff1a;1、防雷电路的设计应满足规定的防护等级要求&#xff0c;且防雷电路的残压水平应能够保护后级电路免受损坏。2、在遇到雷电暂态过电压作用时&#xff0c;保护装置应具有足够快的动作响应速度&#…

Git:单台电脑同时配置多个git账号

问题说明 现在云端仓库很多&#xff0c;有开源中国的 gitee.com 、微软的 github.com 、还有 gitlab.com 和 bitbucket.org 等等&#xff0c;当我们想同一台电脑链接多个云端仓库时&#xff0c;就需要设置不同的用户、邮箱生成不同的密钥进行链接。 解决方案 下载安装Git 我的…

【Java】容器+数组+集合

一、数组 Java语言中的数组是一种引用数据类型&#xff1b;不属于基本数据类型数组当中既可以存储“基本数据类型”的数据&#xff0c;也可以存储“引用数据类型”的数据&#xff08;数组既可以存储基本数据类型&#xff0c;又可以存储引用数据类型&#xff0c;基本数据类型存…

gdb调试功能从零到会(Linux详解)

目录 &#x1f440; 1.安装gdb &#x1f440;2.判断是否安装成功 &#x1f440;3.改成debug方式发布。 &#x1f440; 4.gdb功能简介 前言 gdb是Linux 下功能全面的调试工具。gdb支持断点、单步执行、打印变量、观察变量、查看寄存器、查看堆栈等调试手段。在Linux环境软件…

18- Adaboost梯度提升树 (集成算法) (算法)

Adaboost 梯度提升树: from sklearn.ensemble import AdaBoostClassifier model AdaBoostClassifier(n_estimators500) model.fit(X_train,y_train) 1、Adaboost算法介绍 1.1、算法引出 AI 39年&#xff08;公元1995年&#xff09;&#xff0c;扁鹊成立了一家专治某疑难杂症…

ubuntu18.04 天选2 R95900hx 3060显卡驱动安装

天选2 R95900hx 3060显卡驱动安装需求问题解决内核集显显卡驱动需求 外接显示器&#xff0c;安装nvidia驱动 问题 由于一开始直接在软件和更新中附加读懂安装了nvidia-470&#xff0c;导致系统黑屏。 解决 grub页面系统选择进入ubuntu recovery模式&#xff0c;选择root&a…

ChatGPT模型采样算法详解

ChatGPT模型采样算法详解 GPT&#xff08;Generative Pre-trained Transformer&#xff09;模型有几个参数&#xff0c;理解它们对文本生成任务至关重要。其中最重要的一组参数是temperature和top_p。二者控制两种不同的采样技术&#xff0c;用于因果语言模型&#xff08;Cau…

BCMA靶点药物销售市场-上市药品前景分析

在之前的二十多年里&#xff0c;治疗多发性骨髓瘤(MM)的药物选择发生了重大转变&#xff0c;无论是新诊断还是复发/难治期。新药类别的引入&#xff0c;如蛋白酶体抑制剂、免疫调节剂、抗CD38和抗SLAMF7单克隆抗体&#xff0c;加上自体干细胞移植&#xff0c;使该疾病的五年生存…

Android无菜单键,如何触发onCreateOptionsMenu(Menu menu)

文章目录小结问题及解决无法触发onCreateOptionsMenu(Menu menu)修改配置文件解决使用一个按钮来触发其它办法参考小结 现在的Android有三个键&#xff1a; 任务键&#xff0c;Home键&#xff0c;返回键&#xff0c;也就是没有菜单键了&#xff0c;那么如何如何触发onCreateOp…

TensorRT的功能

TensorRT的功能 文章目录TensorRT的功能2.1. C and Python APIs2.2. The Programming Model2.2.2. The Runtime Phase2.3. Plugins2.4. Types and Precision2.5. Quantization2.6. Tensors and Data Formats2.7. Dynamic Shapes2.8. DLA2.9. Updating Weights2.10. trtexec本章…

狂神 VUE笔记

文章目录0 VUE相关了解0.1 概述0.2 MVVM0.3 JavaScript框架0.4 [Vue](https://so.csdn.net/so/search?qVue&spm1001.2101.3001.7020)的七大属性1 VUE基础1.0 第一个vue代码&#xff1a;Hello&#xff0c;vue1.1 v-bind1.2 v-if &#xff0c; v-else &#xff0c; v-else-i…