Java中Servlet技術

scbiaosdo發表於2018-07-23

Servlet 是什麼?

Java Servlet 是執行在 Web 伺服器或應用伺服器上的程式,它是作為來自 Web 瀏覽器或其他 HTTP 客戶端的請求和 HTTP 伺服器上的資料庫或應用程式之間的中間層。

使用 Servlet,您可以收集來自網頁表單的使用者輸入,呈現來自資料庫或者其他源的記錄,還可以動態建立網頁。

Java Servlet 通常情況下與使用 CGI(Common Gateway Interface,公共閘道器介面)實現的程式可以達到異曲同工的效果。但是相比於 CGI,Servlet 有以下幾點優勢:

    1、效能明顯更好。
    2、Servlet 在 Web 伺服器的地址空間內執行。這樣它就沒有必要再建立一個單獨的程式來處理每個客戶端請求。
    3、Servlet 是獨立於平臺的,因為它們是用 Java 編寫的。
    4、伺服器上的 Java 安全管理器執行了一系列限制,以保護伺服器計算機上的資源。因此,Servlet 是可信的。
    5、Java 類庫的全部功能對 Servlet 來說都是可用的。它可以通過 sockets 和 RMI 機制與 applets、資料庫或其他軟體進行互動。

Servlet 執行以下主要任務

    1、讀取客戶端(瀏覽器)傳送的顯式的資料。這包括網頁上的 HTML 表單,或者也可以是來自 applet 或自定義的 HTTP 客戶端程式的表單。
    2、讀取客戶端(瀏覽器)傳送的隱式的 HTTP 請求資料。這包括 cookies、媒體型別和瀏覽器能理解的壓縮格式等等。
    3、處理資料並生成結果。這個過程可能需要訪問資料庫,執行 RMI 或 CORBA 呼叫,呼叫 Web 服務,或者直接計算得出對應的響應。
    4、傳送顯式的資料(即文件)到客戶端(瀏覽器)。該文件的格式可以是多種多樣的,包括文字檔案(HTML 或 XML)、二進位制檔案(GIF 影象)、Excel 等。
    5、傳送隱式的 HTTP 響應到客戶端(瀏覽器)。這包括告訴瀏覽器或其他客戶端被返回的文件型別(例如 HTML),設定 cookies 和快取引數,以及其他類似的任務。

Servlet 生命週期

Servlet 生命週期可被定義為從建立直到毀滅的整個過程。以下是 Servlet 遵循的過程:
    1、Servlet 通過呼叫 init () 方法進行初始化。
    2、Servlet 呼叫 service() 方法來處理客戶端的請求。
    3、Servlet 通過呼叫 destroy() 方法終止(結束)。
    4、最後,Servlet 是由 JVM 的垃圾回收器進行垃圾回收的。

Hello World 示例程式碼

// 匯入必需的 java 庫
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

// 擴充套件 HttpServlet 類
public class HelloWorld extends HttpServlet {
 
  private String message;

  public void init() throws ServletException
  {
      // 執行必需的初始化
      message = "Hello World";
  }

  public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
            throws ServletException, IOException
  {
      // 設定響應內容型別
      response.setContentType("text/html");

      // 實際的邏輯是在這裡
      PrintWriter out = response.getWriter();
      out.println("<h1>" + message + "</h1>");
  }
 
  public void destroy()
  {
      // 什麼也不做
  }
}

Servlet常用物件

Request

1    Cookie[] getCookies()
返回一個陣列,包含客戶端傳送該請求的所有的 Cookie 物件。
2    Enumeration getAttributeNames()
返回一個列舉,包含提供給該請求可用的屬性名稱。
3    Enumeration getHeaderNames()
返回一個列舉,包含在該請求中包含的所有的頭名。
4    Enumeration getParameterNames()
返回一個 String 物件的列舉,包含在該請求中包含的引數的名稱。
5    HttpSession getSession()
返回與該請求關聯的當前 session 會話,或者如果請求沒有 session 會話,則建立一個。
6    HttpSession getSession(boolean create)
返回與該請求關聯的當前 HttpSession,或者如果沒有當前會話,且建立是真的,則返回一個新的 session 會話。
7    Locale getLocale()
基於 Accept-Language 頭,返回客戶端接受內容的首選的區域設定。
8    Object getAttribute(String name)
以物件形式返回已命名屬性的值,如果沒有給定名稱的屬性存在,則返回 null。
9    ServletInputStream getInputStream()
使用 ServletInputStream,以二進位制資料形式檢索請求的主體。
10    String getAuthType()
返回用於保護 Servlet 的身份驗證方案的名稱,例如,"BASIC" 或 "SSL",如果JSP沒有受到保護則返回 null。
11    String getCharacterEncoding()
返回請求主體中使用的字元編碼的名稱。
12    String getContentType()
返回請求主體的 MIME 型別,如果不知道型別則返回 null。
13    String getContextPath()
返回指示請求上下文的請求 URI 部分。
14    String getHeader(String name)
以字串形式返回指定的請求頭的值。
15    String getMethod()
返回請求的 HTTP 方法的名稱,例如,GET、POST 或 PUT。
16    String getParameter(String name)
以字串形式返回請求引數的值,或者如果引數不存在則返回 null。
17    String getPathInfo()
當請求發出時,返回與客戶端傳送的 URL 相關的任何額外的路徑資訊。
18    String getProtocol()
返回請求協議的名稱和版本。
19    String getQueryString()
返回包含在路徑後的請求 URL 中的查詢字串。
20    String getRemoteAddr()
返回傳送請求的客戶端的網際網路協議(IP)地址。
21    String getRemoteHost()
返回傳送請求的客戶端的完全限定名稱。
22    String getRemoteUser()
如果使用者已通過身份驗證,則返回發出請求的登入使用者,或者如果使用者未通過身份驗證,則返回 null。
23    String getRequestURI()
從協議名稱直到 HTTP 請求的第一行的查詢字串中,返回該請求的 URL 的一部分。
24    String getRequestedSessionId()
返回由客戶端指定的 session 會話 ID。
25    String getServletPath()
返回撥用 JSP 的請求的 URL 的一部分。
26    String[] getParameterValues(String name)
返回一個字串物件的陣列,包含所有給定的請求引數的值,如果引數不存在則返回 null。
27    boolean isSecure()
返回一個布林值,指示請求是否使用安全通道,如 HTTPS。
28    int getContentLength()
以位元組為單位返回請求主體的長度,並提供輸入流,或者如果長度未知則返回 -1。
29    int getIntHeader(String name)
返回指定的請求頭的值為一個 int 值。
30    int getServerPort()
返回接收到這個請求的埠號。
31    int getParameterMap()
將引數封裝成 Map 型別。

Response

1    String encodeRedirectURL(String url)
為 sendRedirect 方法中使用的指定的 URL 進行編碼,或者如果編碼不是必需的,則返回 URL 未改變。
2    String encodeURL(String url)
對包含 session 會話 ID 的指定 URL 進行編碼,或者如果編碼不是必需的,則返回 URL 未改變。
3    boolean containsHeader(String name)
返回一個布林值,指示是否已經設定已命名的響應報頭。
4    boolean isCommitted()
返回一個布林值,指示響應是否已經提交。
5    void addCookie(Cookie cookie)
把指定的 cookie 新增到響應。
6    void addDateHeader(String name, long date)
新增一個帶有給定的名稱和日期值的響應報頭。
7    void addHeader(String name, String value)
新增一個帶有給定的名稱和值的響應報頭。
8    void addIntHeader(String name, int value)
新增一個帶有給定的名稱和整數值的響應報頭。
9    void flushBuffer()
強制任何在緩衝區中的內容被寫入到客戶端。
10    void reset()
清除緩衝區中存在的任何資料,包括狀態碼和頭。
11    void resetBuffer()
清除響應中基礎緩衝區的內容,不清除狀態碼和頭。
12    void sendError(int sc)
使用指定的狀態碼傳送錯誤響應到客戶端,並清除緩衝區。
13    void sendError(int sc, String msg)
使用指定的狀態傳送錯誤響應到客戶端。
14    void sendRedirect(String location)
使用指定的重定向位置 URL 傳送臨時重定向響應到客戶端。
15    void setBufferSize(int size)
為響應主體設定首選的緩衝區大小。
16    void setCharacterEncoding(String charset)
設定被髮送到客戶端的響應的字元編碼(MIME 字符集)例如,UTF-8。
17    void setContentLength(int len)
設定在 HTTP Servlet 響應中的內容主體的長度,該方法設定 HTTP Content-Length 頭。
18    void setContentType(String type)
如果響應還未被提交,設定被髮送到客戶端的響應的內容型別。
19    void setDateHeader(String name, long date)
設定一個帶有給定的名稱和日期值的響應報頭。
20    void setHeader(String name, String value)
設定一個帶有給定的名稱和值的響應報頭。
21    void setIntHeader(String name, int value)
設定一個帶有給定的名稱和整數值的響應報頭。
22    void setLocale(Locale loc)
如果響應還未被提交,設定響應的區域。
23    void setStatus(int sc)
為該響應設定狀態碼。

Cookie

Cookie 是儲存在客戶端計算機上的文字檔案,並保留了各種跟蹤資訊。Java Servlet 顯然支援 HTTP Cookie。
識別返回使用者包括三個步驟:
    1、伺服器指令碼向瀏覽器傳送一組 Cookie。例如:姓名、年齡或識別號碼等。
    2、瀏覽器將這些資訊儲存在本地計算機上,以備將來使用。
    3、當下一次瀏覽器向 Web 伺服器傳送任何請求時,瀏覽器會把這些 Cookie 資訊傳送到伺服器,伺服器將使用這些資訊來識別使用者。


建立一個 Cookie 物件:您可以呼叫帶有 cookie 名稱和 cookie 值的 Cookie 建構函式,cookie 名稱和 cookie 值都是字串。
Cookie cookie = new Cookie("key","value");

1    public void setDomain(String pattern)
該方法設定 cookie 適用的域,例如 runoob.com。
2    public String getDomain()
該方法獲取 cookie 適用的域,例如 runoob.com。
3    public void setMaxAge(int expiry)
該方法設定 cookie 過期的時間(以秒為單位)。如果不這樣設定,cookie 只會在當前 session 會話中持續有效。
4    public int getMaxAge()
該方法返回 cookie 的最大生存週期(以秒為單位),預設情況下,-1 表示 cookie 將持續下去,直到瀏覽器關閉。
5    public String getName()
該方法返回 cookie 的名稱。名稱在建立後不能改變。
6    public void setValue(String newValue)
該方法設定與 cookie 關聯的值。
7    public String getValue()
該方法獲取與 cookie 關聯的值。
8    public void setPath(String uri)
該方法設定 cookie 適用的路徑。如果您不指定路徑,與當前頁面相同目錄下的(包括子目錄下的)所有 URL 都會返回 cookie。
9    public String getPath()
該方法獲取 cookie 適用的路徑。
10    public void setSecure(boolean flag)
該方法設定布林值,表示 cookie 是否應該只在加密的(即 SSL)連線上傳送。
11    public void setComment(String purpose)
設定cookie的註釋。該註釋在瀏覽器向使用者呈現 cookie 時非常有用。
12    public String getComment()
獲取 cookie 的註釋,如果 cookie 沒有註釋則返回 null。

Session

HTTP 是一種"無狀態"協議,這意味著每次客戶端檢索網頁時,客戶端開啟一個單獨的連線到 Web 伺服器,伺服器會自動不保留之前客戶端請求的任何記錄。
1    public Object getAttribute(String name)
該方法返回在該 session 會話中具有指定名稱的物件,如果沒有指定名稱的物件,則返回 null。
2    public Enumeration getAttributeNames()
該方法返回 String 物件的列舉,String 物件包含所有繫結到該 session 會話的物件的名稱。
3    public long getCreationTime()
該方法返回該 session 會話被建立的時間,自格林尼治標準時間 1970 年 1 月 1 日午夜算起,以毫秒為單位。
4    public String getId()
該方法返回一個包含分配給該 session 會話的唯一識別符號的字串。
5    public long getLastAccessedTime()
該方法返回客戶端最後一次傳送與該 session 會話相關的請求的時間自格林尼治標準時間 1970 年 1 月 1 日午夜算起,以毫秒為單位。
6    public int getMaxInactiveInterval()
該方法返回 Servlet 容器在客戶端訪問時保持 session 會話開啟的最大時間間隔,以秒為單位。
7    public void invalidate()
該方法指示該 session 會話無效,並解除繫結到它上面的任何物件。
8    public boolean isNew()
如果客戶端還不知道該 session 會話,或者如果客戶選擇不參入該 session 會話,則該方法返回 true。
9    public void removeAttribute(String name)
該方法將從該 session 會話移除指定名稱的物件。
10    public void setAttribute(String name, Object value)
該方法使用指定的名稱繫結一個物件到該 session 會話。
11    public void setMaxInactiveInterval(int interval)
該方法在 Servlet 容器指示該 session 會話無效之前,指定客戶端請求之間的時間,以秒為單位。

ServletContext

ServletContext即Servlet上下文物件,該物件表示當前的web應用環境資訊,一個Web應用只會建立一個ServletContext物件。
1.如何得到ServletContext例項
    this.getServletContext();
2.你可以把它想象成一張表,這個和session非常相似,每一行就是一個屬性:
    新增屬性setAttribute(String name, Object ob);
    得到值getAttribute(String name); 返回Object
    刪除屬性removeAttribute(String name);
3.生命週期
ServletContext中的生命週期從建立開始,到伺服器關閉而結束。

 

相關文章