• Java第四十二天,Http协议,Request


    一、Request、Response原理

    1. Tomcat 服务器会根据请求ur1中的资源路径,创建对应的 XXXServlet 的对象
    2. tomcat服务器,会创建 request和response对象, request对象中封装请求消息数据。
    3. tomcat将 request 和 response 两个对象传递给service 方法,并且调用 serv⊥ce 方法
    4. 程序员,可以通过 request 对象获取请求消息数据,通过通过 response 对象设置响应消息
    5. 服务器在给浏览器做出响应之前会从 response 对象中拿程序员设置的响应消息数据

    二、Request 的继承体系结构

    ServletRequest (爷辈接口)

    HttpServletRequest (父辈接口)

    org.apache.catalina.connector.RequestFacade(实现类)

    三、请求转发和重定向

    1.请求转发

    一种在服务器内部的资源跳转方式

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        String path = "转发路径(即目的 Servlet 的 <url-pattern> url访问路径)";
        RequestDispatcher requestDispatcher = servletRequest.getRequestDispatcher(path);
        requestDispatcher.forward(servletRequest, servletResponse);
    }

    2.重定向

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 重定向状态码(告知浏览器要跳转)
        response.setStatus(302);
        // 进行重定向操作
        response.setHeader("location", "/test/second");
    }
    
    
    或者
    
    
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.sendRedirect("/test/second");
    }

    四、请求转发和重定向的区别

    1.请求转发

    • 浏览器地址栏不发生变化
    • 是服务器内部的资源跳转方式,不可访问外部资源
    • 多个资源之间使用的是一次请求,可以使用 Request 域对象来共享数据

    2.重定向

    • 浏览器地址栏发生变化
    • 重定向可以访问其他站点的资源
    • 重定向是两次请求,不能使用 Request 域对象来共享数据

    五、共享数据

    1.域对象

    一个有作用范围的对象,可以在范围内共享数据

    2.request域

    (1)定义

    代表 一次请求 的范围,一般用于请求 转发 的多个资源中共享数据

    (2)步骤

    // 设置值
    ServletRequest.setAttribute(String key, Object obj);
    
    //获取值
    ServletRequest.getAttribute(String key);
    
    //根据键移除键值对
    servletRequest.removeAttribute(String key);
    
    
    =====================================================
    
    
    //获取所有的返回值
    servletRequest.getParameterMap();
    
    //封装 获取的所有键值对 到 实体类对象
    Map<String, String[]> parameterMap = servletRequest.getParameterMap();
    BeanUtils.populate("要封装的实体类对象", parameterMap);

    (3)举例

    转发源 Servlet

    import javax.servlet.*;
    import javax.servlet.annotation.WebServlet;
    import java.io.IOException;
    
    @WebServlet("/second")
    public class Second implements Servlet {
        ......
    
        @Override
        public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
            // 目的 Servlet 的转发路径
            String path = "/first";
            RequestDispatcher requestDispatcher = servletRequest.getRequestDispatcher(path);
    
            servletRequest.setAttribute("key1", "value1");
            servletRequest.setAttribute("key2", "value2");
            servletRequest.setAttribute("key3", "value3");
    
            requestDispatcher.forward(servletRequest, servletResponse);
        }
    }
    

    转发目的 Servlet

    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    @WebServlet(urlPatterns = {"/first"})
    public class FirstServlet extends HttpServlet {
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println(req.getAttribute("key1"));
            System.out.println(req.getAttribute("key2"));
            System.out.println(req.getAttribute("key3"));
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("doPost......");
        }
    }
    

    浏览器访问

    效果

    六、BeanUtils

    1.功能

    用于封装 JavaBean(标准的 Java类:必须被 public修饰,必须提供空参构造函数,成员变量必须被 private 修饰,提供公共的 getter 和 setter 方法)

    2.成员变量和属性的区别

    一般情况下一致,但有时候不一致

    • 成员变量:类的所有成员变量
    • 属性:getter 和 setter 方法截取后的产物

    3.用方法

    • setProperty:设置属性值
    • getProperty:获取属性值
    • populate:封装 JavaBean 对象
    作者:蓝月

    -------------------------------------------

    个性签名:能我之人何其多,戒骄戒躁,脚踏实地地走好每一步

  • 相关阅读:
    Classview配置与访问
    MongoDB(NoSQL) 非关系型数据库
    服务器出现500错误的时候,让PHP显示错误信息
    Linux_目录介绍
    各类ip地址范围和私有地址范围
    Raid_磁盘冗余阵列
    Python_文件操作_读
    Git操作命令
    记录关于校园网登录不了腾讯的软件得问题解决
    关于科研方面分享的一些经验
  • 原文地址:https://www.cnblogs.com/viplanyue/p/13573679.html
Copyright © 2020-2023  润新知