Servlet(服務端小程序)是使用Java語言編寫的服務端小程序,能夠用於生成動態的Web頁面。html
在整個Servlet程序中,最重要的就是Servlet接口,在此接口下定義了一個GenericServlet的子類,可是通常不會直接繼承這個子類,而是根據不一樣的協議選擇GenericServlet的子類來繼承,例如:java
首先咱們要明確的一件事是:在處理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
查看效果:小程序
若是表單使用的是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的生命週期包括加載程序、初始化、服務、銷燬、卸載5個部分,以下圖所示。this
當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就會被初始化。