Java Servlet——改進的CGI

 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()方法進行處理
    }
}
View Code

   當用戶請求該頁面時,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>
View Code

  雖然Servlet改變傳統CGI程序的缺點,可是它也有不足之處:Servlet生成網頁的方法是在java類中嵌入HTML標籤和表達式,也就是說對HTML作一個小小的改動時,須要修改和從新編譯Servlet源文件,而後從新部署到Servlet容器中,這使得修改Servlet變得很是麻煩。  

    有興趣的朋友可經過如下連接進一步學習:

  一、易百Servlets教程:http://www.yiibai.com/servlets

相關文章
相關標籤/搜索