1、關於Servlethtml
在上一篇隨筆中,咱們看到了CGI存在的不足,其每次請求都需加載和運行一個CGI程序。若使用Java編寫CGI程序,須要爲每一個請求都啓動一個系統進程以及JVM,其執行效率大大下降。若是有辦法取消這些開銷,即只須要啓動一個系統進程以及一個JVM映像,基於Java的CGI就能獲得很好的改善。java
Servlet就基於這種想法產生了,利用Java運行時可動態加載來處理新的請求,只須要啓動一次服務器進程,只加載一次JVM,以後這個JVM再動態加載另外的類。其執行效率比傳統CGI快得多了。Servlet的優勢以下:web
一、只須要啓動一個系統進程以及加載一個JVM,大大下降系統開銷。數據庫
二、若是多個請求須要作一樣處理的時候,只須要加載一個類,這也大大下降開銷。瀏覽器
三、全部動態加載的類能夠實現對網絡協議以及請求解碼的代碼共享,大大下降工做量。服務器
四、Servlet可以直接和Web服務器交互,而普通的CGI不能。Servlet還可以在各個程序之間共享數據,使得數據庫鏈接池之類的功能很容易實現。網絡
五、Servlet是與平臺無關的,由於它們是用Java編寫的。app
那究竟什麼是Servlet呢? 簡單地說:Servlet就是JAVA 類,是一個繼承HttpServlet類的類,在服務器端運行,用以處理客戶端的請求。如今的Web服務器(例如Tomcat)已經集成了Servlet容器,Servlet容器負責管理加載、卸載、從新加載和執行Servlet代碼等操做。eclipse
具體來說,Servlet是一種實現了javax.servlet.Servlet接口的類。Servlet接口規定了特定的方法來處理特定的請求。開發者只須要實現Servlet的相關方法,用戶訪問web程序時,Tomcat會調用這些方法來完成業務處理。Servlet擴展類javax.servlet.http.HttpServlet,實現Servlet接口和抽象類,它是專門設計用來處理HTTP請求。編寫Servlet時直接繼承HttpServlet,並覆蓋須要的方法便可,通常只覆蓋doGet()和doPost()方法。yii
2、Servlet工做流程
當用戶訪問服務器時,發送Request請求,由服務器(Tomcat)接收並解析,封裝成HttpServletRequest類型的request對象,同時將輸出流封裝成HttpServletResponse類型的response對象,而後服務器(Tomcat)把request、response做爲參數,調用Servlet的相應方法進行處理,例如doPost(request,response),doGet(request,response)等。
這裏需簡單瞭解HTTP規範,HTTP1.1規範支持OPTIONS、GET、POST、HEAD、PUT、DELETE以及TRACE等7中web訪問方式。咱們經常使用的有GET和POST。其中
·GET:表示查詢信息,URL中能夠附帶少許的參數信息,而且參數會顯示在瀏覽器地址欄。
·POST:表示提交信息,通常用於提交大量數據信息或者文件,提交的內容不受長度限制,而且不會顯示在瀏覽器地址欄。
Java-Web請求響應過程以下圖:
來看一個典型的Java Servlet代碼
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 HelloServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); //設置向客戶端發送的內容格式 PrintWriter out = response.getWriter(); //利用PrintWriter對象的方法將數據發送給客戶端 out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">"); out.println("<HTML>"); out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>"); out.println(" <BODY>"); out.println(" Hello Servlet!"); out.println(" </BODY>"); out.println("</HTML>"); out.flush(); out.close(); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); //這條語句的做用是,當客戶端發送POST請求時,調用doGet()方法進行處理 } }
當用戶請求該頁面時,Servlet重複使用PrintWriter.println()方法來輸出相應的HTML頁面,以達到動態生成HTML頁面的效果。
Servlet的配置文件爲web.xml。這裏涉及web程序在Tomcat上的部署,不詳細展開,有關Java web環境的搭建(Myeclipse+Tomcat+MySQL)在下一篇隨筆中詳述。這裏只展現一下配置文件。
<?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <servlet> <description>This is the description of my J2EE component</description> <display-name>This is the display name of my J2EE component</display-name> <servlet-name>HelloServlet</servlet-name> <servlet-class>firstWeb.HelloServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloServlet</servlet-name> <url-pattern>/servlet/HelloServlet</url-pattern> </servlet-mapping> </web-app>
雖然Servlet改變傳統CGI程序的缺點,可是它也有不足之處:Servlet生成網頁的方法是在java類中嵌入HTML標籤和表達式,也就是說對HTML作一個小小的改動時,須要修改和從新編譯Servlet源文件,而後從新部署到Servlet容器中,這使得修改Servlet變得很是麻煩。
有興趣的朋友可經過如下連接進一步學習:
一、易百Servlets教程:http://www.yiibai.com/servlets