首先,说一下转发和重定向的几个区别:
本质区别:请求的转发只发出了一次请求,而重定向则发出了两次请求。
具体几个就是:
1. 请求的转发:地址栏是初次发出请求的地址。
请求的重定向:地址栏不再是初次发出的请求地址。地址栏为最后响应的那个地址
2. 请求的转发:在最终的Servlet中,request对象和中转的那个request是用一个对象
请求的重定向:在最终的Servlet中,request对象和中转的那个request不是同一个对象
3. 请求的转发:只能转发给当前WEB应用的资源
请求的重定向 :可以重定向到任何资源
4. 请求的转发 :/ 代表的是当前WEB应用的根目录
请求的重定向:/ 代表的是当前WEB站点的根目录
跟着视频敲了两个小例子:
例子1:
首先我建立了一个简单的html页面,写了几个超链接
Insert title here然后建了一个类,继承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结果一样的。
pageEncoding="UTF-8"%>
Insert title hereAAA Page
pageEncoding="UTF-8"%>
Insert title hereBBB Page
//请求转发的代码
//request.getRequestDispatcher("c.jsp").forward(request,response);
//请求的重定向
response.sendRedirect("c.jsp");
%>
pageEncoding="UTF-8"%>
Insert title hereCCC Page
标签:重定向,request,JAVAEE,response,转发,import,servlet,javax
来源: https://blog.csdn.net/yangluxin763730141/article/details/95938606