1. 程式人生 > 其它 >淺析Java程式設計中常用的Servlet物件:HttpServletRequest(客戶端請求)、HttpServletResponse(響應)、Cookie物件、HttpSession(客戶端會話)、ServletContext(應用程式資訊)

淺析Java程式設計中常用的Servlet物件:HttpServletRequest(客戶端請求)、HttpServletResponse(響應)、Cookie物件、HttpSession(客戶端會話)、ServletContext(應用程式資訊)

一、HttpServletRequest物件

  HttpServletRequest物件:用來接收客戶端傳送過來的請求資訊,例如:請求引數,傳送的訊息頭資訊等都屬於客戶端發來的資訊。

1、常用方法:記幾個常用的,其他需要用的時候 idea 會有提示

  getRequestURL() :獲取客戶端發出請求時的完整URL

  getQueryString() :獲取請求行中的引數部分

2、獲取請求頭

  getHeader(String) :獲取單個請求頭內容

  Enumeration getHeaderNames() :獲取所有的請求頭名稱集合

3、獲取客戶端請求引數

  getParameter(name) 獲取指定名稱的引數

  getParameterValues(String name) 獲取指定名稱引數的所有值

  getParameterNames() 獲取一個包含請求訊息中的所有引數名的Enumeration物件

  getParameterMap() 獲取一個儲存了請求資訊中的所有引數名稱和值的Map物件

4、請求亂碼解決

  由於現在的request是屬於客戶端的引數,所以用的客戶端中的編碼格式,在服務端中解析一定會造成亂碼問題,要想解決亂碼問題,需要設定request中的編碼方式

// 方式一:(該方式只針對POST有效)
req.setCharacterEncoding("UTF-8");

// 方式二:
new String(req.getParameter(name).getBytes("ISO-8859-1"));

二、HttpServletResponse物件

  Web伺服器收到客戶端的請求,會針對每個請求,做出不同的響應,req是代表請求物件,response是代表響應物件。

  HttpServletResponse 的主要功能用於伺服器對客戶端的請求進行響應,將 Web 伺服器處理後的結果返回給客戶端。 service()方法中形參接收的是 HttpServletResponse 介面的例項化物件,這個物件中封裝了向客戶端傳送資料、傳送響應頭,傳送響應狀態碼的方 法。

1、常用方法

  getWriter() 獲取輸出字元流

  getOutputStream 獲取輸出位元組流

  setContentType(String ContentType) 設定響應型別

2、response的亂碼解決需要伺服器和客戶端的解碼編碼的格式統一

response.setCharacterEncoding("UTF-8");
response.setHeader("content-type", "text/html;charset=UTF-8");

// 也可以一句話解決
response.setContentType("text/html;charset=UTF-8");

三、Cookie物件

1、Cookie的建立和傳送

  通過 new Cookie(“key”,”value”); 來建立一個 Cookie 物件,要想將 Cookie 隨響應傳送到客戶端,需要先新增到 response 物件中,resp.addCookie(cookie);此時該 cookie 物件則隨著響應傳送至了客戶端。在瀏覽器上可以看見。

//建立一個Cookie
Cookie cookie = new Cookie("name","***");
//在響應給瀏覽器
resp.addCookie(cookie);

2、Cookie獲取

  在伺服器端只提供了一個 getCookies() 的方法用來獲取客戶端回傳的所有 cookie 組成的一個數組,如果需要獲取單個 cookie 則需要通過遍歷,getName()獲取 Cookie 的名稱,getValue()獲取 Cookie 的值。

//獲取到所有的Cookie
Cookie[] cookies = req.getCookies();
//遍歷列印
for (Cookie cookie2 : cookies) {
    System.out.println("鍵:"+cookie2.getName()+" 值:"+cookie2.getValue());
}

3、Cookie時間設定:通過 setMaxAge(int time);方法設定 cookie 的最大有效時間,以秒為單位。大於 0 的整數,表示儲存的秒數; 若為負數,則表示不儲存該 cookie; 若為 0,則刪除該 cookie。

4、Cookie的覆蓋:如果伺服器傳送的Cookie是個重複Cookie,那麼會覆蓋原有的Cookie的值。

四、HttpSession物件

  對於伺服器而言,每一個連線到它的客戶端都是一個 session,servlet 容器使用此介面建立 HTTP 客戶端和 HTTP 伺服器之間的會話。會話將保留指定的時間段,跨多個連線或來自使用者的頁面請求。一個會話通常對應於一個使用者,該使用者可能多次訪問一個站點。可以通過此介面檢視和操作有關某個會話的資訊, 比如會話識別符號、建立時間和最後一次訪問時間。在整個 session 中,最重要的就是屬性的操作。

  session 無論客戶端還是伺服器端都可以感知到,若重新開啟一個新的瀏覽器,則無法取得之前設定的 session,因為每一個 session 只儲存在當前的瀏覽器當中,並在相關的頁面取得。

1、如何獲得一個HttpSession物件?

HttpSession session = req.getSession();
//獲取Session的唯一id
String sid = session.getid();

2、Jsession

  每當一次請求到達伺服器,如果開啟了會話(訪問了 session),伺服器第一步會檢視是否從客戶端回傳一個名為 JSESSION 的 cookie,如果沒有則認為這是一次新的會話,會建立 一個新的 session 物件,並用唯一的 sessionId 為此次會話做一個標誌。如果有 JESSIONID 這個 cookie 回傳,伺服器則會根據 JSESSIONID 這個值去檢視是否含有 id 為 JSESSION 值的 session 物件,如果沒有則認為是一個新的會話,重新建立一個新的 session 物件,並標誌此次會話; 如果找到了相應的 session 物件,則認為是之前標誌過的一次會話,返回該 session 物件,資料達到共享。

  這裡提到一個叫做 JSESSION 的 cookie,這是一個比較特殊的 cookie,當用戶請求伺服器時,如果訪問了 session,則伺服器會建立一個名為 JSESSION,值為獲取到的 session(無論是獲取到的還是新建立的)的 sessionId 的 cookie 物件,並新增到 response 物件中,響應給客戶端,有效時間為關閉瀏覽器。

3、作為域物件

  Session 用來表示一次會話,在一次會話中資料是可以共享的,這時 session 作為域物件存在,可以通過 setAttribute(name,value); 方法向域物件中新增資料, 通過 getAttribute(name) 從域物件中獲取資料,通過 removeAttribute(name) 從域物件中移除資料。

  即使通過重定向開啟的網頁,session中的資料依然存在,當然,只要session存在,這裡的資料就不會丟失。

//設定session物件的值
session.setAttribute("uname", "***");

4、Session 的銷燬

  Session的預設存在事件是30min,這期間你不可以對網頁進行任何操作,30min過後這個物件被銷燬,生成新的物件,存在的資料也隨著新的session的誕生就物件的銷燬而銷燬。

  我們也可以自己設定靜默操作的銷燬事件的值

// 我們也可以自己設定靜默操作的銷燬事件的值
session.setMaxInactiveInterval(int);    //int 為多少秒

// 也可以讓session即刻銷燬
session.invalidate();

// 關閉瀏覽器,結束本次會話,session 銷燬
// 非正常關閉伺服器,伺服器會把session物件寫在磁碟上,下次啟動,自動載入。

五、ServletContext 物件

  每一個 web 應用都有且僅有一個 ServletContext 物件,又稱 Application 物件,從名稱中可知,該物件是與應用程式相關的。在 WEB 容器啟動的時候,會為每一個 WEB 應用程式建立一個對應的 ServletContext 物件。

  該物件有兩大作用,第一、作為域物件用來共享資料,此時資料在整個應用 程式中共享; 第二、該物件中儲存了當前應用程式相關資訊。例如可以通過 getServerInfo();方法獲取當前伺服器資訊 , getResourceAsStream(String path); 方法以流的形式獲取某個資源,getRealPath(String path);獲取資源的真實路徑等。

1、如何使用ServletContext?

// 獲取伺服器的版本
String serverInfo = request.getServletContext().getServerInfo();
System.out.println(serverInfo);
        
// 獲取當前專案的真實路徑(在伺服器上的路徑)
String realPath = request.getServletContext().getRealPath("/");
System.out.println(realPath);

2、獲取ServletContext的多種方法

/**
         * 獲取 ServletContext 物件的途徑有很多
         *     1、通過 request 物件可以
         *     2、通過 session 可以
         *     3、通過servletConfig可以,在 Servlet 標準中提供了獲取 ServletConfig 的方法
         *     4、本身Servlet標準後期的實現類中也提供了直接獲取 ServletContext 的方法
         */
// 1、通過 request 物件可以
ServletContext servletContext = request.getServletContext();
        
// 2、通過 session 可以
ServletContext servletContext2 = request.getSession().getServletContext();
HttpSession session = request.getSession();
ServletContext servletContext3 = session.getServletContext();

// 3、通過servletConfig可以,在 Servlet 標準中提供了獲取 ServletConfig 的方法
ServletConfig servletConfig = getServletConfig();
ServletContext servletContext4 = servletConfig.getServletContext();
  
// 4、本身Servlet標準後期的實現類中也提供了直接獲取 ServletContext 的方法
ServletContext servletContext5 = getServletContext();