Dispatcher
请求转发与重定向的区别
- 请求转发只有一次请求和一次响应,重定向有两次请求和两次响应。
- 请求转发地址不发生改变,重定向会跳转到后一个请求的地址。
- 请求转发只能转发到本项目的其它Servlet,重定向不只能重定向到本项目的其它Servlet,还能重定向到其它项目。
- 请求转发是服务端行为,只需给出转发的Servlet路径,重定向需要给出requestURI,既包含项目名。
请求值传递
同一个请求范围内可以使用request.setAttribute()和request.getAttribute()来相互传值。前一个Servlet调用setAttribute()保存值,后一个Servlet调用getAttribute()获取值。
Dispatcher实例
DispatcherServlet主要用作职责调度工作,本身主要用于控制流程
Dispatcher的含义就是派遣器
eg RequestDispatcher,RequestDispatcher是一个接口,称为请求派遣器.主要方法是forward. 如下,通过request取得/login的RequestDispatcher,然后通过forward也就是转发获得request和response
request.getRequestDispatcher("/login").forward(request,response);
RequestDispatcher rd = request.getRequestDispatcher(“/MyServlet”); rd.forward(request, response); // 请求转发
rd.include(request, response); // 请求包含
无论是请求转发还是请求包含,都在一个请求范围内!使用同一个request和response。
- 请求转发:当前Servlet可以设置响应头,由下一个Servlet完成响应体,下一个Servlet输出响应体后,当前Servlet不可以继续输出!(留头不留体)
- 请求包含:当前Servlet可以设置响应头,由两个Servlet共同完成响应体,下一个Servlet输出响应体后,当前Servlet可以继续输出!(留头又留体)
视图解析原理
请求进入DispatcherServlet类,执行doService方法,doService方法中执行doDispatch方法:
-
通过request对象获得对应的handler对象(网址和方法的映射存在在HandlerMa