程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> JavaWeb - Servlet開發

JavaWeb - Servlet開發

編輯:JAVA綜合教程

JavaWeb - Servlet開發


一、Servlet簡介

Servlet是sun公司提供的一門用於開發動態web資源的技術。
Sun公司在其API中提供了一個servlet接口,用戶若想用發一個動態web資源(即開發一個Java程序向浏覽器輸出數據),需要完成以下2個步驟:

 1、編寫一個Java類,實現servlet接口。
 2、把開發好的Java類部署到web服務器中。
 
按照一種約定俗成的稱呼習慣,通常我們也把實現了servlet接口的java程序,稱之為Servlet

二、Servlet的運行過程

Servlet程序是由WEB服務器調用,web服務器收到客戶端的Servlet訪問請求後:
①Web服務器首先檢查是否已經裝載並創建了該Servlet的實例對象。如果是,則直接執行第④步,否則,執行第②步。
②裝載並創建該Servlet的一個實例對象。
③調用Servlet實例對象的init()方法。
④創建一個用於封裝HTTP請求消息的HttpServletRequest對象和一個代表HTTP響應消息的HttpServletResponse對象,然後調用Servlet的service()方法並將請求和響應對象作為參數傳遞進去。
⑤WEB應用程序被停止或重新啟動之前,Servlet引擎將卸載Servlet,並在卸載之前調用Servlet的destroy()方法。

三、Servlet調用圖

這裡寫圖片描述

四、在Eclipse中開發Servlet

  在eclipse中新建一個web project工程,eclipse會自動創建下圖所示目錄結構:

這裡寫圖片描述

4.1、Servlet接口實現類

Servlet接口SUN公司定義了兩個默認實現類,分別為:GenericServlet、HttpServlet。
HttpServlet指能夠處理HTTP請求的servlet,它在原有Servlet接口上添加了一些與HTTP協議處理方法,它比Servlet接口的功能更為強大。因此開發人員在編寫Servlet時,通常應繼承這個類,而避免直接去實現Servlet接口。
  HttpServlet在實現Servlet接口時,覆寫了service方法,該方法體內的代碼會自動判斷用戶的請求方式,如為GET請求,則調用HttpServlet的doGet方法,如為Post請求,則調用doPost方法。因此,開發人員在編寫Servlet時,通常只需要覆寫doGet或doPost方法,而不要去覆寫service方法。

4.2、通過Eclipse創建和編寫Servlet

  選中gacl.servlet.study包,右鍵→New→Servlet,如下圖所示:
  這裡寫圖片描述

這裡寫圖片描述
這裡寫圖片描述

這樣,我們就通過Eclipse幫我們創建好一個名字為ServletDemo1的Servlet,創建好的ServletDemo01裡面會有如下代碼:

package gacl.servlet.study;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ServletDemo1 extends HttpServlet {

    /**
     * The doGet method of the servlet. 

     *
     * This method is called when a form has its tag value method equals to get.
     * 
     * @param request the request send by the client to the server
     * @param response the response send by the server to the client
     * @throws ServletException if an error occurred
     * @throws IOException if an error occurred
     */
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("");
        out.println("
"); out.println(" "); out.println(""); out.print(" This is "); out.print(this.getClass()); out.println(", using the GET method"); out.println(" "); out.println(""); out.flush(); out.close(); } /** * The doPost method of the servlet.
* * This method is called when a form has its tag value method equals to post. * * @param request the request send by the client to the server * @param response the response send by the server to the client * @throws ServletException if an error occurred * @throws IOException if an error occurred */ public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println(""); out.println("
"); out.println(" "); out.println(""); out.print(" This is "); out.print(this.getClass()); out.println(", using the POST method"); out.println(" "); out.println(""); out.flush(); out.close(); } }

這些代碼都是Eclipse自動生成的,而web.xml文件中也多了和兩對標簽,這兩對標簽是配置ServletDemo1的,如下圖所示:
這裡寫圖片描述
這裡寫圖片描述

然後我們就可以通過浏覽器訪問ServletDemo1這個Servlet,如下圖所示:
這裡寫圖片描述

五、Servlet開發注意細節

5.1、Servlet訪問URL映射配置

由於客戶端是通過URL地址訪問web服務器中的資源,所以Servlet程序若想被外界訪問,必須把servlet程序映射到一個URL地址上,這個工作在web.xml文件中使用元素和元素完成。
元素用於注冊Servlet,它包含有兩個主要的子元素:和,分別用於設置Servlet的注冊名稱和Servlet的完整類名。
一個元素用於映射一個已注冊的Servlet的一個對外訪問路徑,它包含有兩個子元素:和,分別用於指定Servlet的注冊名稱和Servlet的對外訪問路徑。例如:


    ServletDemo1
    gacl.servlet.study.ServletDemo1
  

  
    ServletDemo1
    /servlet/ServletDemo1
  

同一個Servlet可以被映射到多個URL上,即多個元素的子元素的設置值可以是同一個Servlet的注冊名。 例如:


    ServletDemo1
    gacl.servlet.study.ServletDemo1
  

  
    ServletDemo1
    /servlet/ServletDemo1
  
 
    ServletDemo1
    /1.htm
  
   
    ServletDemo1
    /2.jsp
  
   
    ServletDemo1
    /3.php
  
   
    ServletDemo1
    /4.ASPX
  

通過上面的配置,當我們想訪問名稱是ServletDemo1的Servlet,可以使用如下的幾個地址去訪問:

  http://localhost:8080/JavaWeb_Servlet_Study_20140531/servlet/ServletDemo1

  http://localhost:8080/JavaWeb_Servlet_Study_20140531/1.htm

  http://localhost:8080/JavaWeb_Servlet_Study_20140531/2.jsp

  http://localhost:8080/JavaWeb_Servlet_Study_20140531/3.php

  http://localhost:8080/JavaWeb_Servlet_Study_20140531/4.ASPX
ServletDemo1被映射到了多個URL上。

5.2、Servlet訪問URL使用*通配符映射  

在Servlet映射到的URL中也可以使用通配符,但是只能有兩種固定的格式:一種格式是”.擴展名”,另一種格式是以正斜槓(/)開頭並以”/*”結尾。例如:

這裡寫圖片描述


    ServletDemo1
    gacl.servlet.study.ServletDemo1
  

   
    ServletDemo1
   /*

*可以匹配任意的字符,所以此時可以用任意的URL去訪問ServletDemo1這個Servlet,如下圖所示:

這裡寫圖片描述

對於如下的一些映射關系:
  Servlet1 映射到 /abc/*
  Servlet2 映射到 /*
  Servlet3 映射到 /abc
  Servlet4 映射到 *.do
當請求URL為“/abc/a.html”,“/abc/”和“/”都匹配,哪個servlet響應
  Servlet引擎將調用Servlet1。
當請求URL為“/abc”時,“/abc/*”和“/abc”都匹配,哪個servlet響應
  Servlet引擎將調用Servlet3。
當請求URL為“/abc/a.do”時,“/abc/”和“.do”都匹配,哪個servlet響應
  Servlet引擎將調用Servlet1。
當請求URL為“/a.do”時,“/”和“.do”都匹配,哪個servlet響應
  Servlet引擎將調用Servlet2。
當請求URL為“/xxx/yyy/a.do”時,“/”和“.do”都匹配,哪個servlet響應
  Servlet引擎將調用Servlet2。
  匹配的原則就是”誰長得更像就找誰”
  
5.3、Servlet與普通Java類的區別 

Servlet是一個供其他Java程序(Servlet引擎)調用的Java類,它不能獨立運行,它的運行完全由Servlet引擎來控制和調度。

針對客戶端的多次Servlet請求,通常情況下,服務器只會創建一個Servlet實例對象,也就是說Servlet實例對象一旦創建,它就會駐留在內存中,為後續的其它請求服務,直至web容器退出,servlet實例對象才會銷毀。

在Servlet的整個生命周期內,Servlet的init方法只被調用一次。而對一個Servlet的每次訪問請求都導致Servlet引擎調用一次servlet的service方法。對於每次訪問請求,Servlet引擎都會創建一個新的HttpServletRequest請求對象和一個新的HttpServletResponse響應對象,然後將這兩個對象作為參數傳遞給它調用的Servlet的service()方法,service方法再根據請求方式分別調用doXXX方法。

如果在元素中配置了一個元素,那麼WEB應用程序在啟動時,就會裝載並創建Servlet的實例對象、以及調用Servlet實例對象的init()方法。

舉例:
    
        invoker
        
            org.apache.catalina.servlets.InvokerServlet
        
        1
    

用途:為web應用寫一個InitServlet,這個servlet配置為啟動時裝載,為整個web應用創建必要的數據庫表和數據。

5.4、缺省Servlet

如果某個Servlet的映射路徑僅僅為一個正斜槓(/),那麼這個Servlet就成為當前Web應用程序的缺省Servlet。

凡是在web.xml文件中找不到匹配的元素的URL,它們的訪問請求都將交給缺省Servlet處理,也就是說,缺省Servlet用於處理所有其他Servlet都不處理的訪問請求。 例如:


    ServletDemo2
    gacl.servlet.study.ServletDemo2
    1
  

  
  
    ServletDemo2
    /
  

當訪問不存在的Servlet時,就使用配置的默認Servlet進行處理,如下圖所示:
這裡寫圖片描述

在<喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwcmUgY2xhc3M9"brush:java;"> default org.apache.catalina.servlets.DefaultServlet debug 0 listings false 1 default /

 當訪問Tomcat服務器中的某個靜態HTML文件和圖片時,實際上是在訪問這個缺省Servlet。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved