Javaweb | 转发、重定向

在这里插入图片描述

💗wei_shuo的个人主页

💫wei_shuo的学习社区

🌐Hello World !


转发

转发与页面跳转

转发

  • 转发的作用在服务器端,将请求发送给服务器上的其他资源,以共同完成一次请求的处理

页面跳转

  • 使用forward跳转时,是在服务器内部跳转,地址栏不发生变化,属于同一次请求

调用业务逻辑的Servlet中,编写代码:

request.getRequestDispatcher("/目标URL-pattern").forward(request,response);

//跳转转发到login.jsp
req.getRequestDispatcher("login.jsp").forward(req,resp);

数据传递

request作用域

  • 拥有存数据的空间,作用范围是一次请求有效(一次请求可以经过多次转发)
    • 可以将数据存入request后,在一次请求过程中的任何位置进行获取
    • 可以传递数据(基本数据类型,对象,数组,集合等)

存数据

  • 以键值对的形式存储在request作用域中,key为String类型,value为Object类型
  • JSP内置对象session和request都有这个方法
request.setAttribute(key,value);

取数据

  • 通过String类型的key访问Object类型的value
request.getAttribute(key)

存取数据

//request作用域存储数据
req.setAttribute("admins",adminList);

//request作用取数据
request.getAttribute("admins");

重定向

重定向作用在客户端,客户端请求发送给服务器后,服务器响应给客户端一个新的请求地址,客户端重新发送新的请求

重定向与页面跳转

调用业务逻辑的Servlet中,编写代码:

// response.sendRedirect("目标URL");
resp.sendRedirect("index.jsp");		//重定向跳转到index.jsp页面

数据传递

sendRedirect跳转时,地址栏发生改变,代表客户端重新发送请求,属于两次请求

  • response没有作用域,两次request请求中的数据无法共享

传递数据

  • resp.sendRedirect(“URL”);

  • 通过URl的拼接进行数据传递 “网页地址?username=tom”;

  • response传递数据只能是String类型

获取数据

  • request.getParameter(“username”);
//传递数据
resp.sendRedirect("/WebProject_war_exploded/b?username=tom");   //传递数据为String类型,明文传递

//获取数据
String username = req.getParameter("username");

转发与重定向的区别

转发重定向
转发使用的是getRequestDispatcher()方法重定向使用的是sendRedirect()方法
浏览器URL的地址栏不变浏览器URL的地址栏改变
转发是服务器行为重定向是客户端行为
转发是浏览器只做了一次访问请求重定向是浏览器做了至少两次的访问请求
转发2次跳转之间传输的信息不会丢失重定向2次跳转之间传输的信息会丢失(request范围)
重定向的第二个请求一定是GET

转发和重定向总结:

  • 当两个Servlet需要传递数据时,选择forward转发,不建议使用sendRedirect转发,因为sendRedirect是明文传递不安全

Servlet生命周期(四阶段)

Servlet 生命周期

Servlet 生命周期可被定义为从创建直到毁灭的整个过程。以下是 Servlet 遵循的过程:

  • Servlet 初始化后调用 init () 方法
  • Servlet 调用 service() 方法来处理客户端的请求
  • Servlet 销毁前调用 destroy() 方法
  • 最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的

在这里插入图片描述

  • 实例化

用户第一次访问Servlet是,由容器调用Servlet的构造器创建具体的Servlet对象,也可以启动容器后立刻创建实例,使用如下代码可以设置Servlet是否在服务器启动时就创建

  • 只执行一次
  • 初始化

初始化阶段,init()方法会被调用,这个方法在javax.servlet.Servlet接口中定义,其中,方法以一个ServletConfig类型的对象作为参数

  • init方法只被执行一次
  • 服务

客户端有一个请求时,容器会将请求ServletRequest与响应ServletRequest对象转给Servlet,以参数的形式传给service方法

  • 此方法会执行多次
  • 销毁

Servlet容器(Tomcat)停止或者重新启动(Tomcat)都会引起销毁Servlet对象并调用destroy方法

  • destroy方法执行一次

实例:

package com.woniu.servlet2;

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;

@WebServlet(value = "/ls")
public class LifeServlet implements Servlet {

    public LifeServlet(){
        System.out.println("1.实例化");
    }

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("2.初始化");
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("3.提供服务,接受请求,响应结果");
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {
        System.out.println("4.销毁");
    }
}

  • 重启或停止Tomcat即会输出销毁

在这里插入图片描述


🌼 结语:创作不易,如果觉得博主的文章赏心悦目,还请——点赞👍收藏⭐️评论📝


在这里插入图片描述

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

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

相关文章

拍卖小程序开发:从需求分析到设计实现

在当今数字时代,拍卖小程序已经成为了一个重要的销售和交易工具。拍卖小程序的开发不仅能够提供高效的销售渠道,还能够为用户提供全新的购物体验。因此,开发一个拍卖小程序成为了许多商家的首要任务。 拍卖小程序的开发可以帮助商家拓展销售…

Linux下实现共享内存的两种机制(附源码)

START Hello 大家好。 今天来讲一下Linux进程通信中重要的通信方式:共享内存作为Linux软件开发攻城狮,进程间通信是必须熟练掌握的重要技能,而共享内存是在程序开发中常用的也是重要的一种进程间通信方式。 下面我们就来聊一聊Linux下进程间…

pytest自动化框架之allure测试报告的用例描述设置

allure测试报告的用例描述相关方法;如下图 allure标记用例级别severity 在做自动化测试的过程中,测试用例越来越多的时候,如果执行一轮测试发现了几个测试不通过,我们也希望能快速统计出缺陷的等级。 pytest结合allure框架可以对…

每日学术速递4.26

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.AutoNeRF: Training Implicit Scene Representations with Autonomous Agents 标题:AutoNeRF:使用自主代理训练隐式场景表示 作者:Pierre Marz…

SaaS云HIS系统源码功能介绍

SaaS云HIS首页功能:包括工作计划、预警、主功能菜单、医院机构公告。 一、工作计划 1.值班概况:值班日期、值班时间、值班科室(内科、外科等) 2.待处理患者:内科人数、外科人数等 病历统计:入院病历、出…

华为面试题:1+4=5,2+5=12,3+6=21,问8+11=?网友:幼儿园级别

面试,一直都是职场人士绕不过去的坎,对于有的人来说,或许更擅长日常的工作,在面试环节可谓是自己的薄弱环节,但对于有的人来说,相比于工作,更擅长应付面试! 最近,有一位…

《面向基于人工智能的学习健康系统,使用心电图进行人群水平的死亡率预测》阅读笔记

目录 一、摘要 二、十个问题 Q1论文试图解决什么问题? Q2这是否是一个新的问题? Q3这篇文章要验证一个什么科学假设? Q4有哪些相关研究?如何归类?谁是这一课题在领域内值得关注的研究员? Q5论文中提到…

过来人转本考试后的感悟和经验,真的很受用

过来人转本考试后的感悟和经验,真的很受用!转本不仅是分数的较量,也是信息收集、时间管理、学习能力、毅力等等的较量。同学们在转本中难免会遇见一些困难,为了避免走弯路,一起来看看过来人的感悟和经验吧!…

项目范围控制:如何控制项目范围的变化?

一个成功的项目需要在进度、成本和质量之间取得平衡。控制项目交付范围是实现这个平衡的关键。然而,项目范围是会变化的,因此控制项目范围变化是必要的。 如何控制项目范围的变化? 1、了解项目的交付范围 项目经理、团队成员、利益相关者和…

verilog手撕代码3——序列检测和序列发生器

文章目录 前言一、序列检测器1.1 重复序列检测1.1.1 序列缓存对比/移位寄存器法1.1.2 状态机法 1.2 非重复序列检测 二、序列发生器2.1 移位寄存器法2.2 反馈法2.3 计数器法 前言 2023.4.25 2023.4.26 学习打卡,天气转晴 一、序列检测器 1.1 重复序列检测 1.1.1 …

等级保护、风险评估和安全测评分别是什么?

2022-06-17 15:17 迈入“等保2.0时代”以后,我国对于等级保护的要求更为严格和具体。等级保护、风险评估和安全测评这三个词,也因此总是出现在人们的视野之中,还总是被混淆。那这三者究竟分别是什么呢?如何区分它们?它…

【Bus】编写一个Demo虚拟的总线-设备-驱动模型

文章目录 1. 前言2. 总线驱动模型三要素2.1 总线2.2 设备2.3 驱动 3. Demo Code3.1 virt_bus_core.c3.2 virt_device.c3.3 virt_driver.c 4. 工程代码下载地址5. 参考资料 1. 前言 Linux平台为了驱动的可重用性,虚拟了很多的虚拟总线。很经典的就是platform总线&am…

如何编写高质量代码、提高编程效率?

一、 前言 高质量代码是指在满足功能需求的基础上,具备高性能、安全、可扩展、易维护、可测试等特点的代码。它不仅可以提高开发效率和代码质量,更能有效减少代码维护成本,促进团队协作和项目成功。因此,编写高质量代码对程序员来…

【Java】什么是SOA架构?与微服务有什么关系?

文章目录 服务化架构微服务架构 我的一个微服务项目,有兴趣可以一起做 服务化架构 我们知道,早期的项目,我们都是把前后端的代码放在同一个项目中,然后直接打包运行这个项目,这种项目我们称之为单体项目,比…

【Vue】Vue-cli,创建项目设置自定义默认配置

Vue2.0,Vue-cli项目配置 步骤一,打开文件夹,导航栏输入cmd,打开命令行窗口步骤二,输入命令步骤三,选择第三个自定义新建项目步骤四,选择需要的项目模块,空格选择完,回车步…

密码学|AES加密算法|学习记录

AES简介 AES加密是分组加密的一种 明文长度为固定的128位 密钥可长度为128,192,256位 128bit16字节,在AES中我们将数据用4x4字节的矩阵表示。(注排列顺序为先从上到下再从左到右) AES的一般步骤 对于上图最终轮区…

CASAIM高精度自动化三维扫描系统检测塑料件,自动检测形位公差

随着塑料工业的迅速发展,以及塑料制品在航空、航天、电子、机械、船舶和汽车等工业部门的推广应用,对塑料件的质量要求也越来越高。 为了检测塑料件的尺寸偏差以及测量关键部位的3D尺寸和形位公差,对影响总成零件精度的产品、工装、工艺进行精…

第十章_Redis集群(cluster)

是什么 定义 由于数据量过大,单个Master复制集难以承担,因此需要对多个复制集进行集群,形成水平扩展每个复制集只负责存储整个数据集的一部分,这就是Redis的集群,其作用是提供在多个Redis节点间共享数据的程序集。 官…

yield用法理解,配有代码块和解析

包含 yield 关键字的函数,是一个生成器 yield和return的区别 1、return是返回return关键字的值,被调用一次就返回一次,return只能放在一个函数代码块的最后面,运行到return的时候,就结束循环,结束这个函数…