一、转发与重定向
1、简介
-
什么是转发
- 同一个请求作用域里面,从一个目标组件(jsp/Servlet)跳转到另一个目标组件(jsp/Servlet),url地址是不会发生改变的
-
什么是重定向
- 它其实也是从一个目标组件跳转到另一个目标组件,但不是在同一个请求作用域里面,并且url地址是发生改变的
2、原理问题
-
如图以下描述
结论 -
转发是属于同一个请求对象
-
重定向是属于不同的请求对象,并且url地址会发生改变
3、如何实现转发
- 实现转发有两种方式
写法一:
getServletContext().getRequestDispatcher("/BServlet").forward(request,response);
写法二:
request.getRequestDispatcher("/BServlet").forward(request,response);
举例
- AServlet
package servlet;
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(value = "/AServlet")
public class AServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("当前是A servlet");
//将数据存储到request对象
request.setAttribute("username","tom");
//转发到B Servlet组件
//request.getRequestDispatcher("/BServlet").forward(request,response);
getServletContext().getRequestDispatcher("/BServlet").forward(request,response);
}
}
- BServlet
package servlet;
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;
import java.io.PrintWriter;
@WebServlet(value = "/BServlet")
public class BServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse resp) throws ServletException, IOException {
String username= (String) request.getAttribute("username");
resp.setCharacterEncoding("UTF-8");
//设置响应文档类型
resp.setContentType("text/html");
PrintWriter pw=resp.getWriter();
pw.println("<html>");
pw.println("<