1.請求和響應
-
HttpServletRequest request
- 代表
- request代表瀏覽器發送給服務器的請求報文,該對象由服務器創建并以參數的形式傳入到doGet和doPost方法中,在這兩個方法中可以直接使用
- 作用
- 1)獲取求情參數
String userName = request.getParameter("username"); String password = request.getParameter("password");
- 2)獲取當前Web應用的虛擬路徑
String contextPath = request.getContextPath();
- 3)轉發
//獲取轉發器 RequestDispatcher dispatcher = request.getRequestDispatcher("success.html"); //轉發請求 dispatcher.forward(request, response);
- 4)是一個域對象
- 1)獲取求情參數
- 代表
-
HttpServletResponse response
-
代表
- response代表服務器發送給瀏覽器的響應報文,該對象由服務器創建并以參數的形式傳入到doGet和doPost方法中,在這兩個方法中可以直接使用
作用
1)給瀏覽器響應一個頁面或頁面的一個片段
//響應一個頁面的片段 writer.write("<h1>Response Success!</h1>"); //響應一個完整的頁面 writer.write("<!DOCTYPE html>"); writer.write("<html>"); writer.write("<head>"); writer.write("<meta charset='UTF-8'>"); writer.write("<title>Insert title here</title>"); writer.write("</head>"); writer.write("<body>"); writer.write("<h1>登錄成功!</h1>"); writer.write("</body>"); writer.write("</html>");
2)重定向
response.sendRedirect("success.html");
-
-
轉發與重定向的區別
- 1)轉發發送一次請求;重定向發送兩次請求
- 2)轉發瀏覽器地址欄地址無變化;重定向瀏覽器地址欄地址有變化
- 3)轉發可以訪問WEB-INF下的資源;重定向不能訪問WEB-INF下的資源
- 4)轉發可以共享request域中的屬性;重定向不能共享request域中的屬性
2.Web應用中的路徑問題
-
相對路徑不靠譜
- 在轉發的情況下,由于地址欄地址無變化,有時候就可以導致瀏覽器解析地址錯誤,所以不建議使用相對路徑,建議使用絕對路徑
-
絕對路徑
- 什么絕對路徑:以 / 開頭的路徑即為絕對路徑
- 絕對路徑中 / 代表什么?
- 如果路徑由瀏覽器解析: / 就代表當前服務器,例如http://localhost:8080
- 哪些路徑由瀏覽器解析
- 1)html標簽中的路徑
- 如img中的src,script標簽中的src屬性;a標簽中的href屬性,link標簽中的href屬性;form表單中的action屬性
- 2)重定向中的路徑
- 1)html標簽中的路徑
- 如果路徑由服務器解析:/ 就代表當前Web應用,例如:http://localhost:8080/Web01_Servlet_Ex
- 哪些路徑由服務器解析
- 1)web.xml中url-pattern中的路徑
- 2)轉發中的路徑
-
base標簽
- 可以讓我們以相對路徑的形式來表示絕對路徑
<base href="http://localhost:8080/Web01_Servlet_Ex/">
- 注意:base標簽href屬性后面的 / 必須寫
- 可以讓我們以相對路徑的形式來表示絕對路徑
3.中文亂碼問題
- 編碼:將字符轉換成二進制數
- 解碼:將二進制數轉換成字符
- 亂碼:編碼和解碼使用的字符集不一致就會導致亂碼
- 請求亂碼
- 請求由瀏覽器發送給服務器
- 瀏覽器編碼:瀏覽器編碼的字符集有HTML頁面決定,具體有HTML頁面中的meta標簽決定
- 服務器解碼:服務器默認的字符集是ISO-8859-1
- 由于兩者的字符集不一致所以導致亂碼
- 解決方案
對于POST請求
//該操作一定要在第一次獲取請求參數之前 request.setCharacterEncoding("utf-8");
-
對于GET請求
- 由于get請求的請求參數在地址欄中,在到達Servlet之前已經被服務器進行解碼,所以在Servlet里使用POST請求的方式設置字符集就不管用了。
- 這個時候我們需要改變服務器URL解碼的字符集,在server.xml文件中的Connector標簽中添加URIEncoding="UTF-8"
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>
- 請求由瀏覽器發送給服務器
- 響應亂碼
- 響應由服務器發送給瀏覽器
- 服務器編碼:服務器默認的字符集是ISO-8859-1
- 瀏覽器解碼:瀏覽器解碼默認的字符集是GBK
- 解決方案
- 通過以下兩種方式設置
//通過以下兩種方式告訴瀏覽器使用UTF-8字符集進行解碼 //方式一: response.setHeader("Content-Type", "text/html;charset=utf-8"); //方式二: response.setContentType("text/html;charset=UTF-8");
- 通過以下兩種方式設置
- 設置了響應頭之后瀏覽器就會使用設置的字符集進行解碼,同時在Servlet中也會使用該字符集進行編碼
- 響應由服務器發送給瀏覽器