servlet 转发与重定向
重定向与转发本质都是跳转到新的URL
重定向与转发的本质区别在于:转发是一个服务端的行为,而重定向是一个浏览器的行为。
下面是图解:

转发
转发的作用在服务器端,将请求发送给服务器上的其他资源,以共同完成一次请求的处理。
使用forward跳转时,是在服务器内部跳转,地址栏不发生变化,属于同一次请求。
使用方式
在要跳转的地方使用getRequestDispatcher方法指定要跳转的位置。
req.getRequestDispatcher("/url-pattern").forward(req,resp);
数据传递
forward表示一次请求,是在服务器内部跳转,可以共享同一次request作用域中的数据
request作用域:拥有存储数据的空间,作用范围是一次请求有效(一次请求可以经过多次转发)。可以将数据存入request后,在一次请求过程中的任何位置进行获取
可传递任何数据(基本数据类型、对象、数组、集合等)存数据:request.setAttribute(key,value);
以键值对形式存储在request作用域中。key为string类型,value为object类型取数据:requestgetAttribute(key);
通过string类型的key访问object类型的value
例子:
建立两个Servlet,AServlet、BServlet,在AServlet添加一个数据,跳转到BServlet,再将数据取出。
package com.zjw;
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("/a")
public class AServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("AServlet doGet...");
//向request中存入数据
req.setAttribute("name","张三");
//请求转发 跳转到AServlet
req.getRequestDispatcher("/b").forward(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("AServlet doPost...");
doPost(req,resp);
}
}
package com.zjw;
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("/b")
public class BServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("BServlet doGet...");
//从request域中取数据
String name = (String) req.getAttribute("name");
System.out.println(name);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("BServlet doPost...");
doPost(req,resp);
}
}
通过浏览器访问AServlet,观察浏览器的地址没有发生变化
http://localhost:8080/servlet_war_exploded/a
控制台输出
AServlet doGet...
BServlet doGet...
张三
重定向
重定向作用在客户端,客户端将请求发送给服务器后,服务器响应给客户端一个新的请求地址,客户端重新发送新请求。
使用方式
在调用业务逻辑的Servlet中,编写以下代码
response.sendRedirect("目标URI");
- URl:统一资源标识符(Uniform Resource ldentifier),用来表示服务器中定位一个资源,资源在web项目中的路径(/project/source)
例子:
建立两个Servlet,AServlet、BServlet,在AServlet添加一个数据,跳转到BServlet,再将数据取出。
package com.zjw;
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("/a")
public class AServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("AServlet doGet...");
//向request中存入数据
req.setAttribute("name","张三");
//重定向
resp.sendRedirect(req.getContextPath()+"/b");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("AServlet doPost...");
doPost(req,resp);
}
}
package com.zjw;
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("/b")
public class BServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("BServlet doGet...");
//从request域中取数据
String name = (String) req.getAttribute("name");
System.out.println(name);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("BServlet doPost...");
doPost(req,resp);
}
}
通过浏览器访问AServlet,观察浏览器的地址发生变化
//访问
http://localhost:8080/servlet_war_exploded/a
//改变
http://localhost:8080/servlet_war_exploded/b
控制台输出,发现无法取得request域中的值。
AServlet doGet...
BServlet doGet...
null
servlet 转发与重定向的更多相关文章
- servlet转发与重定向区别
servlet转发与重定向 HttpServletRequest: 表示浏览器向服务器发送的请求报文,由Tomcat创建然后作为参数传递给我们doget,dopost方法. 功能:getParam ...
- Servlet转发和重定向的区别
附上视频教学的一张图: 区别: 1.转发产生一次请求,一次响应: 重定向产生2次请求 两次响应 2.转发客户端不可见的: 重定向客户端是可以察觉的. 3.转发时候url不变: 重定向URL会改变 案例 ...
- servlet转发与重定向
HttpServletRequest: 表示浏览器向服务器发送的请求报文,由Tomcat创建然后作为参数传递给我们doget,dopost方法. 功能:getParameter()获取请求参数 get ...
- servlet转发和重定向
1 转发 RequestDispatcher getRequestDispatcher(java.lang.String path) 1)地址栏不会改变 2)转发只能转发到当前web应用内的资源 3) ...
- Servlet中转发和重定向的区别
Servlet中页面的跳转有两种方式:转发和重定向. 1.转发和重定向的区别 ①转发是服务器行为,重定向是客户端行为. ②转发是浏览器发生了一次请求,重定向至少是两次请求. ③转发地址栏中的url不会 ...
- servlet的转发与重定向
转发和重定向都能让浏览器获得另外一个URL所指向的资源,但两者的内部运行机制有着很大的区别. 1.转发:有两种方式获得转发对象(RequestDispatcher):一种是通过HttpServletR ...
- Servlet中的请求转发和重定向
跳转和重定向 有的时候客户端请求到达服务端后需要对请求重新转发到其它Servlet甚至别的服务器,这就需要跳转和重定向. 区别 一般来说,跳转是服务器内部跳转,例如将请求从一个Servlet转发给另外 ...
- JavaWeb(一)Servlet中乱码解决与转发和重定向的区别
前言 前面其实已经把Servlet中所有的内容都介绍完了,这篇讲补充一点乱码和重定向与转发之间的区别! 一.request请求参数出现乱码问题 1.1.get请求 1)乱码示例 get请求的参数是在u ...
- Servlet中转发和重定向的路径问题【转】
转发和重定向的路径问题 Servlet中有两种方式获得转发对象(RequestDispatcher):一种是通过HttpServletRequest的getRequestDispatcher()方法获 ...
- Servlet中的转发与重定向
Sevlet 的转发与重定向都可以使得浏览器指向另一个资源文件,但它们的运行机制不相同. 一.Servlet的转发 有两种方式获得转发对象(RequestDispathcer): HttpServle ...
随机推荐
- 在 PyTorch 中理解词向量,将单词转换为有用的向量表示
你要是想构建一个大型语言模型,首先得掌握词向量的概念.幸运的是,这个概念很简单,也是本系列文章的一个完美起点. 那么,假设你有一堆单词,它可以只是一个简单的字符串数组. animals = [&quo ...
- Mac安装Flume
一.下载Flume(在SoftWare目录下) wget http://mirrors.tuna.tsinghua.edu.cn/apache/flume/1.8.0/apache-flume-1.8 ...
- Hive表误删恢复
一.简介 因hive表删除后,hdfs文件会先放入回收站,定期清理回收站.在回收之前可以进行清理数据 二.恢复步骤 2.1 看表存储是否损坏select type from dw.ods_test1 ...
- 深入理解 Docker 容器技术
一.引言 在当今的云计算和软件开发领域,Docker 容器技术已经成为了一项不可或缺的工具.它极大地改变了应用程序的部署和运行方式,为开发者和运维人员带来了诸多便利. 二.Docker 容器是什么? ...
- Typecho Mirages 主题自定义公告样式
使用步骤 将以下代码加入到 <head> 标签中.对于本主题,依次进入 控制台 - 外观 - 设置外观 - 主题自定义扩展,将代码加入到 自定义 HTML 元素拓展 - 标签: head ...
- Hive - [08] 数据仓库物理模型设计
分区 分区是将表的数据按照某个列的值进行划分和存储的一种方式.通过分区,可以将数据按照特定的维度进行组织,提高查询效率和数据管理的灵活性. 一.分区的优势 提高查询性能:通过分区,可以将数据按照特定的 ...
- Kafka - [02] Kafka单机版部署
Kafka是一个分布式的流处理平台. kafka主要是作为一个分布式的.可分区的.具有副本数的日志服务系性.高容错性.访问速度快.分布式等特性:具有高水平扩展 主要应用场景是:日志收集系统和分布式发布 ...
- VMware16虚拟机安装激活教程
1.开始安装前需要准备好的软件 VMware-workstation-full-16--虚拟机软件(必要) 获取方式: 官方下载地址:https://www.vmware.com/cn/product ...
- 获取另一个frame中的元素
<frameset cols="12,88" frameborder="no" noresize borders="no" frame ...
- Laravel11 从0开发 Swoole-Reverb 扩展包(四) - 触发一个广播事件到reverb服务之后是如何转发给前端订阅的呢(下)?
前情提要 上一篇我们讲到了reverb服务的通信上下文和路由处理,路由实现了pusher关联的几种请求.那么这一篇我们主要来讲混响服务Server 混响 Server 负责基于 ReactPHP 的 ...