A.程式計數器是一個比較小的記憶體區域,用于訓示目前線程所執行的位元組碼執行到了第幾行,是線程隔離的
B.Java方法執行記憶體模型,用于存儲局部變量,操作數棧,動态連結,方法出口等資訊,是線程隔離的
C.方法區用于存儲JVM加載的類資訊、常量、靜态變量、即使編譯器編譯後的代碼等資料,是線程隔離的
D.原則上講,所有的對象都在堆區上配置設定記憶體,是線程之間共享的
解析:方法區在JVM中也是一個非常重要的區域,它與堆一樣,是被 線程共享 的區域。 在方法區中,存儲了每個類的資訊(包括類的名稱、方法資訊、字段資訊)、靜态變量、常量以及編譯器編譯後的代碼等。
A.JDBC提供了Statement、PreparedStatement 和 CallableStatement三種方式來執行查詢語句,其中 Statement 用于通用查詢, PreparedStatement 用于執行參數化查詢,而 CallableStatement則是用于存儲過程
B.對于PreparedStatement來說,資料庫可以使用已經編譯過及定義好的執行計劃,由于 PreparedStatement 對象已預編譯過,是以其執行速度要快于 Statement 對象”
C.PreparedStatement中,“?” 叫做占位符,一個占位符可以有一個或者多個值
D.PreparedStatement可以阻止常見的SQL注入式攻擊
解析:JDBC statement中的PReparedStatement的占位符對應着即将與之對應當值,并且一個占位符隻能對應一個值,如果能對應多個就會引起混淆。sql語句是确定的,那麼一個占位符必定隻能對應一個值
A.servlet處于伺服器程序中,它通過多線程方式運作其service方法
B.CGI對每個請求都産生新的程序,服務完成後就銷毀
C.servlet在易用性上強于cgi,它提供了大量的實用工具例程,例如自動地解析和解碼HTML表單資料、讀取和設定HTTP頭、處理Cookie、跟蹤會話狀态等
D.cgi在移植性上高于servlet,幾乎所有的主流伺服器都直接或通過插件支援cgi
解析:servlet處于伺服器程序中,它通過多線程方式運作其service方法,一個執行個體可以服務于多個請求,并且其執行個體一般不會銷毀,而CGI對每個請求都産生新的程序,服務完成後就銷毀,是以效率上低于servlet。CGI不可移植,為某一特定平台編寫的CGI應用隻能運作于這一環境中。每一個CGI應用存在于一個由用戶端請求激活的程序中,并且在請求被服務後被解除安裝。這種模式将引起很高的記憶體、CPU開銷,而且在同一程序中不能服務多個客戶。
A.不管是post還是get方法送出過來的連接配接,都會在service中處理
B.doGet/doPost 則是在 javax.servlet.GenericServlet 中實作的
C.service()是在javax.servlet.Servlet接口中定義的
D.service判斷請求類型,決定是調用doGet還是doPost方法
解析:doGet/doPost 則是在 javax.servlet.http.HttpServlet 中實作的
A.在建立自己的Servlet時候,應該在初始化方法init()方法中建立Servlet執行個體
B.在Servlet生命周期的服務階段,執行service()方法,根據使用者請求的方法,執行相應的doGet()或是doPost()方法
C.在銷毀階段,執行destroy()方法後會釋放Servlet 占用的資源
D.destroy()方法僅執行一次,即在伺服器停止且解除安裝Servlet時執行該方法
解析:servlet是由Servlet容器負責加載Servlet類,建立Servlet對象并執行個體化,然後調用Servlet的init方法,進行初始化,之後調用Service方法。執行個體化和初始化不同
A.init()方法是servlet生命的起點。一旦加載了某個servlet,伺服器将立即調用它的init()方法
B.Service()方法處理客戶機發出的所有請求
C.destroy()方法标志servlet生命周期的結束
D.servlet在多線程下使用了同步機制,是以,在并發程式設計下servlet是線程安全的
解析:servlet在多線程下其本身并不是線程安全的。如果在類中定義成員變量,而在service中根據不同的線程對該成員變量進行更改,那麼在并發的時候就會引起錯誤。最好是在方法中,定義局部變量,而不是類變量或者對象的成員變量。由于方法中的局部變量是在棧中,彼此各自都擁有獨立的運作空間而不會互相幹擾,是以才做到線程安全。Servlet的線程安全問題隻有在大量的并發通路時才會顯現出來,并且很難發現,是以在編寫Servlet程式時要特别注意。線程安全問題主要是由執行個體變量造成的,是以在Servlet中應避免使用執行個體變量。如果應用程式設計無法避免使用執行個體變量,那麼使用同步來保護要使用的執行個體變量,但為保證系統的最佳性能,應該同步可用性最小的代碼路徑。執行個體變量:定義在類中但在任何方法之外。
A.Struts1要求Action類繼承一個抽象基類。Struts 2 Action類可以實作一個Action接口
B.Struts1 Action對象為每一個請求産生一個執行個體。Struts2 Action是單例模式并且必須是線程安全的
C.Struts1 Action 依賴于Servlet API,Struts 2 Action不依賴于容器,允許Action脫離容器單獨被測試
D.Struts1 整合了JSTL,Struts2可以使用JSTL,但是也支援OGNL
解析:
1.Struts1要求Action類繼承一個抽象基類。Struts1的一個普遍問題是使用抽象類程式設計而不是接口。
2. Struts 2 Action類可以實作一個Action接口,也可實作其他接口,使可選和定制的服務成為可能。Struts2提供一個ActionSupport基類去實作常用的接口。Action接口不是必須的,任何有execute辨別的POJO對象都可以用作Struts2的Action對象。
3. Struts1 Action 依賴于Servlet API ,因為當一個Action被調用時HttpServletRequest 和 HttpServletResponse 被傳遞給execute方法。
4. Struts 2 Action不依賴于容器,允許Action脫離容器單獨被測試。如果需要,Struts2 Action仍然可以通路初始的request和response。但是,其他的元素減少或者消除了直接通路HttpServetRequest 和 HttpServletResponse的必要性。
5. Struts1 Action是單例模式并且必須是線程安全的,因為僅有Action的一個執行個體來處理所有的請求。單例政策限制了Struts1 Action能作的事,并且要在開發時特别小心。Action資源必須是線程安全的或同步的。
6. Struts2 Action對象為每一個請求産生一個執行個體,是以沒有線程安全問題。(實際上,servlet容器給每個請求産生許多可丢棄的對象,并且不會導緻性能和垃圾回收問題)
forward,伺服器擷取跳轉頁面内容傳給使用者,使用者位址欄不變
redirect,是伺服器向使用者發送轉向的位址,redirect後位址欄變成新的位址
A.通過DriverManager.getConnection方法加載
B.調用方法 Class.forName
C.通過添加系統的jdbc.drivers屬性
D.通過registerDriver方法注冊
A.sleep是線程類(Thread)的方法,wait是Object類的方法;
B.sleep不釋放對象鎖,wait放棄對象鎖
C.sleep暫停線程、但監控狀态仍然保持,結束後會自動恢複
D.wait後進入等待鎖定池,隻有針對此對象發出notify方法後獲得對象鎖進入運作狀态
Java中的多線程是一種搶占式的機制,而不是分時機制。搶占式的機制是有多個線程處于可運作狀态,但是隻有一個線程在運作。
共同點 :
1. 他們都是在多線程的環境下,都可以在程式的調用處阻塞指定的毫秒數,并傳回。
2. wait()和sleep()都可以通過interrupt()方法 打斷線程的暫停狀态 ,進而使線程立刻抛出InterruptedException。
如果線程A希望立即結束線程B,則可以對線程B對應的Thread執行個體調用interrupt方法。如果此刻線程B正在wait/sleep/join,則線程B會立刻抛出InterruptedException,在catch() {} 中直接return即可安全地結束線程。
需要注意的是,InterruptedException是線程自己從内部抛出的,并不是interrupt()方法抛出的。對某一線程調用 interrupt()時,如果該線程正在執行普通的代碼,那麼該線程根本就不會抛出InterruptedException。但是,一旦該線程進入到 wait()/sleep()/join()後,就會立刻抛出InterruptedException 。
不同點 :
1.每個對象都有一個鎖來控制同步通路。Synchronized關鍵字可以和對象的鎖互動,來實作線程的同步。
sleep方法沒有釋放鎖,而wait方法釋放了鎖,使得其他線程可以使用同步控制塊或者方法。
2.wait,notify和notifyAll隻能在同步控制方法或者同步控制塊裡面使用,而sleep可以在任何地方使用
3.sleep必須捕獲異常,而wait(可能會産生 InterruptedException),notify和notifyAll不需要捕獲異常
4.sleep是線程類(Thread)的方法,導緻此線程暫停執行指定時間,給執行機會給其他線程,但是監控狀态依然保持,到時後會自動恢複。調用sleep不會釋放對象鎖。
5.wait是Object類的方法,對此對象調用wait方法導緻本線程放棄對象鎖,進入等待此對象的等待鎖定池,隻有針對此對象發出notify方法(或notifyAll)後本線程才進入對象鎖定池準備獲得對象鎖進入運作狀态。
<code>Integer i01 = </code><code>59</code><code>;</code>
<code>int</code> <code>i02 = </code><code>59</code><code>;</code>
<code>Integer i03 =Integer.valueOf(</code><code>59</code><code>);</code>
<code>Integer i04 = </code><code>new</code> <code>Integer(</code><code>59</code><code>)。</code>
VM中一個位元組以下的整型資料會在JVM啟動的時候加載進記憶體,除非用new Integer()顯式的建立對象,否則都是同一個對象,所有隻有i04是一個新對象,其他都是同一個對象。所有A,B選項為true
C選項i03和i04是兩個不同的對象,傳回false,D選項i02是基本資料類型,比較的時候比較的是數值,傳回true。另外Integer和int比較的時候是值,也就是Integer要進行拆箱的操作。
A.Jsp檔案實作視圖View的功能
B.ActionServlet這一個類是整個struts項目的控制器
C.ActionForm、Action都屬于Model部分
D.一個struts項目隻能有一個Servlet
解析:Model: MVC系統中的Model部分從概念上可以分為兩類――系統的内部狀态,和改變系統狀态的動作。Struts為Model部分提供了Action和ActionForm對象:所有的Action處理器對象都是開發者從Struts的Action類派生的子類。Action處理器對象封裝了具體的處理邏輯,調用業務邏輯子產品,并且把響應送出到合适的View元件以産生響應。Struts提供的ActionForm元件對象,它可以通過定義屬性描述用戶端表單資料。開發者可以從它派生子類對象,利用它和Struts提供的自定義标記庫結合可以實作對用戶端的表單資料的良好封裝和支援,Action處理器對象可以直接對它進行讀寫,而不再需要和request、response對象進行資料互動。通過ActionForm元件對象實作了對View和Model之間互動的支援。Struts通常建議使用一組JavaBean表示系統的内部狀态,根據系統的複雜度也可以使用像Entity EJB 和 Session EJB等元件來實作系統狀态。Struts建議在實作時把"做什麼"(Action)和"如何做"(業務邏輯)分離。這樣可以實作業務邏輯的重用。
A.動态INCLUDE:用jsp:include動作實作
B.靜态INCLUDE:用include僞碼實作,定不會檢查所含檔案的變化,适用于包含靜态頁面<%@ include file="included.htm" %>
C.靜态include的結果是把其他jsp引入目前jsp,兩者合為一體;動态include的結構是兩者獨立,直到輸出時才合并
D.靜态include和動态include都可以允許變量同名的沖突.頁面設定也可以借用主檔案的
動态 INCLUDE 用 jsp:include 動作實作 <jsp:include page="included.jsp" flush="true" /> 它總是會檢查所含檔案中的變化 , 适合用于包含動态頁面 , 并且可以帶參數。各個檔案分别先編譯,然後組合成一個檔案。
靜态 INCLUDE 用 include 僞碼實作 , 定不會檢查所含檔案的變化 , 适用于包含靜态頁面 <%@ include file="included.htm" %>。先将檔案的代碼被原封不動地加入到了首頁面進而合成一個檔案,然後再進行翻譯,此時不允許有相同的變量。
以下是對 include 兩種用法的差別 , 主要有兩個方面的不同 ;
一 : 執行時間上 :
<%@ include file="relativeURI"%> 是在翻譯階段執行
<jsp:include page="relativeURI" flush="true" /> 在請求處理階段執行 .
二 : 引入内容的不同 :
<%@ include file="relativeURI"%>
引入靜态文本 (html,jsp), 在 JSP 頁面被轉化成 servlet 之前和它融和到一起 .
<jsp:include page="relativeURI" flush="true" /> 引入執行頁面或 servlet 所生成的應答文本 .