【Head First Servlets and JSP】笔记10:请求分派(RequestDispatcher)

时间:2022-06-11 21:07:15

1、让其它组件接管全部请求。

package com.example.web;

import com.example.model.BeerExpert;

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;

public class BeerSelect extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String c
= req.getParameter("color");

BeerExpert be
= new BeerExpert();
List result
= be.getBrands(c);

req.setAttribute(
"styles", result); // 为请求增加一个属性,供JSP使用。

RequestDispatcher view = req.getRequestDispatcher("result.jsp"); // 为JSP实例化一个请求分派器

view.forward(req, resp); // 使用请求分派器要求容器准备好JSP,并向JSP发送请求和响应

}
}

这里我有一个疑惑,为什么不是sendRequest("result.jsp");,而是先要获得一个Requestdispatcher,然后再forward,前者不是更一目了然吗?然而并不存在一个这样的方法,或许是拆分成原子更便于自定义。

BTW:在搜索资料过程中的意外收获:What is the difference between response.sendRedirect() and request.getRequestDispatcher().forward(request,response) [duplicate]

 

2、RequestDispatcher揭秘。

从哪里获得RequestDispatcher?

ServletRequest或者ServletContext对象,方法名是getRequestDispatcher

两者的差异:

  1. ServletRequest,可以使用相对路径,使用绝对路径也没问题!
  2. ServletContext,必须使用绝对路径,也就是路径开头必须是“/”。

如何使用RequestDispatcher?

  1. 调用forward()。很简单,把请求和响应作为参数传进去就可以了。
  2. 需要注意的,不要在响应提交(例如os.flush)之后forward(),这样做是非法的。

 

3、属性作用域

【Head First Servlets and JSP】笔记10:请求分派(RequestDispatcher)