HttpServletRequest 對象
HttpServletRequest 對象:主要作用是用來接收客戶端發送過來的請求信息, 例如:請求的參數,發送的頭信息等都屬於客戶端發來的信息,service()方法中 形參接收的是 HttpServletRequest 接口的實例化對象,表示該對象主要應用在 HTTP 協議上,該對象是由 Tomcat 封裝好傳遞過來。
幾個常用的方法
getRequestURL();客戶端發出請求的時候完整的地址。
getRequestURI();資源的部分名稱,從站點名開始。
getQueryString();請求行中的參數,從問好后面的參數。
getHeader(String);獲取特定的請求頭內的內容。
getParameter(String);獲取參數。
getparametervalues(String);獲取指定參數的一系列值,返回一個String數組。
HTTP Servlet Request的亂碼解決
由於現在的 request 屬於接收客戶端的參數,所以必然有其默認的語言編碼, 主要是由於在解析過程中默認使用的編碼方式為 ISO-8859-1(此編碼不支持中 文),所以解析時一定會出現亂碼。要想解決這種亂碼問題,需要設置 request 中 的編碼方式,告訴服務器以何種方式來解析數據。或者在接收到亂碼數據以后, 再通過相應的編碼格式還原。
簡單來說,需要將request中的編碼進行設置為我們所需要的編碼,request.setCharacterEncoding("UTF-8"),這樣就不會出現亂碼情況,但是這樣只針對了post的形式。
在get形式的請求中,若是出現了亂碼,則可以使用通用的形式,使用String的方法 new String(request.getparameter(name).getByte("ISO-8859-1","utf-8")。
請求轉發
請求轉發,是一種服務器的行為,當客戶端請求到達后,服務器進行轉發, 此時會將請求對象進行保存,地址欄中的 URL 地址不會改變,得到響應后,服 務器端再將響應發送給客戶端,從始至終只有一個請求發出。實現方式如下,達 到多個資源協同響應的效果 ,判斷是否是請求轉發很簡單,只需要看地址欄的地址變化與否就可以了,如果沒變,就是請求轉發。這里應該和重定向注意區分。
request.getRequestDispatcher().forward(request,response)
request 作為域對象
通過該對象可以在一個請求中傳遞數據,作用范圍:在一次請求中有效,即 服務器跳轉有效。
request.setAttribute();設置值
request.getAttribute();獲取值
request.removeAttribute();刪除於對象。
HttpServletResponse 對象
Web 服務器收到客戶端的 http 請求,會針對每一次請求,分別創建一個用 於代表請求的 request 對象和代表響應的 response 對象。
request 和 response 對象代表請求和響應:獲取客戶端數據,需要通過 request 對象;向客戶端輸出數據,需要通過 response 對象。
HttpServletResponse 的主要功能用於服務器對客戶端的請求進行響應,將 Web 服務器處理后的結果返回給客戶端。service()方法中形參接收的是 HttpServletResponse 接口的實例 化對象,這個對象中封裝了向客戶端發送數據、 發送響應頭,發送響應狀態碼的方法。
定時跳轉:response.setHeader("refresh", "2;URL=index.html");
設置寫出的格式,並且對客戶端輸出內容:
// 設置響應的MIME類型 response.setContentType("text/html;charset=UTF-8"); // 獲取輸出字符流 (只能響應字符) PrintWriter pWriter = response.getWriter(); pWriter.write("Hello World!"); pWriter.write("<h1>Hello World!</h1>"); pWriter.flush(); // 刷新 pWriter.close(); // 關閉
獲得response的outputStream對象,對客戶端進行輸出內容:
// 獲取輸出字節流(能夠響應任何類型的數據) ServletOutputStream outputStream = response.getOutputStream(); outputStream.write("<h1>Hello World!</h1>".getBytes()); outputStream.write("<a href='http://www.shsxt.com' target='_blank'>shsxt</a>".getBytes()); outputStream.flush(); // 刷新 outputStream.close(); // 關閉
亂碼解決
response的亂碼解決需要服務器和客戶端的解碼編碼的格式統一
response.setCharacterEncoding("UTF-8"); response.setHeader("content-type", "text/html;charset=UTF-8");
也可以一句話解決
response.setContentType("text/html;charset=UTF-8");
重定向
重定向是一種服務器指導,客戶端的行為。客戶端發出第一個請求,被服務 器接收,經過處理服務器進行響應,與此同時,服務器給客戶端一個地址(下次 請求的地址 resp.sendRedirect("url");),當客戶端接收到響應后,立刻、馬上、自動根據服務器 給的地址進行請求的發送第二個請求,服務器接收請求並作出 響應,重定向完成。從描述 中可以看出重定向當中有兩個請求存在,並且屬於 客戶端行為。
相應圖片
在客戶端解析資源時默認是以文本(text/html)的形式,當 響應圖片時 需要指定響應頭信息,告知客戶端響應內容為圖片形式,使用一種 叫做 MIME 類型的東西來 指定。MIME 類型見 Tomcat 的 web.xml 文件。
//設置為圖片響應類型 response.setContentType("image/jpeg;charset=UTF-8"); // 得到圖片的在服務器的真實路徑 String realPath = request.getServletContext().getRealPath("/luffy.jpg"); System.out.println(realPath); // 通過路徑得到對應的 file對象 File file = new File(realPath); // 判斷file對象是否存在,並且是一個標准文件 if (file.exists() && file.isFile()) { // 得到輸入流 InputStream inputStream = new FileInputStream(file); // 得到輸入字節流 ServletOutputStream outputStream = response.getOutputStream(); byte[] car = new byte[1024]; int len = 0; while ((len = inputStream.read(car)) != -1) { outputStream.write(car, 0, len); } }
Cookie對象
Cookie 是瀏覽器提供的一種技術,通過服務器的程序能將一些只須保存在客 戶端,或者 在客戶端進行處理的數據,放在本地的計算機上,不需要通過網絡 傳輸,因而提高網頁處理的效率,並且能夠減少服務器的負載,但是由於 Cookie 是服務器端保存在客戶端的信息, 所以其安全性也是很差的。例如常見的記住 密碼則可以通過 Cookie 來實現。
簡單創建Cookie對象
// 創建Cookie對象 Cookie cookie = new Cookie("uname", "zhangsan"); Cookie cookie2 = new Cookie("uname2", "zhangsan2");
// 響應Cookie對象給客戶端
response.addCookie(cookie);
response.addCookie(cookie2);
Cookie 的獲取
在服務器端只提供了一個 getCookies()的方法用來獲取客戶端回傳的所有 cookie 組成的一個數組,如果需要獲取單個 cookie 則需要通過遍歷,getName() 獲取 Cookie 的名稱,getValue()獲取 Cookie 的值。
// 獲取Cookie的值 Cookie[] cookies = request.getCookies(); // 判斷數組是否為空 if (cookies != null &&cookies.length > 0) { // 循環得到cookie對象 for (Cookie cookie : cookies) { System.out.println("key:" + cookie.getName() + ", value:" + cookie.getValue()); } }
Cookie 到期時間的設定
從圖中除了看到 Cookie 的名稱和內容外,我們還需要關心一個信息,到期 時間,到期時間用來指定該 cookie 何時失效。默認為當前瀏覽器關閉即失效。 我們可以手動設定 cookie 的有效時間(通過到期時間計算),通過 setMaxAge(int time);方法設定 cookie 的最大有效時間,以秒為單位。
負整數:cookie 的 maxAge 屬性的默認值就是-1,表示只在瀏覽器內存中 存活,一旦關閉 瀏覽器窗口,那么 cookie 就會消失。
正整數:表示 cookie 對象可存活指定的秒數。當生命大於 0 時,瀏覽器 會把 Cookie 保 存到硬盤上,就算關閉瀏覽器,就算重啟客戶端電腦,cookie 也 會存活相應的時間。
零:cookie 生命等於 0 是一個特殊的值,它表示 cookie 被作廢!也就是 說,如果原來 瀏覽器已經保存了這個 Cookie,那么可以通過 Cookie 的 setMaxAge(0)來刪除這個 Cookie。 無論是在瀏覽器內存中,還是在客戶端硬盤 上都會刪除這個 Cookie。
HttpSession對象
對於服務器而言,每一個連接到它的客戶端都是一個 session,servlet 容器 使用此接口創建 HTTP 客戶端和 HTTP 服務器之間的會話。會話將保留指定的 時間段,跨多個連接或來自用戶的頁面請求。一個會話通常對應於一個用戶,該 用戶可能多次訪問一個站點。可以通過此接口查看和操作有關某個會話的信息, 比如會話標識符、創建時間和最后一次訪問時間。在整個 session 中,最重要的 就是屬性的操作。
session 無論客戶端還是服務器端都可以感知到,若重新打開一個新的瀏覽 器,則無法取得之前設置的 session,因為每一個 session 只保存在當前的瀏覽 器當中,並在相關的頁面取得。
如何獲得一個HttpSession對象?
HttpSession session= req.getSession(); //獲取Session的唯一id String sid = session.getid();
Jsession
每當一次請求到達服務器,如果開啟了會話(訪問了 session),服務器第一 步會查看是否從客戶端回傳一個名為 JSESSION 的 cookie,如果沒有則認為這是 一次新的會話,會創建 一個新的 session 對象,並用唯一的 sessionId 為此次 會話做一個標志。如果有 JESSIONID 這 個 cookie 回傳,服務器則會根據 JSESSIONID 這個值去查看是否含有 id 為 JSESSION 值的 session 對象,如果沒有則 認為是一個新的會話,重新創建一個新的 session 對象,並標志此次會話; 如 果找到了相應的 session 對象,則認為是之前標志過的一次會話,返回該 session 對象,數據達到共享。
這里提到一個叫做 JSESSION 的 cookie,這是一個比較特殊的 cookie,當用 戶請求服務器時,如果訪問了 session,則服務器會創建一個名為 JSESSION,值 為獲取到的 session(無論是獲取到的還是新創建的)的 sessionId 的 cookie 對 象,並添加到 response 對象中,響應給客戶端,有效時間為關閉瀏覽器。
作為域對象
Session 用來表示一次會話,在一次會話中數據是可以共享的,這時 session 作為域對象存在,可以通過 setAttribute(name,value);方法向域對象中添加數據, 通過 getAttribute(name) 從域對象中獲取數據,通過 removeAttribute(name)從域 對象中移除數據。
即使通過重定向打開的網頁,session中的數據依然存在,當然,只要session存在,這里的數據就不會丟失。
//設置session對象的值 session.setAttribute("uname", "周傑倫");
Session 的銷毀
Session的默認存在事件是30min,這期間你不可以對網頁進行任何操作,30min過后這個對象被銷毀,生成新的對象,存在的數據也隨着新的session的誕生就對象的銷毀而銷毀。
我們也可以自己設置靜默操作的銷毀事件的值
session.setMaxInactiveInterval(int); //int 為多少秒
也可以讓session即刻銷毀
session.invalidate();
關閉瀏覽器,結束本次會話,sessio,n銷毀
非正常關閉服務器。若是正常關閉,服務器會把session對象寫在磁盤上,下次啟動,自動加載。
ServletContext 對象
每一個 web 應用都有且僅有一個 ServletContext 對象,又稱 Application 對 象,從名稱中可知,該對象是與應用程序相關的。在 WEB 容器啟動的時候,會 為每一個 WEB 應用程序創 建一個對應的 ServletContext 對象。
該對象有兩大作用,第一、作為域對象用來共享數據,此時數據在整個應用 程序中共享; 第二、該對象中保存了當前應用程序相關信息。例如可以通過 getServerInfo();方法獲取當前 服 務 器 信 息 , getResourceAsStream(String path); 方法以流的形式獲取某個資源,getRealPath(String path);獲取資源的真實路徑等。
如何使用ServletContext?
// 獲取服務器的版本 String serverInfo = request.getServletContext().getServerInfo(); System.out.println(serverInfo); // 獲取當前項目的真實路徑(在服務器上的路徑) String realPath = request.getServletContext().getRealPath("/"); System.out.println(realPath);
獲取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();
ServletContext的域對象
ServletContext 也可當做域對象來使用,通過向 ServletContext 中存取數據, 可以使得整個應用程序共享某些數據。當然不建議存放過多數據,因為 ServletContext 中的數據一旦存儲進去沒有手動移除將會一直保存。