1、Servlet

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)是一個域對象
  • 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)重定向中的路徑
      • 如果路徑由服務器解析:/ 就代表當前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中也會使用該字符集進行編碼
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容