1. 程式人生 > 其它 >Java Web學習Day02 Response

Java Web學習Day02 Response

Java Web學習Day02 Response

1、HttpServletResponse

Web伺服器接收到客戶端的http請求,針對這個請求,分別建立一個代表HttpServletResquest物件;代表響應的一個HttpServletResponse物件;

  • 如果要獲取客戶端請求過來的引數:找 HttpServletRequest
  • 如果要給客戶端響應一些資訊: 找 HttpServletResponse

1.1 簡單分類

負責向瀏覽器傳送時資料的方法

  • ServletOutputStream getOutputStream() throws IOException;
    PrintWriter getWriter() throws IOException;
    

負責向瀏覽器傳送響應頭的方法

  • void setCharacterEncoding(String var1);
    
    void setContentLength(int var1);
    
    void setContentLengthLong(long var1);
    
    void setContentType(String var1);
    
    void setDateHeader(String var1, long var2);
    
    void addDateHeader(String var1, long var2);
    
    void setHeader(String var1, String var2);
    
    void addHeader(String var1, String var2);
    
    void setIntHeader(String var1, int var2);
    
    void addIntHeader(String var1, int var2);
    ...
    
  • 響應的狀態碼

    200:請求響應成功

    3xx:請求重定向

    重定向 你重新導我給你的新位置去

    4xx: 找不到資源 (資源不存在)404

    5xx 伺服器程式碼錯誤 500 502 閘道器錯誤

1.2 常見應用

  1. 向瀏覽器輸出訊息:

  2. 下載檔案

    1. 獲取下載檔案的路徑
    2. 下載的檔名是啥
    3. 設定想辦法讓瀏覽器能夠支援下載我們需要的東西
    4. 獲取下載檔案的輸入流
    5. 建立緩衝區
    6. 獲取OutputStream物件
    7. 將FileOutputStream流寫入到buffer緩衝區
    8. 使用OutputStream將緩衝區中的資料輸出到客戶端
    public class FileServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    //        1. 獲取下載檔案的路徑
            String realPath = this.getServletContext().getRealPath("/WEB-INF/classes/1.png");
            System.out.println("下載檔案的路徑:"+realPath);
    //        2. 下載的檔名是啥
            String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);
    //        3. 設定想辦法讓瀏覽器能夠支援(Content-dispositio)下載我們需要的東西,中文名檔案用 URLEncoder.encode 否則可能出現亂碼;
            resp.setHeader("Content-dispositio","attachment;filename="+ URLEncoder.encode(fileName,"utf-8"));
    //        4. 獲取下載檔案的輸入流
            FileInputStream in = new FileInputStream(realPath);
    //        5. 建立緩衝區
            int len = 0;
            byte[] buffer = new byte[1024];
    //        6. 獲取OutputStream物件
            ServletOutputStream out = resp.getOutputStream();
    //        7. 將FileOutputStream流寫入到buffer緩衝區,使用OutputStream將緩衝區中的資料輸出到客戶端!
            while((in.read(buffer))>0){
                out.write(buffer,0,len);
            }
    //        關閉輸入輸出流
            in.close();
            out.close();
        }
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }
    
    D:\java_student\source_code\javaweb_02_servlet\responsed\target\responsed\WEB-INF\classes\1.png
    

    1.3 驗證碼功能

    • 前端實現
    • 後端實現,用到java的圖片類,生成一個圖片
    import javax.imageio.ImageIO;
    import javax.servlet.ServletException;
    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;
    
    public class ImageServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    //        如何讓瀏覽器3秒鐘重新整理一次
            resp.setHeader("refresh","3");
    
    //        在記憶體中建立一個圖片
            BufferedImage image = new BufferedImage(80, 20, BufferedImage.TYPE_3BYTE_BGR);
    //        得到圖片
            Graphics2D gs = (Graphics2D) image.getGraphics();//筆
    //        設定圖片的背景顏色
            gs.setColor(Color.green);
            gs.fillRect(0,0,80,20);
    //        給圖片寫資料
            gs.setColor(Color.white);
            gs.setFont(new Font(null,Font.BOLD,20));
            gs.drawString(makeNum(),0,20);
    //        告訴瀏覽器這個請求用圖片的方式開啟
            resp.setContentType("image/jpeg");
    //        網站存在快取,不讓瀏覽器快取
            resp.setDateHeader("expires",-1);
            resp.setHeader("Cache-Control","no-cache");
            resp.setHeader("Pragma","no-cache");
    //        把圖片寫給瀏覽器
            boolean write = ImageIO.write(image, "jpeg",resp.getOutputStream());
    
    
        }
    //    生成隨機數
        private String makeNum(){
            Random random = new Random();
            String num = random.nextInt(999999)+"";
            StringBuffer strb = new StringBuffer();
            for (int i = 0; i < 6-num.length(); i++) {
                strb.append("0");
    
            }
            num= strb.toString() + num;
            return num;
    
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }