请求重定向(四种方法)

本文详细解析了Web开发中请求转发与重定向的工作原理及使用场景。对比了转发与重定向的区别,包括浏览器地址栏的变化、响应头信息的处理等,并通过示例代码展示了具体的实现方法。

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

.转发与重定向细节(实际开发中知道一个原则)

RequestDispatcher有包含和转发两种功能

1.请求转发(getRequestDispatcher("").forward(request,response)

请求转发:由源组件转发到目标组件时,容器会清空源组件输出的数据,给目标干净的东西,所以用户只会看到目标组件输出的页码结果,

但是响应头信息是不清空的

编码原则:不要在转发前后向后页面输出数据(不用功)

2.包含(动态包含)

(getRequestDispatcher("").include(request,response))

由源组件包含到目标组件时,容器会清空目标组件的头 。因此,源组件设置的头才有效。

但是,响应体信息是不清空的

编码原则:不要在目标组件中设置响应头(无用功)

===========================================^^^^^^^文章总结^^^^^^^^^==============================================================


-------------------------------->用response.sendRedirect()做转向其实是向浏览器发送一个特殊的Header,然后由浏览器来做转向,转到指定的页面,所以用sendRedirect时,浏览器的地址栏上可以看到地址的变化。(请求重定向)

package cn.ITHong.Response;


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 ResponseDemo7 extends HttpServlet {



public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// response.setStatus(302);
// response.setHeader("location", "http://www.baidu.com");
response.sendRedirect("http://www.baidu.com");

}




public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {



}


}

-------------------------------------------------------     第二种 请求转发 ------------------------------------------------------------

-----------------------------------------        以下的浏览器地址栏不会改变还是         ----------------------------------------------

-----------------------------------------        本地址栏:http://localhost:8080/Web07/servlet/RequestDemo4 ------------

----------------------------------------       后地址栏: http://localhost:8080/Web07/servlet/RequestDemo4 ------------

------------------------------------------------------------------------------------------------------------>RequestDemo4.java(释放类)

package cn.ITHong.Request;

import java.io.IOException;


import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class RequestDemo4 extends HttpServlet {


	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setContentType("text/html;charset=UTF-8");
		request.setAttribute("p", "request");
		response.getWriter().write("释放完毕");
		RequestDispatcher rd =request.getRequestDispatcher("/servlet/RequestDemo5");
		rd.forward(request, response);
	
	}


	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}


------------------------------------------------------------------------------------------------------------->RequestDemo5.java(被重定向的类)

package cn.ITHong.Request;


import java.io.IOException;
import java.io.PrintWriter;


import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class RequestDemo5 extends HttpServlet {


	
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setContentType("UTF-8");
		String value =(String) request.getAttribute("p");
		response.getWriter().write(value.toString());
	}


	
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {


		doGet(request, response);
	}


}

-------------------------------------------------------------------------------------------->第三种方法

总结:与第二种的区别

第三种:RequestDispatcher rd = ServletContext.getRequestDispatcher(目标资源的URI);

第二种:  RequestDispatcher rd = ServletRequest.getRequestDispatcher(目标资源的URI);

区别:

方式三中的目标资源的URI 必须以“/”开头,不然报错,此斜线表示当前应用

   


方式二中的目标资源的URI 如果以“/”开头,表示当前应用(绝对路径表示法),如果不已“/”开头,   表示相对路劲

http://localhost:8080/Web07/servlet/RequestDemo5源

http://localhost:8080/Web07/servlet/RequestDemo6目标

则目标为RequestDemo6(相对源)


http://localhost:8080/Web07/servlet/RequestDemo5源

http://localhost:8080/Web07/servlet/a/RequestDemo6目标

则目标为a/RequestDemo6(相对源)



http://localhost:8080/Web07/servlet/RequestDemo5源

http://localhost:8080/Web07/RequestDemo6目标

则目标为../RequestDemo6(相对源)


package cn.ITHong.Request;

import java.io.IOException;



import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class RequestDemo4 extends HttpServlet {


	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setContentType("text/html;charset=UTF-8");
		request.setAttribute("p", "request");
		response.getWriter().write("释放完毕");
		
		ServletContext sc = getServletContext();
		RequestDispatcher rd =sc.getRequestDispatcher("/servlet/RequestDemo5");
		rd.forward(request, response);
	
	}


	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}

============================================================================================================

答案:只会在浏览器显示I'm eight   这个例子中 就像

只执行了 RequestDemo6.java.

具体:请求重定向

--------------------------------------------------------------------------------------------------------------------------RequestDemo6.java(源)

package cn.ITHong.Request;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class RequestDemo6 extends HttpServlet {

	
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		PrintWriter out = response.getWriter();
		out.print("seven forward before");//会执行,但是Httpservletquest内容会被清空
		
		request.getRequestDispatcher("/servlet/RequestDemo7").forward(request, response);//重定向
		out.print("seven forward after");<span style="font-family: Arial, Helvetica, sans-serif;">//会执行,但是Httpservletquest内容会被清空</span>

	}

	
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	
	}

}


--------------------------------------------------------------------------------------------------------------------------RequestDemo7.java(目标:重定向地址)

package cn.ITHong.Request;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class RequestDemo7 extends HttpServlet {


	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		PrintWriter out = response.getWriter();
		out.print("I'm eight");
	
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

	doGet(request, response);
	}

}



### Java Web请求重定向的实现方式 在 Java Web 开发中,请求重定向是一种常见的机制,用于通知客户端访问其他资源。这种方式通常通过 `HttpServletResponse` 对象中的方法来实现。 #### 使用 `sendRedirect()` 方法 最常用的实现方式是调用 `HttpServletResponse` 的 `sendRedirect(String url)` 方法。此方法会向客户端发送一个状态码为 302 的 HTTP 响应,并附带目标 URL 地址作为响应头部的一部分。以下是具体示例: ```java protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 设置编码格式 response.setContentType("text/html;charset=UTF-8"); // 执行重定向操作 response.sendRedirect("/login.jsp"); // 将用户重定向至 login.jsp 页面 } ``` 上述代码片段展示了如何将用户的请求从当前页面重定向到 `/login.jsp` 页面[^4]。 #### 利用状态码和 Location 头部手动设置 除了直接使用 `sendRedirect()` 方法外,还可以手动设置 HTTP 状态码以及 `Location` 响应头字段来进行重定向。这种方法更加底层,适用于某些特殊场景下的自定义需求。 ```java protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 设置编码格式 response.setContentType("text/html;charset=UTF-8"); // 手动配置HTTP状态码与位置信息 response.setStatus(HttpServletResponse.SC_FOUND); // 或者写作302 response.setHeader("Location", "/targetPage.jsp"); // 定义跳转的目标地址 } ``` 这里设置了 HTTP 状态码为 302 (`SC_FOUND`) 并指定了新的目标路径 `/targetPage.jsp`。 --- ### 请求重定向的特点 需要注意的是,相比于 **请求转发**(Request Forwarding),请求重定向具有以下几个显著特点: 1. 请求重定向会导致浏览器发起一个新的请求; 2. 浏览器地址栏显示的内容会发生变化; 3. 整个过程涉及两次网络交互:第一次是从原始服务器返回给客户端;第二次是由客户端再次发出的新请求到达最终目的地[^2]。 这些特性决定了其适合应用于跨域跳转或者需要完全刷新视图的情况下,比如用户成功登录后被引导至首页等业务逻辑处理完毕后的界面切换场合。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值