01 06Servlet編程入門

CGI是最早的動態編程技術,並且這是一個標準,可以使用任何的語言實現,但是Java對CGI程序的實現就是Servlet,也就是說Servlet就是一個CGI程序編程。傳統的CGI採用的是多進程的方式進行處理的,所以來講性能會很差,但是Servlet不太一樣,Servlet使用的是Java多線程來進行處理,也就是說每一次的用戶請求發送過來後都會啓動一個線程進行處理。

但是Servlet程序是利用Java類的結構實現的,並且最早出現的技術就是Servlet,可是Servlet對於WEB開發人員的技術要求比較高,所以剛開始出現時並不容易被人所掌握,後來SUN受到了微軟ASP(ASP+COM)技術的啓發,才產生了JSP(JSP+JavaBean(DAO))技術。

雖然JSP是通過Servlet改良而得來的,但並不意味着Servlet程序就沒有任何的用處了,相反,它在所有的開發之中用處非常的大,而且也非常的重要。

1 開發第一個Servlet程序

Servlet程序是以類的形式定義的,所以如果要想使用一個Servlet程序,那麼必須將程序生成的*.class文件放在WEB-INF/classes目錄下。Servlet的安全性是非常高。但是開發起來比較麻煩。
1、任何一個Servlet程序類都必須繼承HttpServlet父類;
首先觀察HttpServlet類的定義結構:

public abstract class HttpServlet
extends GenericServlet

發現HttpServlet是一個抽象類,所以這個類如果要使用必須有子類,同時在這個類裏面沒有任何的抽象方法(實現意義:使用這個類必須要有子類,而且子類可以根據自己的需要選擇性的覆寫方法)。

既然JSP程序的功能是處理用戶請求的,那麼Servlet也一定是處理用戶請求的,所以可以覆寫HttpServlet類中提供的如下兩個方法:
(1)處理GET請求:protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
(2)處理POST請求:protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
現在可以發現在doGet()doPost()方法上都接收了HttpServletRequest與HttpServletResponse兩個接口實例,那麼就表示這些方法可以接受用戶的請求,同時可以針對於請求進行迴應。

如果要利用Servlet程序輸出HTML代碼,那麼必須取得客戶端的輸出流.
(1)取得字符打印流:public PrintWriter getWriter() throws IOException

package org.lks.demo;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletException;
import java.io.IOException;

//必須是public class, 因爲要被外部所訪問
public class HelloServlet extends HttpServlet{
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{
        resp.setCharacterEncoding("UTF-8");
        PrintWriter out = resp.getWriter();
        out.print("<html>");
        out.print("<head>");
        out.print("<title>第一個Servlet程序</title>");
        out.print("</head>");
        out.print("<body>");
        out.print("<h1>Hello World!</h1>");
        out.print("</body>");
        out.print("</html>");
        out.close();
    }
}

Servlet程序是不需要主方法的,所有的程序代碼最終一定是放在服務器上執行。

3、由於所有生成的類都必須保存在WEB-INF/classes目錄中,所以可以直接在此目錄下打包編譯,這樣生成的包.類就會自動保存在所需要的目錄下了;
(1)打包編譯:java -d . HelloServlet.java
但是這個時候如果沒有任何的配置,就有可能出現如下的錯誤提示:

HelloServlet.java:5: 錯誤: 程序包javax.servlet.http不存在
import javax.servlet.http.HttpServletResponse;
                         ^
HelloServlet.java:6: 錯誤: 程序包javax.servlet不存在
import javax.servlet.ServletException;

發現此時javax.servlet與javax.servlet.http兩個包都不存在。JDK實際上包含的只是Java SE的支持,而JSP是屬於JAVA EE的範疇,所以JDK在編譯Servlet的時候就會出現缺少開發包的情況。

Servlet的開發包保存在了TOMCAT_HOME/lib/servlet-api.jar文件裏面。那麼如果要想引用這個jar文件需要配置CLASSPATH屬性了。

SET CLASSPATH=.;D:\Program Files\Tomcat\apache-tomcat-9.0.13\lib\servlet-api.jar;

4、但是必須遺憾的告訴大家的是,此時Servlet還是不能夠運行,Servlet程序是放在WEB容器下執行的,所以如果要想運行Servlet還必須配置web.xml文件,也就是說爲一個Servlet定義一個它的訪問路徑。

<!-- 表示要進行Servlet類的配置-->
  <servlet>
    <!-- 主要是配置在此文件中使用的關聯名稱 -->
    <servlet-name>MyHello</servlet-name>
    <!--所有的Servlet程序一定要保存在CLASSPATH下-->
    <servlet-class>org.lks.demo.HelloServlet</servlet-class>
  </servlet>
  <!--配置Servlet的映射路徑-->
  <servlet-mapping>
    <!-- 主要是配置在此文件中使用的關聯名稱 -->
    <sevlet-name>MyHello</servlet-name>
    <!--定義映射路徑-->
    <url-pattern>/hello.do</url-pattern>
  </servlet-mapping>

此時配置的是一個根目錄的映射路徑,所以直接在根路徑下就可以訪問/hello.do

通過以上的一段配置可以發現所有的Servlet程序要想運行必須依靠web.xml文件的配置支持,同時Servlet與JSP相比,JSP更加適合於輸出,但是Servlet的最大優點是安全,而且使用原始Java編寫,調用程序的時候更加的方便。

5、在任何的Servlet程序裏面最大的特色還在於,可以爲一個Servlet配置多個路徑。

 <servlet-mapping>
    <servlet-name>MyHello</servlet-name>
    <url-pattern>/hhy.bd</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>MyHello</servlet-name>
    <url-pattern>/testdemo/*</url-pattern>
  </servlet-mapping>

在Servlet配置上*絕對是一個特色。

2 利用MyEclipse開發

Servlet依然屬於Java程序,所以此程序依然要在src目錄下建立,而且所有的類必須有包。


隨後進入到web.xml文件的映射配置的窗口界面。

Name選項實際上配置的就是Servlet中在web.xml文件裏的<servlet-name>的內容。
URL:表示配置的映射路徑。

而後詢問用戶要在建立的Servlet中覆寫哪些方法,本次就先覆寫doGet()方法。
範例:查看web.xml文件

  <servlet>
    <servlet-name>HelloServlet</servlet-name>
    <servlet-class>org.lks.demo.HelloServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>HelloServlet</servlet-name>
    <url-pattern>/HelloServlet</url-pattern>
  </servlet-mapping>

可以看到此時已經自動生成了Servlet的配置信息。
範例:定義程序類

package org.lks.demo;

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;

@SuppressWarnings("serial")
public class HelloServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		response.setContentType("text/html");
		PrintWriter out = response.getWriter();
		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.print("    This is ");
		out.print(this.getClass());
		out.println(", using the GET method");
		out.println("  </BODY>");
		out.println("</HTML>");
		out.flush();
		out.close();
	}

}

一個完整的Servlet就可以直接使用了。

總結:
(1)Sevlet是一個純粹的Java編寫的動態WEB程序;
|————Servlet類必須繼承HttpServlet這個父類,而且要按照規則覆寫裏面的方法。
(2)任何的Servlet程序類如果需要被使用,必須在web.xml文件裏進行配置;
|————<servlet>元素配置的Servlet程序類,而<servlet-mapping>元素配置的是映射路徑;
(3)Servlet1與JSP相比,不適合於進行頁面信息的輸出。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章