请求转发与重定向

本文深入探讨了Servlet中的请求转发与重定向的区别,通过实例对比了一次请求一次响应与两次请求两次响应的过程,详细解释了地址栏变化、路径处理及request域数据传递的原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原理

请求转发是servlet 内部调用;重定向是两次请求和响应

区别
请求转发重定向
一次请求一次响应两次请求两次响应
地址栏不会变化地址栏会变化
路径不带工程名带工程名路径(是浏览器执行的操作)
只能在本网站内部可以定向到任何网站

如果需要用request域去保存数据,必须使用请求转发,不能使用重定向

因为request域的作用范围只在同一次请求和响应中有效。响应结束后就失效了

l 注意:

如果需要使用request进行值传递(共享),需要通过请求转发完成。如果页面需要跳转到其他网站上必须使用重定向。

演示一

先创建两个jsp文件
1.jsp

<%@ page language="java" contentType="text/html; charset=UTF-16"
	pageEncoding="UTF-16"%>
<% session.setAttribute("key", "1000");%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-16">
<title>Insert title here</title>
</head>
<body>
	<%=session.getAttribute("key")%>
	<a href="./dataServlet">点击</a>
</body>
</html>

2.jsp

<%@ page language="java" contentType="text/html; charset=UTF-16"
	pageEncoding="UTF-16"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-16">
<title>Insert title here</title>
</head>
<body>
<%=session.getAttribute("key") %>
</body>
</html>

请出我们的主角
dataServlet.java文件

package com.jd.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class dataServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.getRequestDispatcher("2.jsp").forward(request, response);
//		response.sendRedirect("2.jsp");
	}
}

操作步骤:

启动服务器,访问1.jsp,可以看到浏览器地址栏地址变为http://127.0.0.1:8080/nice/1.jsp,打开控制台可以看到
在这里插入图片描述
下边就是见证奇迹的时刻;

点击之后可以发现地址栏变成http://127.0.0.1:8080/nice/dataServlet,

在控制台可以看到
在这里插入图片描述

下边我们将dataServlet.java中注释掉的语句解开注释,将它上边那句注释掉,来演示重定向;

再次点击:

发现浏览器地址变为http://127.0.0.1:8080/nice/2.jsp

不仅如此控制台的输出结果也变为如下
在这里插入图片描述
通过这些信息我们可以知道,2.jsp的initiator(启动程序)是dataServlet,即请求的响应中包含了重定向的地址。

在重定向方式中,请求是页面重新发送的,所以在请求中获取不到原始要提交的数据。即使在重定向前对原始请求做了处理,也是徒劳的。原因是请求对象和响应的对象的生命周期只存在于一次请求和响应中。客户端第一次发出请求,此时的请求为请求A,服务器接收到请求,生成对应的响应,然后程序遇到重定向语句,无论此时的请求和响应是什么,响应都会变成固定的:状态码为302,响应数据中包含重定向的组件地址。在浏览器响应之后,请求A和响应都消失了,然后浏览器自动的发出新的请求B。

演示二

只需要改动一下dataServlet的一部分即可

package com.jd.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class dataServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	
		request.getRequestDispatcher("http://baidu.com").forward(request, response);
//		response.sendRedirect("http://baidu.com");
	}
}

启动服务器后,访问1.jsp,现在还没有出现问题呢,但是当我们点击之后
在这里插入图片描述
but如果我们注释掉上边的语句,解开下边语句的话再点击则是百度的页面了


推一篇说的比较通俗的
Servlet应用中重定向与请求转发的区别

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值