《喋血復仇》已在Steam上發售 獲玩家特別好評
阿新 • • 發佈:2021-10-13
HttpServletResponse
1、簡介
web伺服器接收到客戶端的http請求請求,會針對這個請求,分別建立一個代表請求的HttpServletRequest物件,代表響應的HttpServletResponse物件
- 如果要獲取客戶端的請求引數:找HttpServletRequest
- 如果要給客戶端一些相響應的資訊:找HttpServletResponse
2、成員簡單分類
-
負責向瀏覽器傳送資料的方法
檔案流:
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);
-
響應的狀態碼
int SC_OK = 200;//狀態ok int SC_NOT_FOUND = 404;//頁面找不到 int SC_INTERNAL_SERVER_ERROR = 500;//伺服器端錯誤 int SC_BAD_GATEWAY = 502;//網關出錯
3、常見應用
-
向瀏覽器輸出一些資訊
-
下載檔案
-
要獲取下載的路徑
-
下載的檔名是什麼
-
設定瀏覽器能夠支援下載我們需要的東西
-
獲取下載檔案的輸入流
-
建立緩衝區(buffer)
-
獲取OutPutStream物件
-
將FileOutPutStream流寫入緩衝區(buffer)
-
使用OutPutStream將緩衝區的資料輸出到客戶端
程式碼實現
public class FileServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //1、要獲取下載的路徑 String realPath = "D:\\Intellij IDEA_workspace\\webapp\\response\\src\\main\\resources\\image.jpg"; System.out.println("下載檔案路徑:"+realPath); //2、下載的檔名是什麼 String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1); //3、設定瀏覽器能夠支援(Content-Disposition)下載我們需要的東西 // URLEncoder.encode(fileName,"utf-8")為了解決中文檔名亂碼問題 resp.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode(fileName,"utf-8")); //4、獲取下載檔案的輸入流 FileInputStream fileInputStream = new FileInputStream(realPath); //5、建立緩衝區(buffer) int len = 0; byte[] buffer = new byte[1024]; //6、獲取OutPutStream物件 ServletOutputStream out = resp.getOutputStream(); //7、將fileInputStream流寫入緩衝區(buffer),使用OutPutStream將緩衝區的資料輸出到客戶端 while((len = fileInputStream.read(buffer))!=0){ out.write(buffer,0,len); } fileInputStream.close(); out.close(); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
-
-
驗證碼功能
-
驗證碼怎麼來的
-
前端實現(JS)
-
後端實現(需要用到Java的圖片類,產生一個圖片響應到前端)
java實現程式碼
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(100,40,BufferedImage.TYPE_INT_RGB); //得到圖片 Graphics2D g = (Graphics2D)image.getGraphics(); //設定圖片的背景顏色 g.setColor(Color.white); g.fillRect(0,0,100,40); //給圖片寫資料 g.setColor(Color.RED); g.setFont(new Font(null,Font.BOLD,30)); g.drawString(makeNum(),0,30); //告訴瀏覽器這個請求用圖片的方式開啟 resp.setContentType("image/jpeg"); //網站存在快取,不讓瀏覽器快取 resp.setDateHeader("expires",-1); //resp.setHeader("Cache-Control","no-cache");不讓瀏覽器快取的拓展方法 //resp.setHeader("Pragma","no-cache");不讓瀏覽器快取的拓展方法 //把圖片寫給瀏覽器 ImageIO.write(image,"jpg",resp.getOutputStream()); } //生成隨機數 private String makeNum(){ Random random = new Random(); String num = random.nextInt(999999)+""; StringBuffer sb = new StringBuffer(); for (int i = 0; i < 6-num.length(); i++) { sb.append("0"); } num = sb.toString()+num; return num; } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
-
-
-
實現重定向
-
定義
一個web資源收到客戶端請求後,他會通知客戶端去訪問另外一個web資源,這個過程就叫做重定向
-
常見場景
- 使用者登入
-
測試
public class RedirectServlet extends HttpServlet { /** * 重定向 * */ @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { /* 拆分 resp.setHeader("Location","/s4/img");路徑 resp.setStatus(302);狀態碼 */ resp.sendRedirect("/s4/img"); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } }
-
重定向與轉發的區別
-
相同點
頁面都會實現跳轉
-
不同點
請求轉發時url位址列不會產生變化,重定向時url位址列會發生變化
-
-
登入測試
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <body> <%--這裡的路徑需要尋找到專案的路徑--%> <%--${pageContext.request.contextPath}代表當前的專案--%> <%--${pageContext.request.contextPath}/login把請求傳送到RequestTest進行處理--%> <form action="${pageContext.request.contextPath}/login" method="get"> 使用者:<input type="text" name="username"></br> 密碼:<input type="password" name="password"></br> <input type="submit" name="submit"> </form> </body> </html>
java
public class RequestTest extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //處理請求 String username = req.getParameter("username"); String password = req.getParameter("password"); System.out.println(username+":"+password); //重定向一定要注意路徑問題否則就會404 resp.sendRedirect("/s4/successfully.jsp"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
successfully.jsp(重定向頁面)
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>success</title> </head> <body> <h2 style="color: aquamarine">successfully</h2> </body> </html>
xml
<servlet> <servlet-name>requesttest</servlet-name> <servlet-class>com.zhang.servlet.RequestTest</servlet-class> </servlet> <servlet-mapping> <servlet-name>requesttest</servlet-name> <url-pattern>/login</url-pattern> </servlet-mapping>
-