Servlet的幾個常用對象


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 中的數據一旦存儲進去沒有手動移除將會一直保存。
 

 

 

 

 

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM