Servlet请求转发与请求重定向
请求转发
请求转发是指,服务器获取请求后,通过多个Servlet程序来处理请求的过程
代码实现
Servlet1
public class Servlet1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取参数
System.out.println("Servlet1获取的参数:" +req.getParameter("p"));
//设置标记
req.setAttribute("mark","replay");
//获取调度器 参数为转发地址
RequestDispatcher requestDispatcher = req.getRequestDispatcher("/Servlet2");
//转发
requestDispatcher.forward(req,resp);
}
Servlet2
public class Servlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取参数
System.out.println("Servlet2获取的参数:" + req.getParameter("p"));
//检查标记(标记存储于request域中,对于同一个request,attribute共享,这就使得在请求转发中多个servlet程序可以共同查看)
Object mark = req.getAttribute("mark");
System.out.println("获取标记:" + mark);
//有标记进入数据的二次处理
if ("replay".equals(mark)){
System.out.println("处理数据");
}
}
结果:
请求转发的特点
- 请求转发浏览器地址不改变
- 请求转发是一次请求(一进一出)
- 请求转发共享request中的数据(因为是一次访问,不论几个servlet,request都是同一个,所以储存在request中的数据被多个共享)
- 请求转发可以访问WEB-INF目录 (Tomcat介绍及其使用详解.md 受访问限制的目录,浏览器无法直接访问)
- 请求转发不能访问外部文件(因为请求转发调度器从’/‘开始访问,’/'代表工程路径,这意味着请求转发只能访问工程目录下的文件)
请求重定向
请求重定向是指,之前发送的请求目标已经过时,需要重新发送请求到另一个目标
代码实现
ServletRD1
public class ServletRD1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("ServletRD1已经过时了,现在重新定向到ServletRD2");
//设置状态码,重定向状态码为302
resp.setStatus(302);
//通过响应头设置重定向目标(Location)
resp.setHeader("Location","http://localhost:8080/WebTest02_Maven/ServletRD2");
}
}
ServletRD2
public class ServletRD2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html; charset=UTF-8");
resp.getWriter().write("请求重定向成功");
}
}
请求重定向特点
- 请求重定向之后浏览器地址改变
- 请求重定向是多次请求(多进多出)
- 请求重定向中request域资源不共享(因为是多次请求,所以是多个request,request域资源只有同一个request时才会共享)
- 请求重定向无法访问WEB-INF(浏览器访问受限的目录)
- 请求重定向可以访问外部资源(与请求转发不同,请求重定向不需要调度器,不是在自己的工程目录下,而是重新设置一个发送请求目标,可以访问除受限资源之外的任何资源)
WEB-INF(浏览器访问受限的目录)
- 请求重定向可以访问外部资源(与请求转发不同,请求重定向不需要调度器,不是在自己的工程目录下,而是重新设置一个发送请求目标,可以访问除受限资源之外的任何资源)
尚硅谷学习笔记总结!