JavaWeb小记——重定向和内部转发

目录

重定向

原理图

重定向语句

重定向特点

内部转发

原理图

请求转发特点 

路径的书写

请求域对象request

特点

请求转发特点

重定向特点


重定向

原理图

重定向语句

response.setStatus(302);
response.setHeader("location","http://www.baidu.com");
//以上两条等于下面一条

response.sendRedirect("http://www.baidu.com");

重定向特点

1.两次请求,两次响应。

当浏览器向服务器中aServlet发送请求时,aServlet说 我执行不了,让bServlet去做吧,然后aServlet向浏览器响应302重定向状态码,再设置一个bServlet路径的响应头。浏览器再将请求发往bServlet,bServlet执行后再响应给浏览器。所以是两次请求,两次响应。

2.发送请求后,地址栏会发生变化。

比如下面一段代码

package org.xingyun.demo;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(name = "Servletdemo2",value = "/demo2")
public class Servletdemo2 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.sendRedirect("http://www.baidu.com");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

请求后:

 3.可以访问外部站点资源,也可以访问内部的资源。

外部资源:

例如第二点,进入百度

内部资源:

response.sendRedirect("/MyServlet20230624_war_exploded/my.jsp");

4.无法访问WEB-INF下的资源

response.sendRedirect("/MyServlet20230624_war_exploded/WEB-INF/webINF.jsp");

5.访问内部站点资源时,需写上项目的上下文路径。

内部转发

原理图

简单案例:

package org.xingyun.demo2;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(name = "ServletDemo6",value = "/demo6")
public class ServletDemo6 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("demo6收到请求了");
        request.getRequestDispatcher("/demo7").forward(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}






package org.xingyun.demo2;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(name = "ServletDemo7",value = "/demo7")
public class ServletDemo7 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("demo7收到请求了");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

运行结果:

请求转发特点 

1.一次请求,一次响应

在内部进行转发

2.地址栏不会发生变化

 

3.只能请求内部站点的资源 

 4.可以访问WEB-INF下的资源

5. 不用写项目的上下文路径

路径的书写

路径的书写: 
        建议以/开头
        服务器内部跳转路径 不需要加项目上下文路径  request.getRequestDispatcher("/myservlet2").forward(request, response);
    
        页面上的路径和重定向 需要加上项目的上下文路径
        <img src="/MyServlet/mydemo4" id="img1"></img>
        

        一般来说我们写相对路径

请求域对象request

特点

只能在一次请求和一次响应之间共享数据,一次请求响应后自动销毁。

请求转发特点

例:

我们先在demo6中用请求域对象存一个数据,用内部转发的方式转发到demo7,在demo7中取数据,看能否取到。

//demo6
@WebServlet(name = "ServletDemo6",value = "/demo6")
public class ServletDemo6 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("demo6收到请求了");
        int num = 100;
        request.setAttribute("num",num);
        request.getRequestDispatcher("/demo7").forward(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}



//demo7
@WebServlet(name = "ServletDemo7",value = "/demo7")
public class ServletDemo7 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("demo7收到请求了");
        Integer num = (Integer) request.getAttribute("num");
        System.out.println(num);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

运行结果:

可见,可以在demo7中取到数据,因为请求转发是一次请求,一次响应。

重定向特点

然后我们再使用重定向的方式转发,看能否取到

可见,取不到数据了,因为重定向是两次请求,两次响应。

用ServletContext全局域对象都可以取到数据,因为它范围最大。

什么时候用重定向,什么时候用内部转发
        如果,你要跳到外部站点,只能用重定向。
        如果,你要访问WEB-INF下的资源,只能用内部转发。
        如果,你把数据存到了 request 请求域中,你还要共享数据,你要用内部转发。
        如果我要重定向,跳转资源,还想要在跳转的资源间共享数据,那我们可以 Session或者ServletContext 全局域对象

补充知识

//request中的get方法


request.getAttribute()               //获得setAtrribute的数据
request.getAttributeNames()           //返回所有可用属性名的枚举
request.getAuthType()               //返回用于保护servlet的验证方法名称
request.getCharacterEncoding()        //返回字符编码方式
request.getClass()                   //返回一个类
request.getContentLength()            //返回请求体的长度(以字节数)
request.getContentType()              //得到请求体的MIME类型
request.getContextPath()               //获取当前系统的路径 获得应用名称
request.getCookies()                  //返回此次请求发送的Cookie对象
request.getDateHeader()               //用于将指定头信息的部分转换成方便转换为时间类型的长整数型
request.getHeader()                   //获取客户端的浏览器类型。
request.getHeaderNames()           //返回请求头包含的所有头名称的枚举。
request.getHeaders()               //获取一个name的多个值序列,返回请求给出的指定类型的所有HTTP头标的名称的枚举值
request.getInputStream()              //得到请求体中一行的二进制流
request.getIntHeader()                //以int的形式返回指定请求头的值。
request.getLocalAddr()                 //接收请求的接口的 InternetProtocol (IP) 地址

request.getLocale()                     //基于 Accept-Language 头,返回客户端将用来接受内容的首选 Locale 客户端语言环境

request.getLocales()                    //所有的语言环境
request.getLocalName()                  //接收请求的 Internet Protocol(IP) 接口的主机名

request.getLocalPort()                  //接收请求的接口的 InternetProtocol (IP) 端口号

request.getMethod()                     //请求方式
request.getParameter()                   //获得表单提交的数据
request.getParameterMap()                //返回类型是String[]
request.getParameterNames()              //将发送请求页面中form表单里所有具有name属性的表单对象获取(包括button).返回一个Enumeration类型的枚举
request.getParameterValues()             //将获取所有form表单中name属性为"name"的值.该方法返回一个数组.遍历数组就可得到value值
request.getPathInfo()                   //返回与客户端发出此请求时发送的URL相关联的额外路径信息。

request.getPathTranslated()           //映射到服务器实际路径之后的路径信息
request.getProtocol()                   //返回请求用的协议类型及版本号获取客户端向服务器端传送数据所依据的协议名称。
request.getQueryString()                //字符串形式的附加到URL后面的查询字符串,数据仍旧是URL编码的
request.getReader()                      //返回解码过了的请求体
request.getRealPath()                    //返回一虚拟路径的真实路径
request.getRemoteAddr()                  //返回发送此请求的客户端IP地址
request.getRemoteHost()                    //返回发送此请求的客户端主机名   获取客户端的名字
request.getRemotePort()                      //发送请求的客户主机端口
request.getRemoteUser()                   //返回包含在请求RUL中路径后面的查询字符串。如果没有查询字符串返回null
       
request.getRequestDispatcher()            //请求转发,获取请求过来的地址,与该地址共享一个Request

request.getRequestedSessionId()             //返回客户端制定的回话ID
request.getRequestURI()                    //请求的资源
request.getRequestURL()             //获取URL,包含域名,不包含请求内容

request.getScheme()                    // 返回请求用的计划名,  返回当前链接使用的协议 如:http.https及ftp等
request.getServerName()                //返回接受请求的服务器主机名获取服务器的名字。
request.getServerPort()                //返回服务器接受此请求所用的端口号 
request.getServletPath()                //返回请求调用servlet的URL部分
request.getSession()                    //返回与此请求关联的当前HttpSession,如果没有当前会话并且参数为true,则返回一个新会话
    
request.getUserPrincipal()            // 返回包含当前已经过验证的用户的名称的java.security.Principal对象。如果用户没有经过验证,则该方法返回null

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

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

相关文章

MS1826 HDMI 多功能视频处理器 4*4矩阵切换器

基本介绍 MS1826 是一款多功能视频处理器&#xff0c;包含 4 路独立 HDMI 音视频输入通道、4 路独立 HDMI 音视频输出通道以及四路独立可配置为输入或者输出的 SPDIF、I2S 音频信号。支持 4 个独立的字 库定制型 OSD&#xff1b;可处理隔行和逐行视频或者图形输入信号&#xff…

【计算机网络】网络安全,HTTP协议,同源策略,cors,jsonp

❤️ Author&#xff1a; 老九 ☕️ 个人博客&#xff1a;老九的CSDN博客 &#x1f64f; 个人名言&#xff1a;不可控之事 乐观面对 &#x1f60d; 系列专栏&#xff1a; 文章目录 网络安全非对称加密中间人攻击XSSSQL注入CSRF HTTP协议同源策略corsjsonp 网络安全 非对称加密…

推荐好用的AI工具集

AI技术未来已来&#xff0c;我们要拥抱变化 &#xff0c;笔记试用好用AI工具&#xff0c;也在代码中试用chatGPT 一、工具集 解决任何问题&#xff1a;ChatGPT 写文案&#xff1a;Jasper Al 、Copysmith 生成真人视频&#xff1a;Synthesia、 CogView2 AI AI 解决法律问题…

MySQL面试题--索引概念以及底层

目录 概述 索引的底层数据结构 二叉树 B树 B树 B树与B树对比: 面试回答 大纲 回答 概述 索引&#xff08;index&#xff09;是帮助MySQL高效获取数据的数据结构(有序)。 在数据之外&#xff0c;数据库系统还维护着满足特定查找算法的数据结构&#xff08;B树&#xff0…

springboot 国家公务员招聘网站-计算机毕设 附源码80528

springboot 国家公务员招聘网站 目 录 摘要 1 绪论 1.1研究背景与意义 1.2开发现状 1.3系统开发技术的特色 1.4springboot框架介绍 1.5论文结构与章节安排 2 2国家公务员招聘网站系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1数据增加流程 2.3.2数据修改流程 2.…

【Solr】体验极速安装solr

目录 前言 安装下载- 方式一&#xff1a;官网下载- 方式二&#xff1a;仓库下载 启动方式 快速使用 关于查询 前言 solr是基于java开发的&#xff0c;所以solr需要用到jdk环境,并且solr需要在tomcat容器中才能运行,所以需要提前配置好jdk和tomcat环境。 安装下载 需要注意的…

springboot集成mybatisPlus

1、添加依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-jav…

【操作系统笔记】南京大学jyy老师

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了操作系统学习&#xff0c;整理期间苛求每个知识点&#xff0c;平衡理解简易度与深入程度。 &#x1f970;来源&#xff1a;材料主要源于南京大学操作系统jyy老师课程进行的&#xff0c;每个知识点的修正…

如何使用Wu10Man启用或禁用自动更新

使用Wu10Man启用或禁用自动更新 启用自动更新禁用自动更新Windows 10 将在你设置为自动维护时自动检查新的 Windows 更新。默认情况下,Windows 10 将自动下载并安装重要和关键更新。 某些更新不是自动安装的。这包括可选更新和要求你接受新使用条款的更新。当这些更新可用时,…

基于卷积神经网络的高光谱图像分类

文章目录 引言1. 基于光谱特征2. 基于空间特征3. 基于空谱特征3.1 空间特征和光谱特征的融合3.2 基于3D-CNN分类 4. 总结 引言 近年来深度学习的技术在计算机视觉领域中大放异彩&#xff0c;使得对多光谱数据分类的研究迅速发展&#xff0c;结合2D-CNN&#xff0c;3D-CNN&…

让性能腾飞!亚马逊云科技的 Java 云端之旅

在上篇文章中&#xff0c;我们为大家介绍了亚马逊的 Java 生态及丰富的开发工具、框架。本文将分享亚马逊的 Java 架构、迁移途径&#xff0c;并分享一个具体实例&#xff0c;介绍如何使用机器学习来构建 Java 应用和提升 Java 性能。 亚马逊云科技开发者社区为开发者们提供全…

怎么高效的通过爬虫获取数据

导语&#xff1a;在当今数字化时代中&#xff0c;获取数据已成为许多企业和个人的重要需求。在快速获取数据时&#xff0c;通过爬虫技术迅速获取网络数据已成为一项重要的技能和技术。然而&#xff0c;在应用爬虫技术前&#xff0c;需要注意一些重要的问题。本文总结了从数据来…

leetcode1.两数之和

个人主页&#xff1a;平行线也会相交 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【LeetCode】 &#x1f353;希望我们一起努力、成长&#xff0c;共同进步。 题目链接 给定一个整数数组 nums 和一个整数目标值 target&am…

读写锁原理解读

目录 回顾什么是读写锁 t1 w.lock&#xff0c;t2 r.lock t3 r.lock&#xff0c;t4 w.lock t1 w.unlock t2 r.unlock&#xff0c;t3 r.unlock 写锁上锁流程 写锁释放流程 读锁上锁流程 读锁释放流程 回顾什么是读写锁 读写锁是一对互斥锁&#xff0c;分为读锁和写锁。…

《kafka 核心技术与实战》课程学习笔记(八)

无消息丢失配置怎么实现&#xff1f; Kafka 只对“已提交”的消息&#xff08;committed message&#xff09;做有限度的持久化保证。 第一个核心要素是“已提交的消息”。 当 Kafka 的若干个 Broker 成功地接收到一条消息并写入到日志文件后&#xff0c;它们会告诉生产者程序…

知识图谱项目——红色文化之张学良人物知识图谱(Neo4j+vue+flask+mysql实现)

张学良人物简史知识图谱_说明文档 本项目为人工智能专业大三知识图谱课程期末作业。意在完成一个以张学良为背景的红色文化类知识图谱。文末放上本项目的代码地址。 文章目录 张学良人物简史知识图谱_说明文档:rocket:前端:rocket:后端:rocket:中间件:rocket:数据库:rocket:服…

Linux常用命令——free命令

在线Linux命令查询工具 free 显示内存的使用情况 补充说明 free命令可以显示当前系统未使用的和已使用的内存数目&#xff0c;还可以显示被内核使用的内存缓冲区。 语法 free(选项)选项 -b # 以Byte为单位显示内存使用情况&#xff1b; -k # 以KB为单位显示内存使用情况…

【云原生】二进制部署k8s集群(中)搭建node节点

连接上文 在上文已经成功部署了etcd分布式数据库、master01节点&#xff0c; 本文将承接上文的内容&#xff0c;继续部署Kubernetes集群中的 worker node 节点和 CNI 网络插件 1. 部署 Worker Node 组件 1.1 work node 组件部署前需了解的节点注册机制 kubelet 采用 TLS Bo…

设计模式-05.01-行为型-观察者模板

观察者模式【常用】 我们常把 23 种经典的设计模式分为三类&#xff1a;创建型、结构型、行为型。前面我们已经学习了创建型和结构型&#xff0c;从今天起&#xff0c;我们开始学习行为型设计模式。我们知道&#xff0c;创建型设计模式主要解决“对象的创建”问题&#xff0c;…

JavaWeb之tomcarHTTP

1 DOM4j Xml解析 1.1 JAXP  JDK内置&#xff0c;不需要导入第三方jar包&#xff0c;简单工具优先选择。  支持两种解析方式&#xff1a;DOM、SAX 1.1.1 JAXP—DOM 加载xml 生成一个DOM树。获得整个文档的描述对象Document 解析 api 获得工厂 DocumentBuilderFactory –》 …