2010/07/23

JAVA Web: Servlet & JSP 筆記分享

最近這個月開始接觸JAVA的Web,我也不知道這樣稱呼是否正確,
簡單說就是用JAVA來寫動態網頁,跟PHP或ASP一樣的功能
會開始學JAVA WEB的原因是因為想更深入物件導向加上MVC設計模式的撰寫方法
感謝我身邊已經再用JAVA開發的朋友,這一個月被我猛烈攻擊

這個分類主要把我這個月學到的心得與實際寫的一個留言板
整理一下當作備忘錄,程式BUG一定不少,而且考慮的不甚周嚴,新進JAVA的人可以參考
不過是筆記,所以預期會非常的亂,請做好心理準備。

事前準備

JDK(Java Development Kit)
要執行Eclipse至少需要JRE(Java Runtime Environment),但是建議直接安裝JDK,因JDK內含有JRE,東西都傳便便比較不會有杯具發生。JDK Download
IDE(Integrated Development Environment 整合開發環境)
好的IDE可以讓你程式錯誤的機率少很多,我是使用Eclipse IDE for Java EE Developers
下載後直接解壓縮到你喜歡的位子,免安裝;可以執行表示JAVA安裝是OK的。
我是解壓縮到D:\下,重灌OS不會被影響。
Server
我使用Resin,另外也有Tomcat;Resin的好處是,程式更動後不用重新啟動SERVER就可以執行。( 程式更動後要重新啟動SERVER ?! 這啥鬼)

恩,我當初也這樣想,但是JAVA就是這樣,如果程式有變動,就必須重啟SERVER,或是手動叫伺服器重新檢查程式碼;Tomcat就是這樣;如果小修個地方就要重啟,非常的麻煩,所以朋友推薦使用Resin,程式有更動都不用重啟。

註:這裡指的Server為Container加上HTTP Server,執行Servlet & JSP需要有Container來處理;HTTP Server則是負責與使用者(瀏覽器)的溝通;我在看Container時也被搞得一頭霧水,所以這裡簡略帶過XDD
安裝方法很簡單,直接解壓縮到你喜歡的位子(這句話好像看過),執行SERVER比較麻煩,每個版本都不太一樣 囧

3.1.6   執行檔在 Resin-3.1.6\httpd.exe
3.1.10 執行檔在 Resin-3.1.10\win32\resin.exe
4.0.8   執行檔在 Resin-4.0.8\resin.exe



如果要以服務(Service)方式在背景跑
3.1.6 在Resin-3.1.6\ 以命令提示字元執行 httpd -install 即可,服務內就會出現一個Resin Web Server
3.1.10 在Resin-3.1.10\ 以命令提示字元執行 resin -install 即可


4.0.8 執行 Resin-4.0.8\Setup.exe 按一下Install即可



Eclipse專案設定


由於Eclipse可以跑一個SERVER直接測試,但是效能...
所以Eclipse只拿來編輯,測試程式直接使用安裝好的Resin來測試
  1. 新增一個叫 Dynamic Web Project 專案,目錄預設即可。

  2. 請在Resin目錄內的webapps下建立與專案同名的資料夾(不同名應該也行,但是何必搞死自己)
    Resin會幫忙生出WEB-INF資料夾,請不要砍掉(關於這個資料夾要幹嘛的,之後會說明)

  3. 請回到Eclipse,把WebContent刪除(讓Eclipse直接使用Server的目錄,存檔完就不用複製檔案了)
  4. 在專案上右鍵
    新增資料夾 >
    打開Advance >
    選擇Link to folder in the file system,將其指到剛剛在Webapps下建立的目錄
    將Folder name改為Webcontent,然後Finish

    (有沒有覺得有圖真好)
  5. 接下來要設定一些編譯的參數,不設定的話Eclipse就跟筆記本沒兩樣 囧。
  6. 在專案上按右鍵 >Properties>JAVA Build Path
  7. Source內
    砍掉GB/src
    Add folder >選擇Webcontent\WEB-INF\classes (是只選Classes)



  8. Libraries內
    Add Exrernal JARs > 選擇Resin\lib\resin.jar

  9. 收工!


第一支Sevlet程式


測試一下設定是不是正確,直接寫的Hello World最準了!
  1. 新增一Servlet
    Package可以隨意,但要使用xxx.xxx.xxx的形式,我是用asper.test.sevlet
    Class name只要第一個字大寫即可,這裡用Hello
    Finish
  2. Eclipse已經用範本建立部分內容了,裡面做啥的下回分解
  3. 請在protected void doGet... 內打入下列程式碼
    PrintWriter out = response.getWriter();
    out.println("Hello World");
  4. 如果PrintWriter下畫紅線,表示Eclipse不知道這哪來的,請把滑鼠移到上面

    請點 Import 'PrintWriter' (Java.io)  <=引入lib
  5. 理論上應該沒有紅色XX在旁邊,表示沒有錯誤可以執行了
  6. 此時要建立另一個檔案web.xml,放在 gb/Web-INF/ 下,稱為網站描述檔,告訴SERVER如何執行這個網站
    <?xml version="1.0" encoding="ASCII"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
       <servlet>
        <servlet-name>Hello</servlet-name>
        <servlet-class>asper.test.servlet.Hello</servlet-class>
      </servlet>
      <servlet-mapping>
        <servlet-name>Hello</servlet-name>
        <url-pattern>/Hello</url-pattern>
      </servlet-mapping>
    </web-app>

  7. 請打開瀏覽器,輸入http://127.0.0.1:8080/gb/Hello,應該就會看到Hello World了

發生了甚麼事情


做了如此多事情之後,才可以跑出一行Hello World是不是覺得很沮喪開心呢? 來了解一下到底花生省魔術
  1. Resin接收到瀏覽器想要要求http://127.0.0.1:8080/gb/hello 這個網頁
  2. 於是他到Webapps下的gb內尋找有沒有hello這個檔案,發現它沒有副檔名,猜測他應該是Servlet,所以再去找WEB-INF內的web.xml
  3. 發現web.xml內有<url-pattern>發現相符的 /Hello,然後在<servlet-name>發現名稱叫做Hello
  4. 然後根據名子叫做Hello的找到它的class叫做
    <servlet-class>asper.test.servlet.Hello</servlet-class>
  5. 再找到Web-INF\classes\asper\test\servlet\Hello.java 編譯成 Hello.class 後執行
  6. 很複雜,我知道

WEB-INF幹嘛的?


這裡面擺的都是瀏覽器無法直接存取的檔案,也就是無法用 http://127.0.0.1/gb/WEB-INF/ 去存取
這裡面我會用到的只有classes, lib目錄與web.xml
classes拿來放寫好的servlet, Java Bean, etc... 目錄就是依照套件名稱(package name)來建立
EX: asper.test.servlet.Hello => classes\asper\test\servlet\Hello.java
lib拿來放其他的函式庫,例如SQL Driver, JSTL, etc...
如果有不想被直接存取的檔案也可以放這

這一篇內容好多


大推的書
http://www.oreilly.com.tw/product2_java.php?id=a236
看完這本之後會對servlet非常了解,沒看之前一直不懂servlet到底怎麼運作,為啥要一堆奇怪的檔案跟難懂的規則
缺點是非常的貴!但是很值得

http://www.books.com.tw/exep/prod/booksfile.php?item=0010444080
這本跟上面那本內容十分的類似,但是我怎麼看怎麼不懂;但是看完深入淺出之後這本兩天就可以翻完了(灑花)

http://www.books.com.tw/exep/prod/booksfile.php?item=0010256594
這本還在看,範例碼的部分有點多,但是對新手來說很實用
作者把SERVLET內容整理的很有條理,初學者可以拿來當第一本書

1 則留言:

  1. 感謝你的文章
    我找了兩個禮拜的文章,終於配置Resin成功了
    現在我終於可以用eclipse寫servlet!!

    回覆刪除