重定向和转发(sendRedirect()和getRequestDispatcher())

重定向

  • 是什么

用户通过浏览器发送一个请求,Tomcat服务器接收这个请求,会给浏览器发送一个状态码302,并设置一个重定向的路径,浏览器如果接收到了这个302的状态码以后,就会去自动加载服务器设置的路径

一个页面跳转到另外一个页面(应用场景)、登录页面跳转到主页面: login.jsp====>LoginServlet====>main.jsp

  • 特征:

①重定向的过程是浏览器(客户端)的行为 ②实际上浏览器做了2次请求(当点击登录按钮的时候做了两次请求)(分别是请求login和main.jsp) ③注意上一次请求的request对象会丢失 ④重定向有一个非常明显的特征,即浏览器的url变化

实例

编辑login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--请求RedirectServlet--%>
<form action="redirect" method="post">
    <input type="text" name="username"/><br>
    <input type="text" name="password"/><br>
    <input type="submit" value="提交">
</form>
</body>
</html>

RedirectServlet类

public class RedirectServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置request的编码格式
        req.setCharacterEncoding("UTF-8");

        //前端提交的所有参数都会保存到HttpServletRequest中,可以通过input标签的name属性获取参数
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        System.out.println("username:"+ username +" password:"+ password);


        //往request中添加属性:request继承了map
        req.setAttribute("username", username);
        req.setAttribute("password", password);

        /**
         * 重定向
         *      本质:302   main.jsp
         *      特点:览器发送两次请求的行为,url会变,会创建新的request对象
         */
        resp.sendRedirect("main.jsp");
        //main.jsp页面中可以取username和password参数吗?取不到,因为main.jsp是浏览器发送的第二次请求,该请求并未携带任何参数
        //main.jsp页面中可以取msg属性吗?取不到,,因为main.jsp是浏览器发送的第二次请求,该请求会创建新的request对象

web.xml

<servlet>
        <servlet-name>redirect</servlet-name>
        <servlet-class>com.by.servlet.RedirectServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>redirect</servlet-name>
        <url-pattern>/redirect</url-pattern>
    </servlet-mapping>

main.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
这是main页面<br>
<%--
<%=request.getAttribute("username")%>
<%=request.getAttribute("password")%>
--%>

${username}
${password}
</body>
</html>

测试结果:

重定向
         *      本质:302   main.jsp
         *      特点:览器发送两次请求的行为,url会变,会创建新的request对象

        main.jsp页面中可以取username和password参数吗?取不到,因为main.jsp是浏览器发送的第二次请求,该请求并未携带任何参数
        main.jsp页面中可以取msg属性吗?取不到,,因为main.jsp是浏览器发送的第二次请求,该请求会创建新的request对象

转发 

  • 是什么

用户发送数据请求到服务器,服务器接收当前请求,会调用内部方式(转发)处理该请求,最终把响应给客户端

  • 特征:

①转发是服务器的行为 ②浏览器在这个过程中只有一次行为 ③转发可以带有数据 request对象中 ④url不会发生任何的变化

实例

login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--请求ForwardServlet--%>
<form action="forward" method="post">
    <input type="text" name="username"/><br>
    <input type="text" name="password"/><br>
    <input type="submit" value="提交">
</form>
</body>
</html>

ForwardServlet

public class ForwardServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置request的编码格式
        req.setCharacterEncoding("UTF-8");

        //前端提交的所有参数都会保存到HttpServletRequest中,可以通过input标签的name属性获取参数
        String username = req.getParameter("username");
        String password = req.getParameter("password");

        //往request对象中添加属性
        req.setAttribute("username", username);
        req.setAttribute("password", password);
        //添加一个字符串
        req.setAttribute("msg","getRequestDispatcher");

        //转发:servlet内部行为(servlet1--->servlet2)
        req.getRequestDispatcher("main.jsp").forward(req, resp);//request没有变
    }
}

web.xml

<servlet>
        <servlet-name>forward</servlet-name>
        <servlet-class>com.by.servlet.ForwardServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>forward</servlet-name>
        <url-pattern>/forward</url-pattern>
    </servlet-mapping>

main.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
这是main页面<br>
${username}
${password}
</body>
</html>

测试

转发
        本质:servlet内部的行为(servlet1---->servlet2)
        特点:
            浏览器url不变
            还是原来的request对象,数据不丢失 

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

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

相关文章

在小公司 “混” 了2年,我只认真做了5件事,如今顺利拿到字节 Offer

说下我的情况 是的&#xff0c;我一家小公司工作了整整两年时间&#xff0c;在入职这家公司前&#xff0c;也就是两年前&#xff0c;我就开始规划了我自己的人生&#xff0c;所以在两年时间里&#xff0c;我并未懈怠。 现如今&#xff0c;我已经跳槽到了字节&#xff0c;顺利…

Typora使用PicGo+Gitee上传图片

Typora使用PicGoGitee上传图片 1.下载PicGo(国内镜像) https://mirrors.sdu.edu.cn/github-release/Molunerfinn_PicGo/ 点击PicGo-Setup-2.3.0-x64.exe &#xff08;64位安装&#xff09; 然后打开gitee&#xff08;没注册先注册&#xff09; 2.下载node.js插件 https:/…

mysql原理--连接查询的成本

1.准备工作 连接查询至少是要有两个表的&#xff0c;只有一个 single_table 表是不够的&#xff0c;所以为了故事的顺利发展&#xff0c;我们直接构造一个和 single_table 表一模一样的 single_table2 表。为了简便起见&#xff0c;我们把 single_table 表称为 s1 表&#xff0…

USB启动盘是什么?要如何制作USB启动盘?本文都告诉你

如何制作USB启动盘 USB启动盘怎么制作&#xff1f;下面我们一起来看一看。注意&#xff1a;在执行以下步骤之前&#xff0c;请确保您备份了重要数据&#xff0c;因为这个过程会格式化USB驱动器&#xff0c;清除其上的所有数据。1. 选择操作系统镜像 首先&#xff0c;您需要…

MYSQL数据库的备份与恢复-数据库实验七

一、实验目的 1. 了解备份和恢复的基本概念。 2. 掌握使用MySQL命令进行数据库备份的操作方法。 3. 掌握使用MySQL命令进行数据库恢复的操作方法。 二、实验内容 1. 使用mysqldump命令备份数据库studentsdb的所有表&#xff0c;存于D:\下&#xff0c;文件名为all_tables.s…

Unity 旋转跟随

Unity 使用任意一个局部轴指向目标 效果&#xff1a; 主要用于在编辑器中可视化对象的朝向&#xff0c;同时提供了选择不同轴向的功能。在运行时&#xff0c;物体将根据所选择的轴向朝向目标&#xff0c;并在 Scene 视图中绘制一个带箭头的圆环。 定义轴向枚举&#xff1a;…

Node.js版本对比

目录 1. node版本与Npm版本对照表 2. node版本与node-sass版本对照表 3. node-sass与sass-loader版本对照表 1. node版本与Npm版本对照表 以往的版本 | Node.js 下面显示最新的对应内容&#xff0c;如果需要查找历史版本&#xff0c;可以进入上面的页面查询 VersionLTSDateV8np…

【网络安全 | 网络协议】结合Wireshark讲解HTTP协议

前言 超文本传输协议&#xff08;Hypertext Transfer Protocol&#xff0c;HTTP&#xff09;是一个简单的请求-响应协议&#xff0c;它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。 文章目录 前言HTTP协议Wireshark抓包分析 HTTP协议在Wireshark数据包中是…

Ubuntu16.04下载安装藏文字体详细教程(附图)

Ubuntu16.04下安装藏文字体详细教程&#xff08;附图&#xff09; 你是不是也被ubuntu系统中藏文或者中文总是不显示且乱码的问题困扰呢&#xff0c;那么你可以看看我的解决方法。 在没有装藏文或中文字体前你在打开一个文本文件的时候是不是下面这样的 安装步骤 上传或下载若…

负载均衡——Ribbon

文章目录 Ribbon和Eureka配合使用项目引入RibbonRestTemplate添加LoadBalanced注解注意自定义均衡方式代码注册方式配置方式 Ribbon脱离Eureka使用 Ribbon&#xff0c;Nexflix发布的负载均衡器&#xff0c;有助于控制HTTP和TCP客户端的行为。基于某种负载均衡算法&#xff08;轮…

制作一个TikTok引流脚本需要懂哪些代码?

在数字营销领域&#xff0c;TikTok已经成为一个不可或缺的平台&#xff0c;许多品牌和商家都希望通过TikTok来吸引更多的潜在客户&#xff0c;提高品牌知名度和销售额。 为了实现这一目标&#xff0c;一些商家选择使用TikTok引流脚本&#xff0c;那么&#xff0c;制作一个TikT…

【三维重建】单目三维重建

[TOC]【三维重建】单目三维重建 1. 资料收集 基于marigold的深度恢复与三维重建 file link community repainting_3d_assets 2. 单目深度恢复 输入与效果恢复如下&#xff1a; 3. 单目三维重建 4. 纹理恢复方法&#xff08;这里是TEXT to 3D 的实现方法&#xff09; 输…

信号与线性系统翻转课堂笔记13——拉普拉斯(逆)变换及其性质

信号与线性系统翻转课堂笔记13——拉普拉斯&#xff08;逆&#xff09;变换及其性质 The Flipped Classroom13 of Signals and Linear Systems 对应教材&#xff1a;《信号与线性系统分析&#xff08;第五版&#xff09;》高等教育出版社&#xff0c;吴大正著 一、要点 &am…

CentOS7之开启ssh远程登录

参考&#xff1a;https://www.cnblogs.com/travis-li/p/12550370.html cd /etc/ssh/ # 修改配置 vim sshd_config# 开启服务 sudo service sshd start# 检查 ps -e | grep sshd# 开机自启 systemctl enable sshd.service# 查看(验证)开机自启服务 [rootlocalhost liangshijie]…

腾讯云优惠全站搜,你想要的优惠都在这!

腾讯云推出优惠全站搜页面 https://curl.qcloud.com/PPrF9NFe 在这个页面可以一键查询所需云服务器、轻量应用服务器、数据库、存储、CDN、网络、安全、大数据等云产品优惠活动大全&#xff0c;活动打开如下图&#xff1a; 腾讯云优惠全站搜 腾讯云优惠全站搜页面 txybk.com/go…

SpringBoot源码搭建

文章目录 源码下载搭建项目构建学习博客 源码下载 需要环境 &#xff1a; JDK 1.8Maven 3.5Spring Boot 1.x.x: Gradle 版本建议为2.9或更高版本。Spring Boot 2.x.x: Gradle 版本建议为4.x.x或更高版本。 GitHub 从v2.3.x开始&#xff0c;SpringBoot开始强制用Gradle构建项…

CNAS中兴新支点——软件兼容测试从哪些方面判断

软件的兼容性是衡量软件好坏的一个重要指标&#xff0c;在具体测试中可以从以下几个方面来判断&#xff1a; 1、操作系统兼容性 软件可以运行在哪些操作系统平台上&#xff0c;理想的软件应该具有与平台无关性。有些软件在不同的操作系统平台上重新编译即可运行&#xff0c;有…

二分查找(模板)

记住二分查找的数据必须是&#xff08;有序的&#xff09;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; #include <iostream> using namespace std;// 二分查找 记住二分查找的数据必须是&#xff08;有序的&#xff09;&…

Lua的垃圾回收机制详解

Lua 是一种轻量级的编程语言&#xff0c;广泛用于嵌入到其他应用程序中&#xff0c;尤其是在游戏开发领域。Lua 的内存管理机制采用了自动垃圾收集&#xff08;Garbage Collection&#xff09;的方法。以下是Lua内存管理的一些关键方面&#xff1a; 垃圾收集原理概述 Lua 使用…

虚拟机服务器中了lockbit2.0/3.0勒索病毒怎么处理,数据恢复应对步骤

网络技术的不断发展也为网络威胁带来了安全隐患&#xff0c;近期&#xff0c;对于许多大型企业来说&#xff0c;许多企业的虚拟机服务器系统遭到了lockbit2.0/3.0勒索病毒攻击&#xff0c;导致企业所有计算机系统瘫痪&#xff0c;无法正常工作&#xff0c;严重影响了企业的正常…