Java Web學習Day02 Response
阿新 • • 發佈:2021-07-18
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 常見應用
-
向瀏覽器輸出訊息:
-
下載檔案
- 獲取下載檔案的路徑
- 下載的檔名是啥
- 設定想辦法讓瀏覽器能夠支援下載我們需要的東西
- 獲取下載檔案的輸入流
- 建立緩衝區
- 獲取OutputStream物件
- 將FileOutputStream流寫入到buffer緩衝區
- 使用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); } }