HTTP协议--Response笔记

主要内容

1.HTTP协议:响应消息
2.Response对象
3.ServletContext对象

HTTP协议

1.请求消息:客户端向服务器端发送的数据
* 数据的格式(request请求消息的数据格式)
1.请求行
2.请求头
3.请求空行
4.请求体
2.响应消息:服务器向客户端发送的数据
* 数据格式(response响应消息的数据格式)–>与request数据格式相类似
1.响应行
1.组成:协议/版本号 响应状态码 状态码描述 ----->HTTP/1.1 200

2.响应状态码:服务器告诉客户端(浏览器)本次请求和响应的一个状态
1.状态码都是数字
2.状态码分类:
1xx:(特殊),服务器等待一段时间未继续受到消息后,询问客户端是否还有数据
2xx:(成功),数据交接成功,代表状态码:200
3xx:(重定向,让客户端重新访问其他服务地址);302(让客户端重新访问其他服务器);304(让客户端重新访问本地缓存)
4xx:客户端错误; 404(请求路径错误,服务器没有相应的资源);405(请求方式没有对应的doxxx方法;例如get请求方式,服务器没有doget方法)
5xx:服务器端错误;500(服务器内部出现异常)
2.响应头
与request请求消息头类似;也是键值对形式存在的;
格式为–> 头名称:值
常见的响应头:
* Context-Type:服务器告诉客户端本次响应体的数据格式,以及编码格式
* Content-disposition:服务器告诉客户端以什么形式打开响应体数据
* 值:
* in-line:默认值,在当前页面打开
* attachment;filename=xxx:以附件形式打开响应体,用于文件下载,需告知文件的名字
3.响应空行
用来分隔响应头与响应体
4.响应体
用来传输的数据

  • 响应字符串
    HTTP/1.1 200
    Content-Type: text/html;charset=UTF-8
    Content-Length: 117
    Date: Tue, 10 Sep 2019 02:50:10 GMT
	<html>
        <head>
          <title>$Title$title>
        head>
        <body>
        欢迎您来到Response课堂!
        body>
    html>

Response对象

  • 功能:设置响应消息
    1.设置响应行
    1.格式:HTTP/1.1 200
    2.设置状态码:void setStatus(int sc)
    2.设置响应头
    void setHeader(String name, String value)
    3.设置响应体
    使用步骤:
    1.获取输出流
    * 字符输出流:PrintWriter getWriter()
    * 字节输出流:ServletOutputStream getOutputStream()
    2.使用输出流,将数据输出到客户端浏览器

  • 案例
    1.完成重定向
    *重定向:资源跳转的方式
    *代码实现:
    1.告诉浏览器重定向;
    设置状态码为302 response.setStatus(302)
    2.告诉浏览器其他资源的路径;
    设置响应头location response.setHeader(“location”, “/虚拟路径/其他的资源路径”)
    //简单的重定向方法
    response.sendRedirect("/虚拟路径/其他的资源路径")

    • forward 和 redirect 的区别
      *重定向的特点 redirect
      1. 地址栏发生变化
      2. 重定向可以访问其他站点(服务器)的资源
      3. 重定向是两次请求。不能使用request对象共享数据域
      *转发的特点 forward
      1. 地址栏路径不变
      2. 转发只能访问当前服务器下的资源
      3. 转发是一次请求,可以使用request对象来共享数据

      *路径的写法
      路径的分类
      1. 相对路径:不能确定唯一的资源
      * 不以/开头,以.开头的路径;如./index.html
      * 规则:要明确当前资源和目标资源之间的相对位置关系
      1.当前目录:./
      2.后退一级目录:…/
      2. 绝对路径:可以确定唯一的资源
      * 以/开头的路径
      如:http://localhost/response/responseDemo1 /response/responseDemo1
      * 规则:要明确定义的路径是给谁用的?,也即,要判断请求将来是从哪发出的(此处指的是request的请求路径)
      1.给客户端浏览器使用:需要加上虚拟目录
      * 建议虚拟目录采用动态获取方式: request.getContextPath()
      * 超链接(),表单() ,重定向…
      2.给服务器使用的:不需要加虚拟目录
      * 转发路径

    2.服务器输出字符数据到浏览器
    * 步骤:
    1. 获取字符输出流
    PrintWriter pw = response.getWriter();
    2. 输出数据
    pw.write(“你好,欢迎来到response课堂!”);
    * 注意:
    * 乱码问题
    1.获取的字符流编码格式默认是ISO-8850-1的
    2.故在获取之前需要设置该流的默认编码
    3.还需要告诉浏览器应使用的解码方式
    * 代码

   //1.设置流的编码格式,默认是ISO-8859-1;设置为utf-8
   //request.setCharacterEncoding("utf-8");
   /*
   2.告知浏览器解码格式;此步骤也会将流的编码格式修改为与浏览器的一至;
   故上面的设置流的编码格式便多余了
   */
   //response.setHeader("Content-type", "text/html;charset=utf-8");
   //有个方法可以直接设置Content-Type响应头的值
   response.setContentType("text/html;charset=utf-8");
   //3.获取字符输出流
   PrintWriter pw = response.getWriter();
   //4.输出数据
   pw.write("你好,欢迎来到response课堂!");

3.服务器输出字节数组到浏览器
* 此过程与输出字符流相类似;只不过获取的使字节流
ServletOutputStream sos = response.getOutputStream();
* 代码

    //设置Content-Type响应头的值,设置解码格式为utf-8
    response.setContentType("text/html;charset=utf-8");
    //1.获取字节输出流
    ServletOutputStream sos = response.getOutputStream();
    //2.输出数据,设置输出编码格式为utf-8
    sos.write("你好,欢迎来到response课堂!".getBytes("utf-8"));

4.验证码案例详细内容

ServletContext对象

  1. 概念:代表整个web应用,可以和程序的容器(服务器)来通信
  2. 获取:
    1. 通过request对象来获取
      request.getServletContext();
    2. 通过HttpServlet获取
      this.getServletCongtex();
  3. 功能
    1. 获取MIME类型
      *MIME类型:
      在互联网通信过程中,定义的一种文件数据类型
      *MEME类型的格式
      大类型/小类型 如:text/html image/jpeg
      *获取MIME类型
      String mimeType = context.getMimeType(filename);

    2. 域对象:共享数据

      • 操作共享数据的方法
        1.setAttribute(String name, Object value)
        2.getAttribute(String name)
        3.removeAttribute(String name)
      • 共享数据的范围:
        对所有用户的所有请求的数据都可共享
    3. 获取文件的真实路径(服务器路径)
      *仍需注意文件部署的相对路径

      1. 部署在web目录下的文件
        /文件名

      2. 部署在WEB-INF目录下的文件
        /WEB-INF/文件名

      3. 部署在src目录下的文件
        /WEB-INF/classes/文件名
        *该文件的真实路径就是该web项目的路径加上相对路径

      4. classLoader方式获取的文件只能是src下的文件,并不能获取web目录下的文件

      • 测试文件真实路径的输出
        D:\IEDAWorkSpace\out\artifacts\Response_war_exploded\a.txt
        D:\IEDAWorkSpace\out\artifacts\Response_war_exploded\WEB-INF\b.txt
        D:\IEDAWorkSpace\out\artifacts\Response_war_exploded\WEB-INF\classes\c.txt

你可能感兴趣的:(java-web)