请求和响应详解(request&response)


  • request请求对象

本文记录我在java的学习之路。

一、Request请求对象介绍

  • 介绍
     1.请求:获取资源。
       在BS架构中,就是客户端浏览器向服务器发出的一次请求。

   2. 请求对象:
    ServletRequest
    httpServletRequest

二、Servlet继承结构

在这里插入图片描述

三、底层执行流程

  1. 服务器创建Servlet对象后、创建request请求和response响应对象;
  2. request对象用于封装HTTP在当次请求中的数据;
    response对象用于封装响应给客户端浏览器的数据;
  3. 服务器会调用Servlet对象的service()方法。将request对象和response对象作为参数传递给service()方法;
  4. 我们再使用请求和响应对象对数据进行操作;
  5. 服务器在进行响应之前会将response对象中的数据编译成HTTP响应的格式,响应给浏览器。

四、请求对象中常用方法


  • 获取路径

在这里插入图片描述
  URI:统一资源标识符;由项目虚拟目录/Servlet映射路径组成,访问内部资源居多;
  URL:统一资源定位符;浏览器访问路径;访问项目外部的资源就使用URL;
在这里插入图片描述

 		//获取统一资源标识符:虚拟路径/Servlet映射路径
        System.out.println("获取统一资源标识符:"+req.getRequestURI());
        //获取统一资源定位符: 浏览器的访问地址
        System.out.println("获取统一资源定位符:"+req.getRequestURL());
        //获取当前项目虚拟目录
        System.out.println("获取虚拟目录:"+req.getContextPath());
        //获取资Servlet映射路径
        System.out.println("获取Servlet映射路径:"+req.getServletPath());
        System.out.println("获取访问者ip地址:"+req.getRemoteAddr());

运行结果:
在这里插入图片描述


  • 获取请求头

在这里插入图片描述


  • 获取请求参数信息

在这里插入图片描述
注意:
  1. getParameterNames():
  注意看返回值,返回的是枚举;

  2. getParameterMap():
  返回的是一个map集合,通过map集合,获取到键值对,有keyset()和entrySet()两个方法;
通过键找值,返回的是一个字符串数组,可使用Arrays的alist方法去方便打印。
在这里插入图片描述


  • 流对象获取请求信息

在这里插入图片描述
注意:用于获取请求体,主要用于post请求方式。


五、获取请求参数并封装成对象

1. 手动封装方式
  (1) 先获取数据,getParameter
  (2) 拿到数据封装到学生对象
  (3) 打印学生对象

2. 反射封装方式
   基于反射的技术–内省(专门用于操作对象的get和set方法的)

  ①先拿到所有的请求参数:getparameterMap();
  ②遍历集合,KeySet拿到所有的key,通过key拿到value数组;
  ③获取学生对象的属性描述器: PropertyDescriptor( 通过key,拿到的是当前key所对应的get和set方法);
  ④获取对应的set方法:getWriteMethod();
  ⑤执行方法:invoke();
注意:属性描述器要传入两个参数,对应的key和学生对象的class对象;

3. 工具类封装方式
  ①第三方的beanutils工具封装参数;
  ②
在这里插入图片描述

前提: 学生类的属性名必须和标签的name一一对应;

六、请求行和请求头的说明

  • 请求行:请求方式 请求路径(包含请求参数)协议/版本;
  • 请求头:浏览器告知服务器的一些额外信息,格式是键值对;
  • 通常是一个key对应一个value,也有一个key对应多个value的情况。
  • 常见的请求头:
        User-Agent:客户端浏览器的相关信息(浏览器类型,版本等);
        referer:网页来源(从哪跳转过来的)
        cookie:客户端会话技术所需要的请求头。

七、中文乱码问题

请求参数的中文乱码

  • GET方式:没有乱码问题。在Tomcat 8.5版本后已经解决。
  • POST方式:有乱码问题,可以通过setCharacterEncoding()方法解决。

八、请求域

概述: 可以在一次请求范围内进行共享数据(即发起请求到响应结束)。
作用: 一般用于请求转发的多个资源中共享数据。
常用方法:
在这里插入图片描述

九、请求转发(重点)

  • 请求转发: 客户端的一次请求到达后,发现需要借助其他Servlet来实现功能;整个操作都在一次请求内。
  • 打个比方:你的老板让你改一下ppt,你把ppt发给你的下一级去修改,最后由你的下一级将ppt返回给你的老板。
  • 特点:
      浏览器地址栏不变;
      由于是在一次请求内,所以域对象中的数据不会丢失;
      负责转发的Servlet转发前后的响应正文会丢失;
      由转发的目的地来响应客户端;
  • 方法:
    在这里插入图片描述
    注意:getRequestDispatcher()方法里面传的是你要转发的页面的路径。
    图示:
    在这里插入图片描述

十、请求包含

  • 请求包含: 可以合并其他Servlet中的功能一起响应给客户端。

  • 特点:
      浏览器地址栏不变;
      域对象中的数据不丢失;
      被包含的Servlet响应头会丢失;
    在这里插入图片描述
    注意:请求包含跟请求转发用法一样。

  • 响应对象

一、Response响应对象介绍

响应: 回馈结果。
在BS架构中,就是服务器给客户端浏览器反馈结果。

响应对象: 就是在项目中用于发送响应的对象。

二、 常见的状态码

在这里插入图片描述

三、字节流响应消息

在这里插入图片描述
代码演示:
在这里插入图片描述

四、字符流响应消息

在这里插入图片描述
注意:缓冲字符输出流内部有一个缓冲区,这个缓冲区的默认字符集是ISO-8859-1;
一般把设置编码的代码放在过滤器中

五、设置缓存

  • 缓存: 对于不经常变化的数据,我们可以设置合理缓存时间,以避免浏览器频紧请求服务器。以此来提高效率。
    在这里插入图片描述

六、定时刷新(重点)

  • 定时刷新: 过了指定时间后,页面自动进行跳转。
    在这里插入图片描述
    图示:
    在这里插入图片描述
    注意:
      定时刷新是通过设置响应头的方式来完成的;
      同时定时刷新也是请求重定向

七、请求重定向(重点)

  • 概念: 重定向。我们可以选择让别人来为我们处理响应,把请求重定向到一个完全不同的URL,或者可以把请求分派给Web应用的另一个组件(通常是一个JSP)。

    重定向需要用到 :request.sendRedirect(重定向路径) ,注意要使用相对URL。

  • 实现重定向的方式:
     1. 标准方式:(设置请求头和状态码)
    在这里插入图片描述
     2. 简写形式:
    在这里插入图片描述
    在这里插入图片描述

八、转发和重定向的区别

  最终实现的功能是相同的。不同之处如下。

  • 地址栏变化

    转发: 不改变地址栏中的URL;
    重定向: 改变地址栏;

  • 跳转范围

   转发: 只能访问到当前web应用中的内容;
   重定向: 则可以访问到任意web应用中的内容;

  • request对象作用范围

   转发: 在转发后的页面中仍然可以使用原来的request对象;
   重定向: 原来的request对象则失去作用;所以,如果想要在多个页面使用相同的request对象,那么只能使用转发,而不能使用重定向。
注意:
  这一句话意思是,重定向其实是发生了两次请求,而request的请求域作用范围是一次请求内,所以不能实现数据共享。
  要想实现数据共享,要么提升作用域,要么只能在当前作用域范围能实现对应的操作。

九、文件下载

概述: 即浏览器上显示的文件,你不希望用户直接可以查看到,而已以附件的方式展示给用户,让用户下载;

  • 文件下载的操作步骤:
  1. 创建字节输入流,关联读取的文件。
  2. 设置响应消息头支持的类型。
  3. 设置响应消息头以下载方式打开资源。
  4. 通过响应对象获取字节输出流对象。
  5. 循环读写。
  6. 释放资源。
  • 文件下载记忆方式

两头流:
两个响应头

  1. Content-Type: 告知响应体的数据类型(mime类型)
  2. Content-Disposition: 告知浏览器不要渲染响应体,以附件形式处理。

输入流和输出流的对接:

  1. 输入流: 关联文件的输入流
  2. 输出流: 通过响应对象获取的输出流
  • 34
    点赞
  • 290
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值