java: Detailed explanation of the response object of the http module

background

In the previous article , we explained in detail the request object of the http module in java. This time we will look at the response object, which is the object that the server needs to reply to the client.

Knowledge of HTTP protocol

  1. Request message: the data sent by the client to the server
    • Data Format:
      1. request line
      2. request header
      3. request blank line
      4. request body
  2. Response message: the data sent by the server to the client
    • Data Format:

      1. response line

        1. Composition: protocol/version response status code status code description
        2. Response status code: The server tells the client browser a status of this request and response.
          1. Status codes are all 3 digits
          2. Classification:
            1. 1xx: The server receives the message from the client, but has not completed the acceptance. After waiting for a period of time, it sends 1xx multi-status codes
            2. 2xx: Success. Delegates: 200
            3. 3xx: Redirection. Representative: 302 (redirect), 304 (access cache)
            4. 4xx: Client error.
              • represent:
                • 404 (the request path does not have a corresponding resource)
                • 405: The request method does not have a corresponding doXxx method
            5. 5xx: Server-side error. Representative: 500 (An exception occurred inside the server)
      2. Response header:

        1. Format: header name: value
        2. Common response headers:
          1. Content-Type: The server tells the client the data format and encoding format of the response body
          2. Content-disposition: The server tells the client in what format to open the response body data
            • value:
              • in-line: default value, open in the current page
              • attachment;filename=xxx: Open the response body as an attachment. Download Document
      3. response empty line

      4. Response body: the transmitted data

    • Response string format
      HTTP/1.1 200 OK
      Content-Type: text/html;charset=UTF-8
      Content-Length: 101
      Date: Wed, 06 Jun 2018 07:08:42 GMT

response object

The response object contains information about the server's response, such as the response status code, response headers, response body, etc.:

  1. set response line
    1. Format: HTTP/1.1 200 ok
    2. Set the status code: setStatus(int): such as 200, 404, 500, etc.
  2. Set the response header: setHeader(String name, String value), such as Content-Type (content type) and Cache-Control (cache control).
  3. Set the response body:
    • Steps for usage:
      1. get output stream

        • Character output stream: PrintWriter getWriter()
        • Byte output stream: ServletOutputStream getOutputStream()
      2. Use the output stream to output data to the client browser

Case: Redirection

Code:

//1. 设置状态码为302
response.setStatus(302);
//2.设置响应头location
response.setHeader("location","/day15/responseDemo2");

或者

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

responseDemo1 redirects to responseDemo2

package cn.xxx.web.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("/responseDemo1")
public class ResponseDemo1 extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    

        System.out.println("demo1........");



        //访问/responseDemo1,会自动跳转到/responseDemo2资源
       /* //1. 设置状态码为302
        response.setStatus(302);
        //2.设置响应头location
        response.setHeader("location","/day15/responseDemo2");*/

        request.setAttribute("msg","response");

        //动态获取虚拟目录
        String contextPath = request.getContextPath();

        //简单的重定向方法
        response.sendRedirect(contextPath+"/responseDemo2");
        //response.sendRedirect("http://www.itcast.cn");

    }

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

package cn.itcast.web.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("/responseDemo2")
public class ResponseDemo2 extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        System.out.println("demo2222222........");

        Object msg = request.getAttribute("msg");
        System.out.println(msg);
    }

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

Forward

package cn.itcast.web.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("/responseDemo3")
public class ResponseDemo3 extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    


        //转发
        request.getRequestDispatcher("/responseDemo2").forward(request,response);
    }

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

Absolute path and relative path usage scenarios:

  • For client browsers: need to add a virtual directory (access path of the project)
    * It is recommended to dynamically obtain the virtual directory: request.getContextPath()
    * <a> , <form>Redirect...
    * For server use: no need to add a virtual directory
    * Forwarding path

The difference between redirect and forward

  • Redirection features: redirect
    1. address bar changes
    2. Redirection can access resources on other sites (servers)
    3. Redirects are two requests. Cannot use request object to share data
  • Forwarding characteristics: forward
    1. The forwarding address bar path remains unchanged
    2. Forwarding can only access resources under the current server
    3. Forwarding is a request, you can use the request object to share data

Case: The server outputs character data to the browser

  • step:

    1. Get character output stream
    2. Output Data
  • Notice:

    • Garbled problem:

      1. PrintWriter pw = response.getWriter(); The default encoding of the obtained stream is ISO-8859-1
      2. Set the default encoding for this stream
      3. Tells the browser what encoding to use for the response body


      //The simple form, to set the encoding, is to set response.setContentType("text/html;charset=utf-8"); before getting the stream ;

package cn.itcast.web.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;

@WebServlet("/responseDemo4")
public class ResponseDemo4 extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    

        //获取流对象之前,设置流的默认编码:ISO-8859-1 设置为:GBK
       // response.setCharacterEncoding("utf-8");

        //告诉浏览器,服务器发送的消息体数据的编码。建议浏览器使用该编码解码
        //response.setHeader("content-type","text/html;charset=utf-8");

        //简单的形式,设置编码
        response.setContentType("text/html;charset=utf-8");

        //1.获取字符输出流
        PrintWriter pw = response.getWriter();
        //2.输出数据
        //pw.write("<h1>hello response</h1>");
        pw.write("你好啊啊啊 response");
    }

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


Case: The server outputs byte data to the browser

  1. get byte output stream
  2. Output Data
package cn.itcast.web.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;

@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 sos = response.getOutputStream();
        //2.输出数据
        sos.write("你好".getBytes("utf-8"));
    }

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

Case: simple verification code

Essence: Image
Purpose: Prevent malicious form registration

package cn.itcast.web.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.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

@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 image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);


        //2.美化图片
        //2.1 填充背景色
        Graphics g = image.getGraphics();//画笔对象
        g.setColor(Color.PINK);//设置画笔颜色
        g.fillRect(0,0,width,height);

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

        String str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghigklmnopqrstuvwxyz0123456789";
        //生成随机角标
        Random ran = new Random();

        for (int i = 1; i <= 4; i++) {
    
    
            int index = ran.nextInt(str.length());
            //获取字符
            char ch = str.charAt(index);//随机字符
            //2.3写验证码
            g.drawString(ch+"",width/5*i,height/2);
        }


        //2.4画干扰线
        g.setColor(Color.GREEN);

        //随机生成坐标点

        for (int i = 0; i < 10; i++) {
    
    
            int x1 = ran.nextInt(width);
            int x2 = ran.nextInt(width);

            int y1 = ran.nextInt(height);
            int y2 = ran.nextInt(height);
            g.drawLine(x1,y1,x2,y2);
        }


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


    }

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

ServletContext object

  1. Concept: represents the entire web application and can communicate with the program container (server)
  2. Obtain:

    1. Get request.getServletContext() through the request object ;

    2. Get this.getServletContext() through HttpServlet ;
  3. Function:
    1. Get the MIME type:

      • MIME type: A file data type defined in the Internet communication process

        • Format: large type/small type text/html image/jpeg
      • Get: String getMimeType(String file)

    2. Domain Objects: Shared Data

      1. setAttribute(String name,Object value)
      2. getAttribute(String name)
      3. removeAttribute(String name)
      • ServletContext object scope: all data requested by all users
    3. Get the real (server) path of the file

      1. Method: String getRealPath(String path)
        String b = context.getRealPath(“/b.txt”);//Resource access in the web directory
        System.out.println(b);

        String c = context.getRealPath(“/WEB-INF/c.txt”);//Resource access under the WEB-INF directory
        System.out.println©;

        String a = context.getRealPath(“/WEB-INF/classes/a.txt”);//Resource access under the src directory
        System.out.println(a);

package cn.itcast.web.servletcontext;

import javax.servlet.ServletContext;
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("/servletContextDemo1")
public class ServletContextDemo1 extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        /*

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

        System.out.println(context1);
        System.out.println(context2);

        System.out.println(context1 == context2);//true


    }

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

package cn.itcast.web.servletcontext;

import javax.servlet.ServletContext;
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("/servletContextDemo2")
public class ServletContextDemo2 extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        /*

            ServletContext功能:
               1. 获取MIME类型:
                * MIME类型:在互联网通信过程中定义的一种文件数据类型
                    * 格式: 大类型/小类型   text/html		image/jpeg

                * 获取:String getMimeType(String file)
                2. 域对象:共享数据
                3. 获取文件的真实(服务器)路径
         */
        
        //2. 通过HttpServlet获取
        ServletContext context = this.getServletContext();

        //3. 定义文件名称
        String filename = "a.jpg";//image/jpeg


        //4.获取MIME类型
        String mimeType = context.getMimeType(filename);
        System.out.println(mimeType);


    }

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

package cn.itcast.web.servletcontext;

import javax.servlet.ServletContext;
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("/servletContextDemo3")
public class ServletContextDemo3 extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        /*

            ServletContext功能:
               1. 获取MIME类型:

                2. 域对象:共享数据
                3. 获取文件的真实(服务器)路径
         */
        
        //2. 通过HttpServlet获取
        ServletContext context = this.getServletContext();

        //设置数据
        context.setAttribute("msg","haha");


    }

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

package cn.itcast.web.servletcontext;

import javax.servlet.ServletContext;
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("/servletContextDemo4")
public class ServletContextDemo4 extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        /*

            ServletContext功能:
               1. 获取MIME类型:

                2. 域对象:共享数据
                3. 获取文件的真实(服务器)路径
         */
        
        //2. 通过HttpServlet获取
        ServletContext context = this.getServletContext();

        //获取数据
        Object msg = context.getAttribute("msg");
        System.out.println(msg);

    }

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

package cn.itcast.web.servletcontext;

import javax.servlet.ServletContext;
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.File;
import java.io.IOException;

@WebServlet("/servletContextDemo5")
public class ServletContextDemo5 extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        /*

            ServletContext功能:
               1. 获取MIME类型:

                2. 域对象:共享数据
                3. 获取文件的真实(服务器)路径
         */
        
        // 通过HttpServlet获取
        ServletContext context = this.getServletContext();


        // 获取文件的服务器路径
        String b = context.getRealPath("/b.txt");//web目录下资源访问
        System.out.println(b);
       // File file = new File(realPath);

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

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


    }

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

Case: file download

  • File download requirements:

    1. page display hyperlink
    2. After clicking the hyperlink, the download prompt box will pop up
    3. Complete image file download
  • analyze:

    1. If the resource pointed to by the hyperlink can be parsed by the browser, it will be displayed in the browser; if it cannot be parsed, a download prompt box will pop up. does not meet the needs
    2. Any resource must pop up a download prompt box
    3. Use the response header to set how the resource is opened:
      • content-disposition:attachment;filename=xxx
  • step:

    1. Define the page, edit the hyperlink href attribute, point to the Servlet, and pass the resource name filename
    2. Define Servlets
      1. get file name
      2. Load a file into memory using a byte input stream
      3. Specify the response header of response: content-disposition:attachment;filename=xxx
      4. Write data out to the response output stream
  • question:

    • Chinese file problem
      • Solutions:
        1. Obtain the browser version information used by the client
        2. According to different version information, the encoding method of setting filename is different
package cn.itcast.web.utils;

import sun.misc.BASE64Encoder;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;


public class DownLoadUtils {
    
    

    public static String getFileName(String agent, String filename) throws UnsupportedEncodingException {
    
    
        if (agent.contains("MSIE")) {
    
    
            // IE浏览器
            filename = URLEncoder.encode(filename, "utf-8");
            filename = filename.replace("+", " ");
        } else if (agent.contains("Firefox")) {
    
    
            // 火狐浏览器
            BASE64Encoder base64Encoder = new BASE64Encoder();
            filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
        } else {
    
    
            // 其它浏览器
            filename = URLEncoder.encode(filename, "utf-8");
        }
        return filename;
    }
}

package cn.itcast.web.download;

import cn.itcast.web.utils.DownLoadUtils;

import javax.servlet.ServletContext;
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.FileInputStream;
import java.io.IOException;

@WebServlet("/downloadServlet")
public class DownloadServlet extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        //1.获取请求参数,文件名称
        String filename = request.getParameter("filename");
        //2.使用字节输入流加载文件进内存
        //2.1找到文件服务器路径
        ServletContext servletContext = this.getServletContext();
        String realPath = servletContext.getRealPath("/img/" + filename);
        //2.2用字节流关联
        FileInputStream fis = new FileInputStream(realPath);

        //3.设置response的响应头
        //3.1设置响应头类型:content-type
        String mimeType = servletContext.getMimeType(filename);//获取文件的mime类型
        response.setHeader("content-type",mimeType);
        //3.2设置响应头打开方式:content-disposition

        //解决中文文件名问题
        //1.获取user-agent请求头、
        String agent = request.getHeader("user-agent");
        //2.使用工具类方法编码文件名即可
        filename = DownLoadUtils.getFileName(agent, filename);

        response.setHeader("content-disposition","attachment;filename="+filename);
        //4.将输入流的数据写出到输出流中
        ServletOutputStream sos = response.getOutputStream();
        byte[] buff = new byte[1024 * 8];
        int len = 0;
        while((len = fis.read(buff)) != -1){
    
    
            sos.write(buff,0,len);
        }

        fis.close();


    }

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

Guess you like

Origin blog.csdn.net/weixin_43972437/article/details/132525508
Recommended