天天看點

servlet學習筆記之一

servlet 學習筆記

自序

昨天心情有些失落。公司從去年底到現在就沒有安排我做個正事,(也沒有我什麼事情,研發部門當産品出來後,還有什麼好研發呢,無非就是修改 BUG ,做些維護)。沒有事情的情況下,被拉着做測試。測試的内容也就是 GIS 的用戶端,功能沒有幾個,測試很枯燥,被叫着翻來覆去做同一件事。郁悶的是部門經理的座位在我後面,雖然隔了有 <chmetcnv w:st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="4" unitname="米"><span >4</span> <span style="FONT-FAMILY: 宋體">米</span> </chmetcnv>左右距離,但是他完全能看到我在做什麼事情。他批評了我好幾次“該做什麼就做什麼。叫你做什麼就做什麼。”不說了,我并不喜歡發牢騷……

鑒于工作中的種種因素,我想跳槽,換個環境。換工作,我是 java 程式員,而目前的工作無非就是寫 UI , swing 程式設計。類似的工作可不那麼好找,而且也打算多長點見識。是以決定離開成都去北京找工作,而且找 J2EE 方面的。辭職前我打算做個 JSP 方面的小應用、再把 JAVA 好好複習一遍這樣才對新工作有所準備。

說做就做吧。先學習 JSP (畢業前,曾自學過一點點),學習 JSP 前,有必要學習 servlet 。這就有了這一系列學習筆記……

<!--[if !supportLists]--> 1.       <!--[endif]--> 什麼是Servlet?

Java Servlet ( java 伺服器小程式)是一個基于 Java 技術的 Web 元件,運作在伺服器端,由 Servlet 容器所管理,用于生成動态的内容。

<!--[if !supportLists]--> 2.       <!--[endif]--> servlet和applet差別?

相同點:

<!--[if !supportLists]--> ²        <!--[endif]--> 他們都不是獨立的應用程式,都沒有main()方法;

<!--[if !supportLists]--> ²        <!--[endif]--> 他們都生存在容器中,applet運作在浏覽器中,servlet運作在servlet容器中。

<!--[if !supportLists]--> ²        <!--[endif]--> 他們都有生命周期,都有init()和destroy()方法;

不同點:

<!--[if !supportLists]--> ²        <!--[endif]--> applet具有圖形界面,運作在用戶端,servlet沒有圖形界面,運作在伺服器端的servlet容器中。

我寫的 applet 要多點,這樣對比有利于自己更好的掌握 servlet 技術。

<!--[if !supportLists]--> 3.       <!--[endif]--> hello world

說句廢話:買的書《 JAVA WEB 開發詳解》,孫鑫編著,感覺講得不好, servlet 簡直就是在介紹 api 手冊。

我總結的時候,自然不能這樣。還是介紹個入門例子吧。

先說下環境變量,要編譯 servlet 需要把必要的 jar 設定到 classpath 中。我的環境變量是這樣設定的。(這裡我把 jar 拷貝到了 jdk 目錄下面)

.;D:\jdk\lib\dt.jar;D:\jdk\lib\tools.jar;D:\jdk\jre\lib\rt.jar;D:\jdk\lib\servlet-api.jar;D:\jdk\lib\jsp-api.jar;

第一個程式—— test.java

import javax.servlet.ServletException;

import java.io.*;

import javax.servlet.http.*;

public class test extends HttpServlet

{

   public void doGet(HttpServletRequest req,HttpServletResponse resp)throws ServletException,IOException

   {

       PrintWriter out = resp.getWriter();

       out.println("hello, world!");

       out.close();           

   }

}

由于設定了環境變量,這裡順利編譯通過。

部署 servlet :

在 webapps 目錄下,建立一個目錄(存儲該應用)。如: hello

在該 hello 目錄下建立一個特殊目錄 WEB-INF ,注意全大寫。之是以特殊,因為該目錄對用戶端不可見。如果你把 index.html 放到 WEB-INF 目錄下面,然後通過 http://127.0.0.1:8080/hello/WEB-INF/index.html 通路,這樣是通路不到的。

而在 WEB –INF 目錄下:

建立 classes 目錄來存放編譯好的 class 檔案。

                            建立 lib 目錄來存放運作所需要的其他包。

                            建立重要的 web.xml 配置檔案。

web.xml 可以包含如下的配置和部署資訊:

<!--[if !supportLists]--> ²        <!--[endif]--> ServletContext的初始參數;

<!--[if !supportLists]--> ²        <!--[endif]--> Session的配置;

<!--[if !supportLists]--> ²        <!--[endif]--> Servlet/Jsp的定義;

<!--[if !supportLists]--> ²        <!--[endif]--> Servlet/Jsp的映射;

<!--[if !supportLists]--> ²        <!--[endif]--> MIME類型映射;

<!--[if !supportLists]--> ²        <!--[endif]--> 歡迎檔案清單;

<!--[if !supportLists]--> ²        <!--[endif]--> 錯誤頁面;

<!--[if !supportLists]--> ²        <!--[endif]--> 安全;

<!--[if !supportLists]--> ²        <!--[endif]--> 地區和編碼映射;

<!--[if !supportLists]--> ²        <!--[endif]--> jsp配置。

我們編寫的 xml 必須是格式良好的 xml 。 web.xml :

<?xml version =”<chmetcnv w:st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="1" unitname="”">1.0”</chmetcnv> encoding=”ISO-8859<chmetcnv w:st="on" tcsc="0" numbertype="1" negative="True" hasspace="False" sourcevalue="1" unitname="”">-1”</chmetcnv>?>

<web-app>

<servlet>

       <servlet-name>helloworld</servlet-name>

       <servlet-class>test</servlet-class>

</servlet>

<servlet-mapping>

       <servlet-name>helloworld</servlet-name>

<url-pattern>/hello</url-pattern>

</servlet-mapping>

</web-app>

這樣輸入:“ http://127.0.0.1:8080/hello/hello “就通路到了剛才寫的 servlet 。

再介紹一種通路 servlet 方式: telnet 方式

telnet localhost 8080

回車,輸入

GET /hello/hello HTTP/1.1

Host:localhost

dos 視窗下将顯示 hello , world

如果要用 servlet 處理表單送出的資訊,表單送出方式一般情況分 get 、 post 。相應的我們就應該覆寫 HttpServlet 中的 doGet ()、 doPost ()方法。表單中 action 寫 servlet 的 url-/pattern 值。

值得注意的是: web.xml 在 servlet 2.2 、 2.3 規範中都由 DTD 定義,所有有元素間嚴格的順利關系,而 servlet2.4 規範中, web.xml 檔案改為, xml schema 來定義文檔的結構,其中一個好處是元素出現的順序不再有嚴格的限定。如果要相容低版本的,還是得有嚴格的順序關系。

提示一旦修改過 servlet 就應該重新開機 tomcat 。