【JAVAEE】转发和重定向

首先,说一下转发和重定向的几个区别:

本质区别:请求的转发只发出了一次请求,而重定向则发出了两次请求。

具体几个就是:

1. 请求的转发:地址栏是初次发出请求的地址。

请求的重定向:地址栏不再是初次发出的请求地址。地址栏为最后响应的那个地址

 

2. 请求的转发:在最终的Servlet中,request对象和中转的那个request是用一个对象

请求的重定向:在最终的Servlet中,request对象和中转的那个request不是同一个对象

 

3. 请求的转发:只能转发给当前WEB应用的资源

请求的重定向 :可以重定向到任何资源

4. 请求的转发 :/ 代表的是当前WEB应用的根目录

请求的重定向:/ 代表的是当前WEB站点的根目录

跟着视频敲了两个小例子:

例子1:

首先我建立了一个简单的html页面,写了几个超链接

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<a href="loginServlet">Test</a>
	
	<br><br>
	
	<a href="forwardServlet">Forward</a>
	
	<br><br>
	
	<a href="redirectServlet">Redirect</a>
</body>
</html>

然后建了一个类,继承Servlet,重写doGet方法,这个类就是我最后要去的那个Servlets 

package com.demoJavaWeb;

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

@WebServlet("/testServlet")
public class TestServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("TestServlet's doGet");
		
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}

}

首先来看转发,我写一个转发的Servlet, 利用request.getRequestDispatcher().forward(request, response)实现转发。

主要的过程就是我在html页面里,点击ForwardServlet,然后通过里边的转发方法,将页面跳转到TestServlet里边,但是观察可以发现,页面上方的地址栏的地址并没有发生改变,即现实的还是ForwardServlet。

package com.demoJavaWeb;

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

@WebServlet("/forwardServlet")
public class ForwardServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("forwardServlet's doGet");
		
		//请求的转发
		//1.调用HttpServletRequest的getreQuestDispatcher()方法获取RequestDispatcher对象
		//调用getRequestDispatcher()需要传入要转发的地址
		String path = "testServlet";
		RequestDispatcher requestDispatcher = request.getRequestDispatcher("/"+path);
		
		//2.调用HttpServletRequest的forward(request,response);进行请求的转发
		requestDispatcher.forward(request, response);
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}

}

 

同时控制台会打印出来 

 

现在来说重定向 

我建了一个RedirectServlet,同样继承Servlet,重写doGet()方法,利用response.sendRedirect(path);实现请求的重定向。

package com.demoJavaWeb;

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

@WebServlet("/redirectServlet")
public class RedirectServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	
		System.out.println("RedirectServlet's doGet 方法。");
		
		//执行请求的重定向,直接调用response.sendRedirect(path)方法
		//path为要重定向的地址
		String path = "testServlet";
		response.sendRedirect(path);
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}

}

可以看到地址栏变为 

同时下边打印的 

例子2

三个jsp文件,分别是a.jsp b.jsp c.jsp

现在想要实现的就是从a.jsp到b.jsp,然后b进行转发和重定向的操作到c,结果是和例子1结果一样的。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>AAA Page</h1>
	<a href="b.jsp">To B Page</a>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>BBB Page</h1>
	
	<%
	
	//请求转发的代码
	//request.getRequestDispatcher("c.jsp").forward(request,response);
	
	//请求的重定向
	response.sendRedirect("c.jsp");
	
	%>
	
	
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>CCC Page</h1>
	
</body>
</html>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值