学习Java第64天,请求转发和响应重定向

请求转发和响应重定向

概述

什么是请求转发和响应重定向

  • 请求转发和响应重定向是web应用中间接访问项目资源的两种手段,也是Servlet控制页面跳转的两种手段

  • 请求转发通过HttpServletRequest实现,响应重定向通过HttpServletResponse实现

  • 请求转发生活举例: 张三找李四借钱,李四没有,李四找王五,让王五借给张三

  • 响应重定向生活举例:张三找李四借钱,李四没有,李四让张三去找王五,张三自己再去找王五借钱

请求转发

请求转发特点(背诵)

  • 请求转发通过HttpServletRequest对象获取请求转发器实现

  • 请求转发是服务器内部的行为,对客户端是屏蔽的

  • 客户端只发送了一次请求,客户端地址栏不变

  • 服务端只产生了一对请求和响应对象,这一对请求和响应对象会继续传递给下一个资源

  • 因为全程只有一个HttpServletRequset对象,所以请求参数可以传递,请求域中的数据也可以传递

  • 请求转发可以转发给其他Servlet动态资源,也可以转发给一些静态资源以实现页面跳转

  • 请求转发可以转发给WEB-INF下受保护的资源

  • 请求转发不能转发到本项目以外的外部资源

请求转发测试代码  

ServletA

@WebServlet("/servletA")
public class ServletA extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//  获取请求转发器//  转发给servlet  okRequestDispatcher  requestDispatcher = req.getRequestDispatcher("servletB");//  转发给一个视图资源 ok//RequestDispatcher requestDispatcher = req.getRequestDispatcher("welcome.html");//  转发给WEB-INF下的资源  ok//RequestDispatcher requestDispatcher = req.getRequestDispatcher("WEB-INF/views/view1.html");//  转发给外部资源   no//RequestDispatcher requestDispatcher = req.getRequestDispatcher("http://www.atguigu.com");//  获取请求参数String username = req.getParameter("username");System.out.println(username);//  向请求域中添加数据req.setAttribute("reqKey","requestMessage");//  做出转发动作requestDispatcher.forward(req,resp);}
}

ServletB

@WebServlet("/servletB")
public class ServletB extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 获取请求参数String username = req.getParameter("username");System.out.println(username);// 获取请求域中的数据String reqMessage = (String)req.getAttribute("reqKey");System.out.println(reqMessage);// 做出响应resp.getWriter().write("servletB response");        }
}

响应重定向

响应重定向运行逻辑图

响应重定向特点(背诵)

  • 响应重定向通过HttpServletResponse对象的sendRedirect方法实现

  • 响应重定向是服务端通过302响应码和路径,告诉客户端自己去找其他资源,是在服务端提示下的,客户端的行为

  • 客户端至少发送了两次请求,客户端地址栏是要变化的

  • 服务端产生了多对请求和响应对象,且请求和响应对象不会传递给下一个资源

  • 因为全程产生了多个HttpServletRequset对象,所以请求参数不可以传递,请求域中的数据也不可以传递

  • 重定向可以是其他Servlet动态资源,也可以是一些静态资源以实现页面跳转

  • 重定向不可以到给WEB-INF下受保护的资源

  • 重定向可以到本项目以外的外部资源

响应重定向测试代码

 ServletA


@WebServlet("/servletA")
public class ServletA extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//  获取请求参数String username = req.getParameter("username");System.out.println(username);//  向请求域中添加数据req.setAttribute("reqKey","requestMessage");//  响应重定向// 重定向到servlet动态资源 OKresp.sendRedirect("servletB");// 重定向到视图静态资源 OK//resp.sendRedirect("welcome.html");// 重定向到WEB-INF下的资源 NO//resp.sendRedirect("WEB-INF/views/view1");// 重定向到外部资源//resp.sendRedirect("http://www.atguigu.com");}
}

 ServletB

@WebServlet("/servletB")
public class ServletB extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 获取请求参数String username = req.getParameter("username");System.out.println(username);// 获取请求域中的数据String reqMessage = (String)req.getAttribute("reqKey");System.out.println(reqMessage);// 做出响应resp.getWriter().write("servletB response");}
}

打开浏览器,输入以下url测试

http://localhost:8080/web03_war_exploded/servletA?username=atguigu

PS:来源尚硅谷

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

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

相关文章

人工智能原理复习--搜索策略(二)

文章目录 上一篇启发式搜索与或图搜索博弈下一篇 上一篇 人工智能原理复习–搜索策略(一) 启发式搜索 提高一般图搜索效率的关键是优化OPEN表中节点的排序方式 最理想的情况是每次排序OPEN表表首n总在解答路径上 全局排序–对OPEN表中的所有节点进行…

vue实例事件

实例方法 / 事件 vm.$on 监听当前实例上的自定义事件。事件可以由 vm.$emit 触发。回调函数会接收所有传入事件触发函数的额外参数。 vm.$on(test, function (msg) {console.log(msg) }) vm.$emit(test, hi) // > "hi"vm.$once( event, callback ) 监听一个自定义…

Vue笔记(二)基本语法

基本语法 <style> table {border-collapse: collapse;margin:0 auto; } strong {color: rgb(235, 51, 100); }td, th {padding-left: 6px; } table tr td:first-child {width:150px } table tr td:nth-child(2) {width:300px } </style> <template><tabl…

mysql面试题——MVCC

一&#xff1a;什么是MVCC&#xff1f; 多版本并发控制&#xff0c;更好的方式去处理读-写冲突&#xff0c;就是为了查询一些正在被另一个事务更新的行&#xff0c;并且可以看到它们被更新之前的值&#xff0c;这样在做查询的时候就不用等待另一个事务释放锁。 二&#xff1a…

万界星空科技mes系统中看板管理

我们很多企业现在都有大屏&#xff0c;那到底万界星空科技低代码云mes系统管理中看板管理有什么作用&#xff1f;我总结了几条: 1.提高车间的生产效率 2.有效的监控设备运行状况 3.控制生产线运行 4.增加和改善用户体验 5.提高工作效率和工作安全性

Zabbix监控腾讯云VPC

一、简介 私有网络&#xff08;Virtual Private Cloud&#xff0c;VPC&#xff09;是腾讯云上一块由用户自定义的逻辑隔离网络空间&#xff0c;为云服务器、云数据库等资源提供安全可控的网络环境。通过构建逻辑隔离的、用户自定义配置的网络空间&#xff0c;用户能够提升其云…

vue组件插槽

组件的插槽 组件本身就是一个容器&#xff0c;也可以是一个vue对象&#xff0c;也是一个虚拟DOM 普通插槽 组件本身是一个容器&#xff0c;这个容器本身是空的&#xff0c;当我们把需要封装的html结构装进去之后&#xff0c;我们可以认为这个容器被塞满了&#xff0c;那就意…

WIN11家庭中文版使用ENSP+VirtualBox启动AR失败40错误+未完全关闭hyper-V,以及安装VirtualBox兼容性问题

使用版本&#xff1a;eNSP 1.3.00.100VirtualBox 5.2.44WinPcap_4_1_3Wireshark最新版。 win11系统最好按照上述版本安装&#xff0c;VirtualBox不要安装更高版本&#xff0c;否则可能出现不兼容情况&#xff0c;Wireshark版本要求还好&#xff0c;安装顺序是VirtualBox 5.2.4…

python+pytest接口自动化之参数关联

什么是参数关联&#xff1f; 参数关联&#xff0c;也叫接口关联&#xff0c;即接口之间存在参数的联系或依赖。在完成某一功能业务时&#xff0c;有时需要按顺序请求多个接口&#xff0c;此时在某些接口之间可能会存在关联关系。比如&#xff1a;B接口的某个或某些请求参数是通…

如何利用人工智能+物联网技术实现自动化设备生产

随着科技的发展与行业竞争的日益激烈&#xff0c;制造业也逐渐走向智能化发展。制造业的改革是利用物联网技术和自动化设备&#xff0c;实现生产线的智能化和自适应生产&#xff0c;优化生产流程&#xff0c;提高生产效率和质量&#xff0c;为企业创造更大的价值。 方案概述 智…

Gif表情包怎么用图片制作?一招简单易上手

很多朋友对于gif动图的名字不是很熟悉&#xff0c;但是对于“gif表情包”一定很熟悉吧&#xff01;在日常网络聊天中经常能见到其的身影&#xff0c;能够调节聊天的气氛。想要制作gif表情包可以使用gif动图在线制作&#xff08;https://www.gif.cn/&#xff09;网站-GIF中文网&…

【C语言期末】题目+解析

文章目录 题目1.下面哪个不是C语言的基本数据类型&#xff1f;&#xff08; B &#xff09;2.C语言的标识符应以字母或&#xff08; A &#xff09;开头。3.如果需要在C程序里调用标准函数库中的printf函数&#xff0c;则应该在程序的开头包含哪个头文件&#xff1f;&#xff0…

学习Linux(2)-学习Linux命令

Linux目录结构 Linux目录结构-菜鸟教程 /bin&#xff1a;bin 是 Binaries (二进制文件) 的缩写, 这个目录存放着最经常使用的命令。 /boot&#xff1a;这里存放的是启动 Linux 时使用的一些核心文件&#xff0c;包括一些连接文件以及镜像文件。 /dev &#xff1a;dev 是 De…

TensorFlow 常用代码

TensorFlow 是由 Google 开发的一个用于数值计算的开源软件库&#xff0c;主要用于构建和训练机器学习模型。它的核心是使用数据流图来描述计算任务。数据流图是由节点和边组成的有向图&#xff0c;每个节点表示一个计算任务&#xff0c;每条边表示数据传输。 TensorFlow 支持…

Dockerfile文件

什么是dockerfile? Dockerfile是一个包含用于组合映像的命令的文本文档。可以使用在命令行中调用任何命令。 Docker通过读取Dockerfile中的指令自动生成映像。 docker build命令用于从Dockerfile构建映像。可以在docker build命令中使用-f标志指向文件系统中任何位置的Docke…

C语言-字符串操作函数-附加使用方式

文章目录 前言字符串复制-strcpy字符串复制&#xff08;按照位数&#xff09;-strncpy字符串比较-strcmp字符串比较(按照位数)-strncmp不区分大小写的字符串比较-strcasecmp不区分大小写的比较(前n位)-strncasecmp字符串按照格式写入-sprintf字符串按照格式和个数写入-snprintf…

JUC包(面试常问)

1. Callable接口 类似于Runnable接口&#xff0c;Runnable描述的任务&#xff0c;不带返回值&#xff1b;Callable描述的任务带返回值。 public class Test {//创建线程&#xff0c;计算12...1000public static void main(String[] args) throws ExecutionException, Interru…

js/jQuery常见操作 之各种语法例子(包括jQuery中常见的与索引相关的选择器)

js/jQuery常见操作 之各种语法例子&#xff08;包括jQuery中常见的与索引相关的选择器&#xff09; 1. 操作table常见的1.1 动态给table添加title&#xff08;指定td&#xff09;1.1.1 给td动态添加title&#xff08;含&#xff1a;获取tr的第几个td&#xff09;1.1.2 动态加工…

KWin、libdrm、DRM从上到下全过程 —— drmModeAddFBxxx(23)

接前一篇文章:KWin、libdrm、DRM从上到下全过程 —— drmModeAddFBxxx(22) 上一回讲解了i915_gem_object_lookup_rcu函数的第1个参数struct drm_file *file,本回讲解其第2个参数u32 handle。 (2)参数u32 handle 说起来,handle要比struct drm_file *file参数好理解多了…

怎么更改android的包名,使其可以变成另外一个app

在 Android 中更改应用的包名并不是一项简单的任务&#xff0c;因为包名在应用的整个代码和配置文件中都被广泛使用。但是&#xff0c;你可以通过以下步骤来更改应用的包名&#xff1a; 注意&#xff1a;在更改包名之前&#xff0c;请确保备份你的项目&#xff0c;以防发生意外…