Servlet之请求转发和重定向
简介:在程序中我们经常需要从一个页面调到另一个页面,或者是在维护时为了不丢用户,会用到一种页面跳转的技术,而请求转发和重定向就是解决这种问题的方法。
一、请求转发 (RequestDispatcher)
请求转发是一种内部的转发,在同一个项目中的url在服务器内部跳转,可以用请求转发
使用方式:req.getRequestDispatcher("uri").forward(req, resp);
// getRequestDispatcher()只是请求的地址(默认从上下文路径开始)
.forward(request, response) 是将请求的参数带到转发的页面
1、多个Servlet共享一个request对象(重点)
2、一次请求,当转发结束的时候也就是业务处理完毕的时候request对象会被销毁
3、地址栏不改变
(所以说浏览器只是请求了一次,而服务器会在内部转发)
4、request对象的作用域(重中之重)
作用域:共享request对象的Servlet
作用域中存取数据:
req.setAttribute(key,value)
req.getAttribute(key)
req.removeAttribute(key)
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 RequestDispatcher extends HttpServlet {
/**
*
*/
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
/* 当页面有请求到此servlet中时,如果需要请求其他url,则需要使用到请求转发将某个请求请求转发到其他url,但前提是同一个项目中的url */
//请求转发是直接将请求推送到转发的地址,请求的参数也会被保留,所以浏览器只发一次请求
request.getRequestDispatcher("SessionServlet").forward(request, response);
// getRequestDispatcher只是请求的地址默认从上下文路径开始 .forward(request, response)是请求的参数
return;
// 注意在执行转发完毕后会继续执行代码,但是没有意义,所以一般在转发后面加return
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
}
}
二、重定向(SendRedirect)
重定向是给浏览器响应给浏览器一个300-399的状态码,和设置的新地址,然后浏览器会根据新地址,重新请求一次。 唯一的优点就是可以跨域(访问其他网站)
使用:resp.sendRedirect("uri");
特点:
地址栏改变
两次请求,两个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 SendRedirect extends HttpServlet {
/**
*
*/
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//设置响应的编码格式
response.setContentType("text/html");
//设置输出流响应到浏览器
PrintWriter out = response.getWriter();
out.print("页面已搬家");
//设置重定向(因为这种操作是浏览器做的,所以需要给浏览器响应)
response.sendRedirect("https://www.baidu.com");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
}
}
总结:
1.调用方式:
A请求转发 是调用requesgetRequestDispatcher("url).forward(request, response);
B重定向是 调用response。sendRedirect(“url”);
2.请求次数:
A请求转发 浏览器只请求一次,地址栏不发生变化
B重定向 浏览器会请求两次,地址栏发生变化,
3.跳转方式:
A请求转发 服务器会在内部转发到请求位置 (由服务器跳转)
B重定向 服务器在第一次请求时响应给浏览器 重定向状态(状态码)和url,浏览器根据响应重新请求(由浏览器跳转)
4.地址不同:
A请求转发 只能在同一个项目的服务器中请求转发的地址
B重定向 不但可以在同一个项目服务器中请求,还可以跨域请求其他的资源地址(这也是重定向唯一的优点)
5.参数不同:
A请求转发 参数保留( 会调用forward(request, response);将参数传到转发的位置)
B重定向 参数丢失(只会给浏览器响应对应的状态和url)