zoukankan      html  css  js  c++  java
  • 【Head First Servlets and JSP】笔记10:请求分派(RequestDispatcher)

    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、属性作用域

  • 相关阅读:
    eureka流程图
    Feign和Ribbon的重试机制
    idea编译kafka 2.6 源码
    Feign的调用流程
    FeignClientFactoryBean创建动态代理
    Feign源码的入口
    Ribbon的检查服务
    Ribbon是怎么和Eureka整合的?
    Eureka过期
    backup: sqlHelper --cSharp
  • 原文地址:https://www.cnblogs.com/xkxf/p/6939610.html
Copyright © 2011-2022 走看看