淺談Servlet

Servlet(服務端小程序)是使用Java語言編寫的服務端小程序,能夠用於生成動態的Web頁面。html

Servlet處理的基本流程

clipboard.png

  1. 客戶端經過HTTP提出請求。
  2. Web服務器接受該請求並將其發送給Servlet。若是這個Servlet尚未被加載,Web服務器會將它加載到Java虛擬機並執行它。
  3. Servlet程序將接收該HTTP請求並執行某種處理。
  4. Servlet會將處理後的結果向Web服務器返回應答。
  5. Web服務器將從Servlet收到的應答發回給客戶端。

在整個Servlet程序中,最重要的就是Servlet接口,在此接口下定義了一個GenericServlet的子類,可是通常不會直接繼承這個子類,而是根據不一樣的協議選擇GenericServlet的子類來繼承,例如:
clipboard.pngjava

用Servlet來寫一個「Hello World」

首先咱們要明確的一件事是:在處理HTTP請求的Servlet程序中,確定要繼承HttpServlet類,那麼在自定義的Servlet中至少要覆寫HttpServlet中提供的doGet()方法。web

javapackage servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        PrintWriter out = resp.getWriter();
        out.print("<html><head><title>First Servlet</title></head>");
        out.println("<body>");
        out.println("

<h1>Hello world</h1>

");
        out.println("</body></html>");
        out.close();
    }
}

寫好這個Servlet而後編譯,還不能訪問,由於咱們還須要找到一個鉤子讓網頁跟咱們的Servlet聯繫起來。那麼這個「鉤子」就是配置web.xml的路由映射數據庫

xml<servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/helloServlet</url-pattern>
</servlet-mapping>

這樣,就能夠經過../helloServlet查看效果:
clipboard.png小程序

一個表單實例

若是表單使用的是post的方式提交的,因此在編寫Servlet程序時要使用doPost()方法。
input.html:服務器

html<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>信息錄入</title>
</head>
<body>
<form action="inputServlet" method="post">
    輸入內容: <input type="text" name="info"/>
    <input type="submit" value="提交"/>
</form>
</body>
</html>

InputServlet.java:app

javapackage servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * Created by mcbird on 14/11/24.
 */
public class InputServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String info = req.getParameter("info");
        PrintWriter out = resp.getWriter();
        out.println("<html><body>");
        out.println("

<h1>" + info + "</h1>

");
        out.println("</body></html>");
        out.close();
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req, resp);
    }
}

一樣,咱們也須要在web.xml下添加一條路由映射規則:
web.xml:ide

xml<servlet>
        <servlet-name>input</servlet-name>
        <servlet-class>servlet.InputServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>input</servlet-name>
        <url-pattern>/inputServlet</url-pattern>
    </servlet-mapping>

這樣咱們在input.html中輸入信息後就會跳轉到InputServlet,這樣InputServlet就能夠經過req對象獲取到info變量的值。post

Servlet生命週期

Servlet的生命週期包括加載程序、初始化、服務、銷燬、卸載5個部分,以下圖所示。
clipboard.pngthis

加載Servlet

Web容器啓動時或者是在第一次使用這個Servlet時,容器會負責建立Servlet實例,可是必須在web.xml中指定Servlet的位置,成功加載後,Web容器會經過反射的方式對Servlet進行實例化

初始化

當一個Servlet被實例化後,容器將調用init()方法初始化這個對象,初始化的目的是爲了讓Servlet對象在處理客戶端請求前完成一系列初始化的工做,像創建數據庫的鏈接、讀取資源文件信息等,若是初始化時失敗了,那麼Servlet將被直接卸載。

處理服務

當有請求提交時,Servlet將調用service()方法(經常使用的是doGet()doPost())進行處理。

銷燬

當Web容器關閉或者檢測到一個Servlet要從容器中被刪除時,會自動調用destroy()方法,以便讓實例釋放掉所佔用的資源。

卸載

當一個Servlet調用完destroy()方法後,此實例將等待被垃圾收集器所回收,若是須要再次使用此Servlet時,會從新調用init()方法進行初始化。

在默認狀況下,初始化方法是在第一次使用時才調用,你也能夠經過在web.xml中配置servlet<load-on-startup>1</load-on-startup>這樣在容器啓動時Servlet就會被初始化。

相關文章
相關標籤/搜索