什麼是Servlet
在Web伺服器端載入並啟動並執行Java應用程式
具體運行在Servlet引擎管理的JVM上。
Servlet容器負責Servlet和使用者的通訊以及調用Servlet的方法。
Servlet和使用者的通訊採用請求/響應模式。
用於以動態響應客戶機請求形式擴充Web伺服器(Web Container)的功能。
Servlet是程式開發伺服器端應用程式的一個很好選擇, Servlet與JSP結合使用,能提供更強大的伺服器端功能。
三種基本的Servlet引擎
大多數的J2EE伺服器,如:BEA WebLogic,WebSphere Application, JBoss等。
具有內建Servlet容器的Web伺服器,如:Tomcat。
使用Servlet引擎外掛程式的產品,如JRun、 Apache Web伺服器、Microsoft IIS等,這些產品都需要安裝Web外掛程式來整合Java運行時環境
工作原理
Servlet 處理請求的過程
- 使用者從客戶機將HTTP請求發送給Web伺服器。
- Web容器執行個體化Servlet,並建立線程。
- Web伺服器將該請求發送給Servlet。
- Servlet處理該請求。
- Servlet將響應發送給Web伺服器。
- Web伺服器將響應轉寄送給客戶機。
Servlet被發來的第一個請求啟用,然後繼續運行於後台,以線程形式處理請求,速度非常快,直到Servlet被修改時才再次載入。
一個Servlet在同一時刻只有一個執行個體,並且它在Sevlet的使用期間將一直保留。
多執行緒多請求
Servlet的生命週期
(1)初始化階段
在下列情形下Web容器裝入Servlet,建立一個Servlet執行個體,調用Servlet的init()方法對Servlet執行個體初始化:
- Servlet容器啟動時。
- 在Servlet容器啟動後,客戶首次向Servlet發出請求。
- Servlet的類檔案被修改後,重新載入。
(2)服務階段
如果容器接收到對此Servlet的請求,那麼它根據設定檔Web.xml中URL與Servlet映射關係將請求轉寄至此Servlet的service()方法。 service()方法中調用doGet()或doPost()。
(3)終止階段
執行個體被銷毀,通過調用Servlet的destory()方法來銷毀Servlet,關閉資料庫連接、中斷後台線程等。
執行個體1.
// ==================== Program Description ==========================<br />// 程式名稱: HelloWorldServlet.java<br />// 參考網址: http://www.8isp.cn/news.jsp?id=165<br />// 程式目的: 編寫最簡單的Servlet程式,熟悉其過程<br />// ==============================================================<br />import javax.servlet.*;<br />import javax.servlet.http.*;<br />import java.io.*;<br />public class HelloWorldServlet extends HttpServlet {<br /> public void service(HttpServletRequest req, HttpServletResponse res) throws IOException{<br /> res.setContentType("text/html");<br /> PrintWriter out = res.getWriter();<br /> out.println("<html><head><title>Hello World!</title></head>");<br /> out.println("<body>");<br /> out.println("<p><img src="images/build_bea_web.gif" mce_src="images/build_bea_web.gif" align=right>");<br /> out.println("<h1>Hello World!</h1></body></html>");<br /> }<br />}
將HelloWorldServlet .java編譯後得到.class檔案,
將HelloWorldServlet.class檔案拷貝到intall_dir/webapps/ROOT/WEB-INF/classes中,
開啟intall_dir/webapps/ROOT/WEB-INF/路徑下的web.xml檔案,在<web-app>...</web-app>之間添加如下內容:
<servlet>
<servlet-name>HelloWorldServlet</servlet-name>
<servlet-class>HelloWorldServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloWorldServlet</servlet-name>
<url-pattern>/HelloWorldServlet/*</url-pattern>
</servlet-mapping>
儲存web.xml 檔案,注意,備份修改前的web.xml 。
重新啟動Tomcat 伺服器,在地址欄輸入http://localhost:8080/HelloWorldServlet 訪問HelloWorldServlet .class 即可。
注意:如果Tomcat已經啟動,需要重啟Tomcat
目錄結構如下所示:
程式解釋:
這個程式用service()方法實現對用戶端的響應。在這個響應中,首先是調用了setContextType("text/html")設定響應內容類型。因為要發送文本,用getWriter( )方法獲得了PrintWriter對象,第15~18行就是發送給用戶端的資訊,一個字串"Hello World",一個幾乎在每種語言中都要出現的程式。我們並沒有顯式地關閉PrintWriter對象,Servlet引擎會自動地關閉它,這樣會提高效能
可能出現的問題 :
編譯時間提示servlet包不存在
產生這些錯誤的原因是Java編譯器沒有找到javax.servlet包中的類。
要解決這個問題,我們需要讓Java編譯器知道Servlet API庫所在的位置。Tomcat在其發行版中已經包含了Servlet API庫,是以JAR檔案的形式提供的,這個JAR檔案的完整路徑名是:
%CATALINA_HOME%/lib/servlet-api.jar
(不知為何,我把上面的路徑加進去仍不能成功,改為全路徑就可以了,C:/Program Files/Apache Software Foundation/Tomcat 7.0/lib)
我們只需要在系統的CLASSPATH環境變數下添加這個JAR檔案的路徑名就可以了。
注意,修改系統變數後需要重啟電腦