一、Servlet 與 CGI 的比較:
和CGI程式一樣,Servlet可以響應使用者的指令(送出一個FORM等等),也可以象CGI程式一樣,收集使用者表單的資訊并給予動态回報(簡單的注冊資訊錄入和檢查錯誤)。
然而,Servlet的機制并不僅僅是這樣簡單的與使用者表單進行互動。傳統技術中,動态的網頁建立和顯示都是通過CGI來實作的,但是,有了Servlet,您可以大膽的放棄所有CGI(perl?php?甚至asp!),利用Servlet代替CGI,進行程式編寫。
對比一:
當使用者浏覽器發出一個Http/CGI的請求,或者說 調用一個CGI程式的時候,伺服器端就要新啟用一個程序(而且是每次都要調用),調用CGI程式越多(特别是通路量高的時候),就要消耗系統越多的處理時間,隻剩下越來越少的系統資源,對于使用者來說,隻能是漫長的等待伺服器端的傳回頁面了,這對于電子商務激烈發展的今天來說,不能不說是一種技術上的遺憾。
而Servlet充分發揮了伺服器端的資源并高效的利用。每次調用Servlet時并不是新啟用一個程序 ,而是在一個Web伺服器的程序敏感詞享和分離線程,而線程最大的好處在于可以共享一個資料源,使系統資源被有效利用。
對比二:
傳統的CGI程式,不具備平台無關性特征,系統環境發生變化,CGI程式就要癱瘓。
而Servlet具備Java的平台無關性,在系統開發過程中保持了系統的可擴充性、高效性。
對比三:
傳統技術中,一般大都為二層的系統架構,即Web伺服器+資料庫伺服器,導緻網站通路量大的時候,無法克服CGI程式與資料庫建立連接配接時速度慢的瓶頸,進而當機、資料庫死鎖現象頻繁發生。而我們的Servlet有連接配接池的概念,它可以利用多線程的優點,在系統緩存中事先建立好若幹與資料庫的連接配接,到時候若想和資料庫打交道可以随時跟系統"要"一個連接配接即可,反應速度可想而知。
是以,可總結以下幾點:
1.servlet處于伺服器程序中,它通過多線程方式運作其service方法
2.CGI對每個請求都産生新的程序,服務完成後就銷毀
3.servlet在易用性上強于cgi,它提供了大量的實用工具例程,例如自動地解析和解碼html表單資料、讀取和設定http頭、處理cookie、跟蹤會話狀态等
4.CGI移植性上低于setvlet的,因為servlet具備java的平台無關性
5.CGI安全性能較高,但是效率低于servlet
二、内部類的通路修飾符與外部類有什麼差別:
在Java中,可以将一個類定義在另一個類裡面或者一個方法裡邊,這樣的類稱為内部類,而包含他的類便是該類的外部類,廣泛意義上的内部類一般包括四種:成員内部類,局部内部類,匿名内部類,靜态内部類 。
1.成員内部類
(1)該類像是外部類的一個成員,可以無條件的通路外部類的所有成員屬性和成員方法(包括private成員和靜态成員);
(2)成員内部類擁有與外部類同名的成員變量時,會發生隐藏現象,即預設情況下通路的是成員内部類中的成員。如果要通路外部類中的成員,需要以下形式通路:【外部類.this.成員變量 或 外部類.this.成員方法】;
(3)在外部類中如果要通路成員内部類的成員,必須先建立一個成員内部類的對象,再通過指向這個對象的引用來通路;
(4)成員内部類是依附外部類而存在的,也就是說,如果要建立成員内部類的對象,前提是必須存在一個外部類的對象;
(5)内部類可以擁有private通路權限、protected通路權限、public通路權限及(預設)包通路權限。如果成員内部類用private修飾,則隻能在外部類的内部通路;如果用public修飾,則任何地方都能通路;如果用protected修飾,則隻能在同一個包下或者繼承外部類的情況下通路;如果是預設通路權限,則隻能在同一個包下通路。外部類隻能被public和包通路兩種權限修飾。
2.局部内部類
(1)局部内部類是定義在一個方法或者一個作用域裡面的類,它和成員内部類的差別在于局部内部類的通路僅限于方法内或者該作用域内;
(2)局部内部類就像是方法裡面的一個局部變量一樣,是不能有public、protected、private以及static修飾符的。
3.匿名内部類
(1)一般使用匿名内部類的方法來編寫事件監聽代碼;
(2)匿名内部類是不能有通路修飾符和static修飾符的;
(3)匿名内部類是唯一一種沒有構造器的類;
(4)匿名内部類用于繼承其他類或是實作接口,并不需要增加額外的方法,隻是對繼承方法的實作或是重寫。
4.内部靜态類
(1)靜态内部類是不需要依賴于外部類的,這點和類的靜态成員屬性有點類似;
(2)不能使用外部類的非static成員變量或者方法。
三、關于Java類加載器:
1.引導類加載器(bootstrap class loader):它主要負責(JDK_HOME/lib)目錄下的核心API或-Xbootclasspath選項指定的jar包裝入工作,即用來加載Java的核心庫,是用原生代碼來實作的
2.擴充類加載器(extensions class loader):它主要負責(JDK_HOME/lib/ext)目錄下的jar包或-Djava.exe.dirs指定目錄下的jar包裝入工作,即它用來加載Java的擴充庫
3.系統類加載器(system class loader):它主要負責java -classpath/-Djava.class.path所指的目錄下的類與jar包裝入工作,即它根據Java應用的類路徑(classpath)來加載Java類
4.自定義加載器(user custom class loader):它是java.lang.ClassLoader的子類,在程式運作期間,通過java.lang.ClassLoader的子類動态加載class檔案,展現Java動态實時類裝入特性。
值得注意的是:
tomcat為每個App建立了一個Loader,裡面儲存着此WebApp的ClassLoader。需要加載WebApp下的類時,就取出ClassLoader來使用
四、關于回話跟蹤技術(僅供參考!):
1 .隐藏域在頁面中對于使用者是不可見的,在表單中插入隐藏域的目的在于收集或發送資訊,以利于被處理表單的程式所使用。浏覽者單擊發送按鈕發送表單的時候,隐藏域的資訊也被一起發送到伺服器。
2 .有些時候我們要給使用者一資訊,讓他在送出表單時送出上來以确定使用者身份,如sessionkey,等等.當然這些東西也能用cookie實作,但使用隐藏域就簡單的多了.而且不會有浏覽器不支援,使用者禁用cookie的煩惱。
3 .有些時候一個form裡有多個送出按鈕,怎樣使程式能夠厘清楚到底使用者是按那一個按鈕送出上來的呢?我們就可以寫一個隐藏域,然後在每一個按鈕處加上 οnclick="document.form.command.value='xx'"然後我們接到資料後先檢查command的值就會知道使用者是按的那個按鈕送出上來的。
4 .有時候一個網頁中有多個form,我們知道多個form是不能同時送出的,但有時這些form确實互相作用,我們就可以在form中添加隐藏域來使它們聯系起來。
5. javascript不支援全局變量,但有時我們必須用全局變量,我們就可以把值先存在隐藏域裡,它的值就不會丢失了。
6. 還有個例子,比如按一個按鈕彈出四個小視窗,當點選其中的一個小視窗時其他三個自動關閉.可是IE不支援小視窗互相調用,是以隻有在父視窗寫個隐藏域,當小視窗看到那個隐藏域的值是close時就自己關掉。
五、關于中間件(僅供參考!):
中間件是一種獨立的系統軟體或服務程式,分布式應用軟體借助這種軟體在不同的技術之間共享資源。中間件位于客戶機/ 伺服器的作業系統之上,管理計算機資源和網絡通訊。是連接配接兩個獨立應用程式或獨立系統的軟體。相連接配接的系統,即使它們具有不同的接口,但通過中間件互相之間仍能交換資訊。執行中間件的一個關鍵途徑是資訊傳遞。通過中間件,應用程式可以工作于多平台或OS環境。(簡單來說,中間件并不能提高核心的效率,一般隻是負責網絡資訊的分發處理)
中間件特點的描述:
1.中間件應支援标準的協定和接口
2.中間件可運作于多種硬體和作業系統平台上
3.跨越網絡,硬體,作業系統平台的應用或服務可通過中間件透明互動
六、列舉三種标準的Statement類:
Statement在JDBC中相當于SQL語句的載體
(1)Statement是最基本的用法,采用字元串拼接的方式,存在注入漏洞
(2)PreparedStatement對Statement中的SQL語句進行預編譯,同時檢查合法性,效率高
(3)CallableStatement接口擴充 PreparedStatement,用來調用存儲過程,它提供了對輸出和輸入/輸出參數的支援。CallableStatement 接口還具有對 PreparedStatement 接口提供的輸入參數的支援。