重定向与请求转发,以及它们之间的区别

2023-10-26

 重定向:

        在某些情况下,针对客户端的请求,一个Servlet类可能无法完成全部工作。这时,可以使用请求重定向来完成。所谓请求重定向,是指Web服务器接收到客户端的请求后,可能由于某些条件限制,不能访问当前请求URL所指向的Web资源,而是指定了一个新的资源路径,让客户端重新发送请求。

        为了实现请求重定向,HttpServletResponse接口定义了一个sendRedirect()方法,该方法用于生成Location头字段。

通过一个用户登陆的案例,分步骤讲解sendRedirect()方法的使用。

        在一个项目的Web目录下编写用户登录的页面login.html和登录成功的页面。

 login.html:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
                                    "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta charset="UTF-8" content="text/html" http-equiv="Content-Type">
    <title>Insert title</title>
</head>
<body>
        <!--把表单内容提交到studyclass项目下的LoginServlet-->
        <form action="/studyclass/LoginServlet" method="post">
            用户名:<input type="text" name="username" /><br />
            密&nbsp;&nbsp;&nbsp;码:<input type="password" name="password" /><br/>
            <input type="submit" value="登录">
        </form>
</body>
</html>

welcome.html: 

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
        "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta charset="UTF-8" content="text/html" http-equiv="Content-Type">
    <title>Insert title</title>
</head>
<body>
    欢迎你!登陆成功
</body>
</html>

我的项目名是studyclass,login.html和welcome.html我放在了web目录下的denglu包中。

        在studyclass项目的classfour包中编写一个名为LoginServlet的类,用于处理用户登录请求

package classfour;

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 = "LoginServlet",urlPatterns = "/LoginServlet")
public class LoginServlet extends HttpServlet {
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        //用HttpServletRequest对象的getParameter()方法获取用户名和密码
        String username= request.getParameter("username");
        String password=request.getParameter("password");
        //假设用户名和密码为itcast和123
        if (("itcast").equals(username)&&("123").equals(password)){
            //如果用户名和密码正确,重定向到welcome.html
            response.sendRedirect("/studyclass/denglu/welcome.html");
        }else {
            //如果用户名和密码错误,重定向到login.html
            response.sendRedirect("/studyclass/denglu/login.html");
        }
    }
}

        登录成功就会出现以下界面:

请求转发: 

        Servlet之间可以相互跳转,利用Servlet的跳转可以把一项任务按模块分开,例如:

使用一个Servlet实现用户登录,然后跳转到另外一个Servlet实现用户资料修改。Servlet的跳转要通过RequestDispatcher接口的实例对象实现。HttpServletRequest接口提供了getRequestDispatcher()方法用于获取RequestDispatcher对象。

        getRequestDispatcher()方法的具体格式

RequestDispatcher getRequestDispatcher (String path)

        获取到RequestDispatcher对象后,如果当前web资源不想处理请求,RequestDispatcher接口提供了一个forward()方法,该方法可以将当前请求传递给其他web资源,由其他资源对这些信息进行处理并将响应提交给客户端,这种方式称为请求转发。

        forward()方法的具体格式如下:

forward(ServletRequest request,ServletResponse response)

forward()方法用于将请求从一个Servlet传递给另一个web资源。在Servlet中,可以对请求做一个初步处理,然后调用forward()方法将请求传递给其他资源进行响应。需要注意的是,该方法必须在将响应提交给客户端之前被调用,否则将抛出异常。 

                

        在studyclass项目中建一个包,在包下创建一个名为RequestForwardServlet的类,该类调用forward()方法将请求转发到一个新的Servlet页面。

package QingqiuZhuanfa;

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 = "RequestForwardServlet",urlPatterns = "/RequestForwardServlet")
public class RequestForwardServlet extends HttpServlet {
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        request.setAttribute("username","张三");//将数据存储到request对象中
        RequestDispatcher dispatcher=request.getRequestDispatcher("/ResultServlet");
        dispatcher.forward(request,response);
    }
}

 

可以看到通过使用forward()方法将当前Servlet的请求转发到ResultServlet页面。

再次在该包下写一个ResultServlet的类,用于获取RequestForwardServlet类中存储在request对象中的数据并输出。

package QingqiuZhuanfa;

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;
import java.io.PrintWriter;

@WebServlet(name = "ResultServlet",urlPatterns = "/ResultServlet")
public class ResultServlet extends HttpServlet {
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out=response.getWriter();
        String username=(String) request.getAttribute("username");
        if (username!=null){
            out.println("用户名:"+username+"<br/>");
        }
    }
}

 

 

 

由图可知,地址栏中显示的仍然是RequestForwardServlet的请求路径,但是浏览器却显示ResultServlet中要输出的内容。这是因为请求转发是发生在服务器内部的行为,从RequestForwardServlet到ResultServlet属于一次请求,在一次请求中可以使用request属性进行数据共享。

对比重定向的地址栏,是有不同的,重定向的地址是重定向后的路径。 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

重定向与请求转发,以及它们之间的区别 的相关文章

随机推荐

  • Linux系统cannot create temp file for here-document: No space left on device解决方案

    登陆linux系统之后 使用tab自动补全快捷键的时候显示 cannot create temp file for here document No space left on device 原因 磁盘满了 不能创建临时文件 解决方法 逐级
  • 日语五十音图的记忆方法

    i 通汉字以 也念i 所以很好记的 呢 我每次看到它就会想起汉字 依 也就记住了 u 表示你发音时的样子 上嘴唇倾斜 下巴朝上撅 就发出了u 代表一个人 左胳膊好好的 右胳膊给生生截掉一半 他疼啊 在55的哭呢 念u e 通汉字衣 读音稍微
  • 修改覆铜形状

    作者还拥有个人公众号 会写一些感悟文章 知圈 二维码如下 欢迎扫描关注 关注后有作者微信 欢迎添加交流 先选中需要修改的内电层 一般是GND或者Power 然后选择shape里面的选择 如下图 然后选要修改的形状 会在边角出现小方框 拖动就
  • Linux操作系统——文件I/O相关函数

    文章目录 前言 一 文件I O的相关函数 1 open函数 创建或打开文件 2 close函数 关闭被打开的文件 3 read函数 从文件中读取数据存放到缓存区中 4 write函数 将数据写入文件中 5 lseek函数 更改文件读写位置
  • java:错误: 无法从静态上下文中引用非静态 变量 XXX。

    我们平时编译的时候可能会遇到这样的错误 我们写的是这样一个代码 class Person String name public static void show System out println name haha class a pu
  • Hive调用python脚本实现数据清洗、统计过程

    Hive的 TRANSFORM 关键字提供了在SQL中调用自写脚本的功能 本实例通过python脚本对电影数据进行清洗 帮助读者了解hive调用python脚本的整个流程 操作步骤 1 创建基表 CREATE TABLE u data us
  • 异步GET请求方法

    同步请求的用户体验不是很好 因此很多情况下我们会采用异步调用 iOS SDK也提供了异步请求的方法 而异步请求会 使用NSURLConnection委托协议NSURLConnectionDelegate 在请求的不同阶段 会回调委托 对象的
  • CVE-2021-35464: ForgeRock AM远程代码执行漏洞通告

    报告编号 B6 2021 063002 报告来源 360CERT 报告作者 360CERT 更新日期 2021 06 30 0x01 漏洞简述 2021年06月30日 360CERT监测发现portswigger发布了ForgeRock A
  • python中一些写法实例和小练习

    1 用户输入一个数字 并计算这个数字的平方根 关键 使用指数运算符 来计算该数的平方根 该程序只适用于正数 负数和复数可以使用以下的方式 说明 在使用print函数输出时 也可以对字符串内容进行格式化处理 上面print函数中的字符串 1
  • 深度卷积神经网络在目标检测中的进展

    作者 travelsea 链接 https zhuanlan zhihu com p 22045213 来源 知乎 近些年来 深度卷积神经网络 DCNN 在图像分类和识别上取得了很显著的提高 回顾从2014到2016这两年多的时间 先后涌现
  • 【无标题】

    1 直达软件 由直达国际的子公司上海直达软件有限公司出品 提供期货交易全套解决方案的专业软件 全球化交易平台 结算系统 风险管理平台及程序化交易等产品 为公司客户提供稳定 快速的交易系统 2 易盛极星 易盛极星 是由郑州商品交易所的全资子公
  • BigDecimal 如何在一个区间的比较

    BigDecimal 如何在一个区间的比较 背景 由于BigDecimal 的精度比较高 在计算的时候有时候存入数据库的时候会进行四舍五入 会对后面的结果判断存在误差 所以比较的结果会在一个区间的 public static boolean
  • vim编辑文件使用案例

    1 前置知识点了解 操作流程 编辑文件指令 vim 文件名 点击键盘 i 键 模式由默认的 命令模式 变成 插入模式 编辑文件内容 完成后点击键盘 Esc 键 模式由 插入模式 变成 命令模式 同时点击键盘 shift 键 模式由 命令模式
  • python接口自动化(四)--接口测试工具介绍(详解)

    简介 工欲善其事必先利其器 通过前边几篇文章的介绍 大家大致对接口有了进一步的认识 那么接下来让我们看看接口测试的工具有哪些 目前 市场上有很多支持接口测试的工具 利用工具进行接口测试 能够提供测试效率 例如 假 入让你一天完成100个接口
  • docker-compose常见问题

    一 新版本网络桥接 问题 docker errors InvalidArgument host network mode is incompatible with port 1 24 0以前可以network mode host和ports
  • Python List 按照多个关键字排序

    最近刷刷题遇到的 发现还没有一模一样的答案 自己做个解答 以列表有两列为例 我们需要按照两列排序 可以利用sorted和lambda组合 l a 2 c 1 d 4 b 2 sorted l key lambda x x 1 x 0 rev
  • 小程序实现h5页面的微信支付php,微信小程序webview组件交互,内联h5页面并网页实现微信支付实现解析...

    前言 小程序支持webview以后 我们开发的好多h5页面 就可以直接在小程序里使用了 比如我们开发的微信商城 文章详情页 商品详情页 就可以开发一套 多处使用了 我们今天来讲一讲 在小程序的webview里实现微信支付功能 因为微信不允许
  • 面向对象、面向过程的思考

    把问题和答案记下来 过段时间再自己回答 几 次 2014年04月30号 师傅 思考一个问题 面向对象编程 和 面向过程编程 两类型的语言又什么区别 我 面向对象编程 最大的感觉就是分工的明确 从小的方面来说 就是把程序里面的一个个对象 类
  • 解剖上海交大女生无耻言论:只嫁外国人?

    上海交大MM的不嫁中国男人自白书原文 我是上海交大的一名女大学生 我第一次发帖子 写的不好 请大家表笑偶 每个人都有人生理想 有的人想成为英雄 有人的想成为富翁 有的人渴望成为领袖 我呢 人生最大的愿望就是嫁给一个西方男人 有人会说我很庸俗
  • 重定向与请求转发,以及它们之间的区别

    重定向 在某些情况下 针对客户端的请求 一个Servlet类可能无法完成全部工作 这时 可以使用请求重定向来完成 所谓请求重定向 是指Web服务器接收到客户端的请求后 可能由于某些条件限制 不能访问当前请求URL所指向的Web资源 而是指定