Servlet再度學習

雖然Servlet已經使用很多了,但是一直都僅侷限在其使用操作上。

最近有空想對它進行一個相對全面的瞭解。

下面是博主整理的一篇博文。

一、Servlet簡介

Servlet(Server Applet),全稱Java Servlet,未有中文譯文。是用Java編寫的服務器端程序。其主要功能在於交互式地瀏覽和修改數據,生成動態Web內容。狹義的Servlet是指Java語言實現的一個接口,廣義的Servlet是指任何實現了這個Servlet接口的類,一般情況下,人們將Servlet理解爲後者。

Servlet運行於支持Java的應用服務器中。從原理上講,Servlet可以響應任何類型的請求,但絕大多數情況下Servlet只用來擴展基於HTTP協議的Web服務器。

二、Servlet 工作原理

web應用的初始化工作(創建servlet對象)

一般在Java Web項目中,我們使用Servlet,其配置是在web.xml中的。而應用的初始化主要是解析web.xml文件。

Web應用的初始化工作是在ContextConfig的configureStart方法中實現的,應用的初始化主要是解析web.xml文件,這個文件描述了一個Web應用的關鍵信息,也是一個Web應用的入口。web.xml文件中的各個配置項將會解析成相應的屬性保存在WebXml對象中。WebXml對象中的屬性又會被設置到Context容器中,這裏包括創建Servlet對象、filter、listener等,所以說Context容器纔是真正運行Servlet的Servlet容器。一個Web應用對應一個Context容器,容器的配置屬性由應用的web.xml指定。

Servlet如何工作

用戶從瀏覽器向服務器發起的一個請求通常會包含如下信息:http://hostname:port/contextpath/servletpath,hostname和port用來與服務器建立TCP連接,後面的URL才用來選擇在服務器中哪個子容器服務用戶的請求。在Tomcat中URL與Servlet容器通過類org.apache.tomcat.util.http.mapper來完成映射,Mapper會根據請求的hostname和contextpath將host和context容器設置到Request的mappingData屬性中。

Servlet能幫我們完成所有工作,但是現在的Web應用很少直接將交互的全部頁面用Servlet來實現,而是採用更加高效的MVC框架來實現。這些MVC框架的基本原理是將所有的請求都映射到一個Servlet,然後去實現service方法,這個方法也就是MVC框架的入口。

當Servlet從Servlet容器中移除時,也表明該Servlet的生命週期結束了,這時Servlet的destroy方法將被調用,做一些掃尾工作

Servlet 生命週期

Servlet 生命週期可被定義爲從創建直到毀滅的整個過程。以下是 Servlet 遵循的過程:

Servlet 通過調用 init () 方法進行初始化。
Servlet 調用 service() 方法來處理客戶端的請求。
Servlet 通過調用 destroy() 方法終止(結束)。
最後,Servlet 是由 JVM 的垃圾回收器進行垃圾回收的。
init() 方法
init 方法被設計成只調用一次。它在第一次創建 Servlet 時被調用,在後續每次用戶請求時不再調用。因此,它是用於一次性初始化,就像 Applet 的 init 方法一樣。
Servlet 創建於用戶第一次調用對應於該 Servlet 的 URL 時,但是您也可以指定 Servlet 在服務器第一次啓動時被加載。
當用戶調用一個 Servlet 時,就會創建一個 Servlet 實例,每一個用戶請求都會產生一個新的線程,適當的時候移交給 doGet 或 doPost 方法。init() 方法簡單地創建或加載一些數據,這些數據將被用於 Servlet 的整個生命週期。
service() 方法
service() 方法是執行實際任務的主要方法。Servlet 容器(即 Web 服務器)調用 service() 方法來處理來自客戶端(瀏覽器)的請求,並把格式化的響應寫回給客戶端。
每次服務器接收到一個 Servlet 請求時,服務器會產生一個新的線程並調用服務。service() 方法檢查 HTTP 請求類型(GET、POST、PUT、DELETE 等),並在適當的時候調用 doGet、doPost、doPut,doDelete 等方法。
doGet() 方法
GET 請求來自於一個 URL 的正常請求,或者來自於一個未指定 METHODHTML 表單,它由 doGet() 方法處理。
doPost() 方法
POST 請求來自於一個特別指定了 METHODPOSTHTML 表單,它由 doPost() 方法處理。
destroy() 方法
destroy() 方法只會被調用一次,在 Servlet 生命週期結束時被調用。destroy() 方法可以讓您的 Servlet 關閉數據庫連接、停止後臺線程、把 Cookie 列表或點擊計數器寫入到磁盤,並執行其他類似的清理活動。

三、Servlet使用實例

實例使用前提:已經配置好了JDK和Tomcat

下面我們準備好如下東西:

(1)Servlet:HelloWorld.java

// 導入必需的 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()
  {
      // 什麼也不做
  }
}

(2)servlet-api.jar

需要依賴servlet-api.jar包無須做過多解釋,這裏麪包含了Servlet相關接口類。

博主已經提供了相應的jar包供猿友們下載:
http://download.csdn.net/detail/u013142781/9446459

接下來還需要如下操作:

(1)將HelloWorld.java和servlet-api.jar放到D:\servlettest下。(猿友如果放到其他目錄,下面的設置應作相應修改)

(2)環境變量CLASSPATH中添加servlet-api.jar存放路徑,博主的是D:\servlettest\servlet-api.jar

這裏寫圖片描述

(3)打開cmd,進入到D:\servlettest(cd D:\servlettest),然後執行命令javac HelloWorld.java,編譯 Servlet。

(4)編譯成功後發現D:\servlettest下多了個HelloWorld.class文件。

(5)將HelloWorld.class文件放到tocmat的webapps\ROOT\WEB-INF\classes下(如果沒有classes,自己新建一個放進去)

(6)tocmat的webapps\ROOT\WEB-INF\web.xml文件添加如下配置:

<servlet>
    <servlet-name>HelloWorld</servlet-name>
    <servlet-class>HelloWorld</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>HelloWorld</servlet-name>
    <url-pattern>/HelloWorld</url-pattern>
</servlet-mapping>

博主的web.xml配置後是這樣的:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!--
 Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                      http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
  version="3.0"
  metadata-complete="true">

  <display-name>Welcome to Tomcat</display-name>
  <description>
     Welcome to Tomcat
  </description>

  <servlet>
    <servlet-name>HelloWorld</servlet-name>
    <servlet-class>HelloWorld</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>HelloWorld</servlet-name>
    <url-pattern>/HelloWorld</url-pattern>
  </servlet-mapping>

</web-app>

(7)接下來雙擊tomcat的bin目錄下的startup.sh來啓動tomcat。

(8)訪問路徑:http://localhost:8080/HelloWorld,效果如下:

這裏寫圖片描述

發佈了98 篇原創文章 · 獲贊 1338 · 訪問量 177萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章