Servlet是一個用Java編寫的應用程序,在服務器上運行,處理請求的信息並將其發送到客戶端。
Servlet的客戶端提出請求並獲得該請求的響應。
對於所有的客戶端請求,只需要創建Servlet的實例一次(這是和CGI(Common Gateway Interface)的重要區別,CGI是每個請求創建一個新實例),因此節省了大量的內存。
Servlet在初始化后即駐留內存中,因此每次作出請求時無需加載。
下面通過一個例子來介紹如何編寫一個簡單的Servlet。
准備工作:
1. 下載並啟動Tomcat(作為Servlet的容器)
實例步驟:
1. 在Tomcat/webapps下面創建新的folder,helloapp
2. 創建helloapp的子文件夾如下
helloapp
----WEB-INF
--------web.xml
--------classes
--------lib
3. 在classes下面創建新的java文件,Hello.java
4. 引入servlet-api.jar, import javax.servlet.*;
5. Servlet的實現有3種方式,下面分開進行介紹(重點)
HttpServlet繼承GenericServlet,GenericServlet實現了Servlet。
5.1 實現Servlet接口
public class Hello implements Servlet{ @Override public void init(ServletConfig sc) throws ServletException { //只有第一次被調用,初始化函數。 System.out.println("initialization..."); } @Override public ServletConfig getServletConfig() { return null; } @Override public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { //每次訪問都被調用,業務邏輯寫在這里。 System.out.println("call service"); PrintWriter pw = res.getWriter(); pw.write("My first web app."); } @Override public String getServletInfo() { return null; } @Override public void destroy() { //最后關閉時,調用。 System.out.println("destroy..."); } }
5.2 繼承GenericServlet
public class Hello2 extends GenericServlet{ @Override public void service(ServletRequest sr, ServletResponse sr1) throws ServletException, IOException { //業務邏輯,每次訪問都被調用。 System.out.println("Testing...."); PrintWriter pw = sr1.getWriter(); pw.println("my second web app."); } }
5.3 繼承HttpServlet
public class Hello3 extends HttpServlet{ @Override public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException{ System.out.println("do get method..."); PrintWriter pw = res.getWriter(); pw.println("do get method."); } public void doPost(HttpServletRequest req, HttpServletResponse res) throws IOException{ System.out.println("do post method..."); PrintWriter pw = res.getWriter(); pw.println("do post method."); } }
6. 編譯源文件
7. 修改web.xml
<servlet> <servlet-name>Hello</servlet-name>//servlet 名稱,隨便起 <servlet-class>com.test.servlet.Hello</servlet-class>//對應的類 </servlet> <servlet-mapping> <servlet-name>Hello</servlet-name>//servlet名稱,隨便起,但是要與servlet中的名稱一致。 <url-pattern>/h1</url-pattern>//對應的,瀏覽器中url。 </servlet-mapping>
8. 訪問helloapp/h1,可以看到結果。