Response学习笔记

# 学习内容

     1. HTTP 协议 :响应消息

     2. Response 对象

     3. ServletContext对象


## HTTP协议: 

   1. 请求消息 : 客户端发送给服务端的数据

       * 数据格式 :

         (1 请求行

         (2 请求头

         (3 请求空行

         (4 请求体

   2. 响应消息 : 服务端发送给客户端的数据

      * 数据格式

           (1 响应行

                   a. 组成 : 协议/版本   响应状态码  状态码描述

                   b. 响应状态码: 服务器告诉客户端浏览器本次请求和响应的状态

                         1. 状态码都是3位数字

                         * 分类:5类

                              1. 1xx: 服务器接受客户端消息,但没有接收完成,等待一段时间后,发送1xx的状态码

                              2. 2xx:成功。  代表 :200

                              3. 3xx : 重定向。 代表  : 302 (重定向)  304 :访问缓存

                              4. 4xx : 客户端错误。

                                      *  代表 :

                                            (1. 404 (请求路径没有对应的资源)

                                            (2. 405 : 请求方式没有对应的doxxx(doGet/doPost)方法

                              5. 5xx : 服务器端错误。代表: 500(服务器内部出现异常)

              

          (2 响应头 :

                   a . 格式 : 头名称 : 值

                   b. 常见的响应头 : 

                         1. Context-Type: 服务器告诉客户端,本次响应体数据格式以及编码格式  Content-Type:  text/html;charset=UTF-8

                         2. Content-disposition : 服务器告诉客户端以什么格式打开响应体数据

                              * 值 :

                                      * in-line :默认值 ,在当前页面内打开

                                      * attachment;filename=xxx : 以附件形式打开响应体 ——文件下载(在浏览器中点击一个超链接后,不会打开,而是弹出一个下载)

          (3 响应空行

          (4 响应体

* 响应字符串格式:

    HTTP/2.0   200   OK (200状态码告诉客户端,并且告诉客户端200代表OK,表示响应成功

   Content-Length: 100

   Content-Type:  text/html;charset=UTF-8

   Date: Sat, 12 Oct 2019 07:29:48 GMT

        <html>
           <head>
           <title>$Title$</title>
          </head>
           <body>
               hello ,response
          </body>
      </html>

## Response对象 : 

    *  功能 : 设置响应消息

          1. 设置响应行 :

              (1. 格式 :HTTP/1.1  200  ok

              (2. 设置状态码: setStatus(int sc)

          2. 设置响应头 : setHeader(String name,String value)

            

          3. 设置响应体 : 

               * 使用步骤 :

                    (1. 获取输出流  :

                            * 字符输出流:PrintWriter   getWriter()

                            * 字节输出流:ServletOutputStream    getOutputStream()

                    (2. 使用输出流,将数据输出到客户端浏览器

   ###   案例 :

       1. 完成重定向: 

               * 重定向: 资源跳转的方式 

               * 代码实现:

       

 第一种:   //1.设置状态码为302,
            response.setStatus(302);

           //2.设置响应头
            response.setHeader("location","/day15/responseDemo2");
        


  第二种:  //简单的重定向方法
             response.sendRedirect("/day15/responseDemo2");

       * 重定向的特点: sendRedirect

              (a. 地址栏发生变化

                (b. 重定向可以访问其他站点(服务器)的资源

              (c. 重定向是两次请求,不能使用request.setAttribute()来共享数据

       * 请求转发的特点: request.getRequestDispatcher()

            (a.  转发地址栏路径不变

            (b. 转发只能访问当前服务器下的资源

            (c. 请求转发是一次请求,可以使用request.setAttribute()来共享数据

            * forward 和  redirect区别

       *  路径写法 :

              1. 路径分类:

                   (1. 相对路径 :通过相对路径不可以确定唯一资源

                            *  如: ./index.html

                            *  不以 / 开头,以  . 开头路径

                           # 规则 : 找到当前资源和目标资源之间的相对位置关系

                                    *  ./ :当前目录

                                   *   ../ : 后退一级目录

                   (2. 绝对路径 :  通过绝对路径,可以确定网络中唯一的资源 (推荐)

                              * 如:http://localhost:8080/day15/responseDemo1         简化------/day15/responseDemo1

                              * 以 / 开头的路径,认为是绝对路径

                              *  规则:判断定义的路径是给谁用的? 判断请求从哪儿发出

                                       * 给客户端浏览器使用 : 需要加虚拟目录(项目的访问路径)

                                            # 建议虚拟目录动态获取: request.getContextPath();

                                       *  给服务器使用 : 不需要加虚拟目录

                                            # 转发路径

       2. 服务器输出字符数据到浏览器

            * 步骤: 

              (1. 获取字符输出流

              (2. 输出数据 

            * 注意 :

                 * 乱码问题:

                         1. PrintWriter  writer = response.getWriter();  //获取流的默认编码是ISO-8859-1

                         2. 设置该流的默认编码

                         3. 告诉浏览器响应体使用的编码 :

                              必须是 获取流之前: response.setContextType("text/html;charset=utf-8")

package com.zhulin.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;
import java.io.PrintWriter;

/**
 * @author Janson
 * @version 1.0
 * @date 2019/10/13 17:55
 */
@WebServlet("/responseDemo4")
public class ResponseDemo4 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取流之前设置默认编码
        response.setContentType("text/html;charset=utf-8");

        //1.获取字符输出流
        PrintWriter writer = response.getWriter();
              //response流一次响应后自动被关闭
        //2.输出数据

        writer.println("<h1>hello, response !!!</h1> 你好,响应");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request,response);
    }
}

       3. 服务器输出字节数据到浏览器 

            * 步骤 :

              (1. 获取字节输出流 : ServletOutputStream  outputStream = response.getOutputStream();

              (2. 输出数据  outputStream.write("你好".getBytes("utf-8"))

package com.zhulin.servlet;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * @author Janson
 * @version 1.0
 * @date 2019/10/13 17:55
 */
@WebServlet("/responseDemo5")
public class ResponseDemo5 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置编码格式
        response.setContentType("text/html;charset=utf-8");
        //1.获取字符输出流
        ServletOutputStream outputStream = response.getOutputStream();

        //2.输出数据
        outputStream.write("hello".getBytes("utf-8"));
        outputStream.write("你好".getBytes("utf-8"));

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request,response);
    }
}

       4. 验证码

           (1. 本质上是一张图片

           (2. 目的 :防止恶意表单注册   


package com.zhulin.servlet;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.event.WindowStateListener;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

/**
 * @author Janson
 * @version 1.0
 * @date 2019/10/13 17:55
 */
@WebServlet("/checkCodeServlet")
public class CheckCodeServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        int width = 100;
        int height = 50;

        //1.创建一对象,在内存中画图片(验证码图片对象)
        BufferedImage bufferedImage = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);

        // 2. 美化图片
        //2.1 填充背景色
        Graphics graphics = bufferedImage.getGraphics(); //画笔对象
        graphics.setColor(Color.pink);
        graphics.fillRect(0,0,width,height);

        //2.2画边框
        graphics.setColor(Color.blue);
        graphics.drawRect(0,0,width-1,height-1);

        String str = "ABCDEFGHIGKLMNOPQRSTUVWXYZzbcdefghigklmnopqrstuvwxyz1234567890";
        //生成随机角标
        Random random = new Random();
        //获取字符



        //2.3写验证码
        for (int i=1;i<=4;i++) {
            int index = random.nextInt(str.length());

            char charAt = str.charAt(index);
            graphics.drawString(charAt+"", width/5*i,height/2); //注意,必须写上字符串哦
        }
                //2.4 画干扰线
        graphics.setColor(Color.green);
       // graphics.drawLine(1,1,30,30);
             //随机生成坐标点
        for (int i=0;i<10;i++) {
            int x1 = random.nextInt(width);
            int x2 = random.nextInt(width);
            int y1 = random.nextInt(height);
            int y2 = random.nextInt(height);
            graphics.drawLine(x1,y1,x2,y2);
        }

        //3.将图片输出到页面展示
        ImageIO.write(bufferedImage,"jpg",response.getOutputStream());

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request,response);
    }
}

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script>

        /*
        *  分析: 点击超链接,或者图片,需要换一张
        *       1.给超链接和图片绑定单击事件
        *       2. 重新设置图片和src属性的值
        * */
        window.onload = function () {
            //获取图片对象
            var elementById = document.getElementById("checkCode");
            //绑定单击事件
            elementById.onclick = function(){
                //加时间戳
                var date= new Date().getTime();
                //原因,图片被加载一次会被浏览器缓存,在后边的请求中,访问的一直是本地的缓存
                //所以通过时间戳改变请求路径,欺骗服务器,重新请求
                elementById.src = "/day15/checkCodeServlet?"+date;
            }
        }
    </script>
</head>
<body>

    <img id="checkCode" src="/day15/checkCodeServlet">
    <a id="change" href="">看不清楚,换一张</a>
</body>
</html>

## ServletContext对象

   1. 概念 : 代表整个web应用,可以和程序的容器(服务器)来通信

   2. 获取: (两种方式一样)

        (1. 通过request对象获取

              request.getServletContext();

      (2. 通过HttpServlet获取

               this.getServletContext();

 /**
         * (1. 通过request对象获取
         *   request.getServletContext();
         *
         *(2. 通过HttpServlet获取
         *   this.getServletContext();
         */
        //(1. 通过request对象获取
        ServletContext servletContext1 = request.getServletContext();

        //(2. 通过HttpServlet获取
        ServletContext servletContext2 = this.getServletContext();
        System.out.println(servletContext1);
        System.out.println(servletContext2);

        System.out.println(servletContext2==servletContext1);

   3. 功能 : 

        (1.  获取 MIME类型:

                 *  MIME类型 : 在互联网通信过程中定义的一种文件数据类型

                      * 格式 : 大类型 /小类型  text/html    image/jpeg

                * 获取方法 :String getMimetype(String file)

/**
         * (1.  获取 MIME类型:
         *    MIME类型 : 在互联网通信过程中定义的一种文件数据类型
         *    格式 : 大类型 /小类型  text/html    image/jpeg
         *  获取方法 :String getMimetype(String file)
         */
        //获取ServletContext对象 (request获取)
        ServletContext servletContext = request.getServletContext();

        //定义文件名称
        String fileName = "a.jpg";

        //获取MIME类型
        String mimeType = servletContext.getMimeType(fileName);
        System.out.println(mimeType);

       (2.  域对象 : 共享数据

              a. setAttribute(String name,Object value)

              b. getAttribute(String name)

              c. removeAttribure(String name)

             * ServletContext对象范围 : 所有用户请求的数据

        (3.  获取文件的真实(服务器)路径:

               a.方法 : getRealPath

        //通过request对象获取ServletContext对象
        ServletContext servletContext = request.getServletContext();


        //调用getRealPath()方法获取真实路径
        //web目录下的资源访问
        String realPath = servletContext.getRealPath("/b.txt");
        System.out.println(realPath);
        //File file = new File(realPath);

        //WEB-INF目录下的资源访问
        String realPath1 = servletContext.getRealPath("/WEB-INF/c.txt");
        System.out.println(realPath1);

        //src目录下的资源访问
        String realPath2 = servletContext.getRealPath("/WEB-INF/classes/a.txt");
        System.out.println(realPath2);


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Janson666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值