1. 程式人生 > >Java ee學習筆記

Java ee學習筆記

server ffffff workspace 動態創建 多公司 組成 指定 瀏覽器 現在

Servlet簡介

Servlet技術規範是JavaEE技術規範中的一個重要組成部分,Servlet是一種獨立於平臺和協議的服務器端的Java應用程序,可以生成動態的Web頁面(實際上,Servlet不僅僅是用於返回HTML的頁面的,比如,Servlet還可以返回Xml,JSON等格式的字符串,當然了,也可以返回視頻流,等等)。
Servlet要運行於Servlet容器上,目前,IBM的WebSphere,BEA的WebLogic,Apache的tomcat,SUN的GlassFish,這些JavaEE的服務器,都含有Servlet容器,我想這麽說,Servlet的容器和JavaEE的服務器之間的關系就區別開了吧? 其中以tomcat為例,它是一個著名的開源的JavaEE服務器,它包含有一個Servlet容器,(但是並不包含EJB的容器),也就是說,tomcat是一個不能完整支持JavaEE技術規範的容器(不支持EJB),但是這對構建一個Web Site是夠用了。如果想使用tomcat,並使用EJB,通常是采用JBoss作為服務器的,因為JBoss本身是一個EJB的容器,並且把tomcat集成進來,來完成Servlet容器的角色。tomcat除了要提供Servlet容器外,顯然還要承擔起HTTP Server的角色,但是也有人用Apache服務器+Tomcat的Servlet容器,來構成一個完整的服務器,也就是說,不使用tomcat所提供HTTP服務,而是用Apache的。
Sun的GlassFish,是一個比較完整支持JavaEE規範的Server。剛才看到了一條新聞,Oracle完成收購SUN後,依然會支持GlassFish。原文如下:

(GlassFish
甲骨文表示將會調整Oracle WebLogic server和GlassFish的投資組合,他們計劃繼續讓GlassFish Enterprise Server作為遵循Java EE規範的開源RI。同時,甲骨文表示也會繼續支持GlassFish社區。
編者註:除了以上開發者們關註的兩個產品之外(是的,還有Java FX。對於Java,Oracle自從收購開始之日就一直態度明確;然而Java FX,在這份FAQ中仍然沒有提及),下面還提到了Sun的虛擬化產品和Open Office的處理策略。)

我覺得Servlet技術,和CGI技術有著相當的相似度。如果把Servlet放到傳統的CGI程序,和當下的JSP,JSF,ASP.net中間,我覺得它更加地接近前者,沒有一個本質的躍遷。

詳解servlet實例

上面這個鏈接,寫得不錯,OK:
假設我寫了一個HelloServlet,它返回一個歡迎頁面。
HelloServlet是如何被創建的呢? 首先可以肯定的說,不是new出來的,容器根本不知道我們會寫出叫什麽名字的Servlet classes。這就像MFC,誰知道我們的Document class叫什麽名字,於是動態創建就有用武之地了。當然了,在Java裏面,反射是更加強大的武器。(而且記住,容器不會new HelloServlet,而就是我們企圖調用這個Servlet,也不要new!)
服務器會偵聽某一個端口,比如說8080,現在瀏覽器要訪問我們的Server了,http://127.0.0.1:8080/hello。
OK,Server會accept瀏覽器的鏈接,當然了,這是個TCP層的問題,而在HTTP層面上,我們會看到Request的HTTP請求信息,裏面就含有URL,於是我們自然就得到了hello這個字符串。這個時候,HTTP Server就要把處理邏輯轉到Servlet容器上了。
根據JavaEE的規範,Servlet容器會讀一個web.xml。裏面大致有這樣的配置內容:

技術分享
<servlet>
        <servlet-name>Hello</servlet-name>
        <servlet-class>org.bizcuit.HelloServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Hello</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
技術分享

註意那關鍵的四行,其中servlet-name是Hello,成為上面和下面兩個部分的橋梁,上面的部分說明了調用這個名字的Servlet,會實例化哪個Java class。而下面的部分則說明了,URL的pattern如果是/hello,那麽就會調用名為Hello的Servlet。其中,還要註意url-pattern項,這裏可是有些名目的。
OK,這樣,Servlet容器就知道要加載哪個Servlet的class了,那麽這個加載是通過反射來完成的。

Class cls = Class.forName(servletClassName);
Object servlet = cls.newInstance(); 

當然了,這個比偽碼還簡單了,因為一個Servlet class,通常只在容器內產生一個實例(也有辦法生成多個實例,但是可能會產生效率的問題,後面講),因此,要註意線程安全的問題(後面講)。
但是現在,我們有了Servlet的實例了,於是,我們可以調用它的方法了,根據Servlet規範,容器根據瀏覽器的請求(GET/POST/...),會調用service,或者是doGet,doPost方法。以doGet方法為例:

技術分享
public class HelloServlet extends HttpServlet {
    public void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws IOException {
        resp.setContentType("text/html");
        resp.getWriter().println("<div>Hello</div>");
    }
}
技術分享

註意doGet方法的兩個參數,很重要,這裏就不贅述了,還是要在具體的實踐中掌握的。
關於Session,可以通過這個方法得到。req.getSession();


JSP簡介
我個人認為JSP是一種比PHP更加靈活,強大的服務器端腳本,無奈PHP確實簡單很多啊。

JSP(Java Server Pages)是由Sun公司倡導、許多公司參與一起建立的一種動態網頁技術標準。JSP技術有點類似ASP,PHP等技術,它是在傳統的網頁HTML文件(*.htm,*.html)中插入Java程序段(Scriptlet)和JSP標記(tag),從而形成JSP文件(*.jsp)。
運行JSP,也是需要Servlet容器的,原因就是JSP在第一次被訪問的時候,會被翻譯為一個Servlet,當然了,這個Servlet最終也是要被編譯為.class文件的,所以,JSP是在Servlet的技術上構建出來的,而且JSP的運行速度很快,畢竟是被編譯成字節碼在運行,相比傳統的ASP腳本的解釋方式,快了許多。
關於JSP,還有JSP的tag可以作為單獨的課題來研究一下。

<JSP試驗部分>

1. DOWNLOAD tomcat first: tomcat 6.x zip format
下載後,解壓縮。
2. 啟動tomcat
找到目錄$TOMCAT_INSTALL_PATH\apache-tomcat-6.0.20\bin,Windows上,雙擊startup.bat即可。
http://localhost:8080/
好歹試一試tomcat是不是真的起來了。GO~
3. 創建一個JSP文件。
目錄,$TOMCAT_INSTALL_PATH\apache-tomcat-6.0.20\webapps\ROOT
創建一個文件,hello.jsp。裏面輸入下列內容。

技術分享
<[email protected] language="java" %>
<[email protected] import="java.util.*" %>
<html>
<head>
<title>Hello World!</title>
</head>
<body bgcolor="#FFFFFF">
<%
String msg= new Date().toString();
out.println("Hello World!<br>");
%>
<div style="color:red">
<%=msg%>
</div>
</body>
</html>
技術分享

保存,然後啟動服務器(當然了,服務器起來後,再創建、修改JSP也可以,不需要重啟服務器。),試一試,http://127.0.0.1:8080/hello.jsp
4. 隨便再改改,體驗一下JSP,<%%>內,可以接受Java code(當然了,不是全部)。

<Servlet試驗部分>
寫簡單的JSP,我覺得不用IDE也OK,但是Servlet,我們還是借助IDE吧,大段的Java代碼,我喜歡用Eclipse。
1. 下載eclipse-jee-galileo-SR1-win32,Click here to download

2. 啟動Eclipse。註意,Eclipse一定要指定一個workspace才行的。

3. 從菜單裏面找File->New->Project,選擇後彈出一個可以創建工程的對話框。在裏面找到Web |_ Dynamic Web Project。
不負責任的說,自己一路Next下去吧。應該沒有什麽問題。工程的名字可以選擇為Hello。

4. 再創建一個服務器。

不負責任的說,找到對話框,自己一路Next下去吧。應該沒有什麽問題。

5. 這樣就差不多了,可以寫代碼了,也可以調試了。具體的問題應該不難解決。在Hello工程裏面創建一個Servlet。
在左側的Package Explorer中,展開Hello,在src目錄那裏,右鍵,準備創建一個Servlet,找到對話框,


在Class Name那裏寫HelloServlet即可,Java Package那裏寫org.bizcuit。其他的不用修改。OK,這樣,IDE就幫我們創建好一個Servlet的java文件了。
在doGet方法內,可以試著寫入這樣的code:

PrintWriter pw = response.getWriter();
pw.print("<html><body><div style=‘color:red‘>Hello</div></body></html>");

當然了,Servlet裏面返回HTML往往屬於比較土的做法,因為還不如寫JSP呢(當然了,Servlet返回HTML也可能有更好的理由。)
6. 開始調試了。
在Project Hello上右鍵,找到Debug As菜單項,選擇Debug on server。
選擇一個已有的Server這一項(Choose an exsiting server.)。因為我們已經建立過一個Server tomcat了。
然後一路Next到Finish~。試一下 http://127.0.0.1:8080/Hello/HelloServlet
URL中,第一個Hello是由於你創建的工程名是Hello,接下來HelloServlet,是你的servlet class的名字。

7. 試一下改寫你的Servlet,是不需要重啟服務器的。

Java ee學習筆記