Java基礎知識(51-100)


51、垃圾回收的優點

和原理。並考慮2種回收機制。
Java 語言中一個顯著的特點就是引入了垃圾回收機制,使c++程序員最頭疼的內

存管理的問題迎刃而解,它使得Java程序員在編寫程序的時候不再需要考慮內存

管 理。由於有個垃圾回收機制,Java中的對象不再有"作用域"的概念,只有對

象的引用纔有"作用域"。垃圾回收可以有效的防止內存泄露,有效的使用可以使

用的內存。垃圾回收器通常是作爲一個單獨的低級別的線程運行,不可預知的情

況下對內存堆中已經死亡的或者長時間沒有使用的對象進行清楚和回收,程序員

不能 實時的調用垃圾回收器對某個對象或所有對象進行垃圾回收。回收機制有

分代複製垃圾回收和標記垃圾回收,增量垃圾回收。

52、請說出你所知道的線程同步的方法。
wait():使一個線程處於等待狀態,並且釋放所持有的對象的lock。
sleep():使一個正在運行的線程處於睡眠狀態,是一個靜態方法,調用此方法要

捕捉InterruptedException異常。
notify():喚醒一個處於等待狀態的線程,注意的是在調用此方法的時候,並不

能確切的喚醒某一個等待狀態的線程,而是由JVM確定喚醒哪個線程,而且不是

按優先級。
Allnotity():喚醒所有處入等待狀態的線程,注意並不是給所有喚醒線程一個對

象的鎖,而是讓它們競爭。

53、你所知道的集合類都有哪些?主要方法?
最常用的集合類是 List 和 Map。 List 的具體實現包括 ArrayList 和 Vector

,它們是可變大小的列表,比較適合構建、存儲和操作任何類型對象的元素列表

。 List 適用於按數值索引訪問元素的情形。
Map 提供了一個更通用的元素存儲方法。 Map 集合類用於存儲元素對(稱作"鍵

"和"值"),其中每個鍵映射到一個值。

54、描述一下JVM加載class文件的原理機制?
JVM中類的裝載是由ClassLoader和它的子類來實現的,Java ClassLoader 是一個

重要的Java運行時系統組件。它負責在運行時查找和裝入類文件的類。

55、char型變量中能不能存貯一箇中文漢字?爲什麼?
能夠定義成爲一箇中文的,因爲java中以unicode編碼,一個char佔16個字節,

所以放一箇中文是沒問題的

56、多線程有幾種實現方法,都是什麼?同步有幾種實現方法,都是什麼?
多線程有兩種實現方法,分別是繼承Thread類與實現Runnable接口
同步的實現方面有兩種,分別是synchronized,wait與notify

57、JSP的內置對象及方法。
request表示HttpServletRequest對象。它包含了有關瀏覽器請求的信息,並且

提供了幾個用於獲取cookie, header, 和session數據的有用的方法。
response表示HttpServletResponse對象,並提供了幾個用於設置送回 瀏覽器的

響應的方法(如cookies,頭信息等)
out對象是javax.jsp.JspWriter的一個實例,並提供了幾個方法使你能用於向瀏

覽器回送輸出結果。
pageContext表示一個javax.servlet.jsp.PageContext對象。它是用於方便存取

各種範圍的名字空間、servlet相關的對象的API,並且包裝了通用的servlet相

關功能的方法。
session表示一個請求的javax.servlet.http.HttpSession對象。Session可以存

貯用戶的狀態信息
applicaton 表示一個javax.servle.ServletContext對象。這有助於查找有關

servlet引擎和servlet環境的信息
config表示一個javax.servlet.ServletConfig對象。該對象用於存取servlet實

例的初始化參數。
page表示從該頁面產生的一個servlet實例

58、線程的基本概念、線程的基本狀態以及狀態之間的關係
線程指在程序執行過程中,能夠執行程序代碼的一個執行單位,每個程序至少都

有一個線程,也就是程序本身。
Java中的線程有四種狀態分別是:運行、就緒、掛起、結束。

59、JSP的常用指令

isErrorPage(是否能使用Exception對象),isELIgnored(是否忽略表達式)

" target="_blank">http://......"%>

60、什麼情況下調用doGet()和doPost()?
Jsp頁面中的form標籤裏的method屬性爲get時調用doGet(),爲post時調用

doPost()。

61、servlet的生命週期
web容器加載servlet,生命週期開始。通過調用servlet的init()方法進行

servlet的初始化。通過調用service()方法實現,根據請求的不同調用不同的

do***()方法。結束服務,web容器調用servlet的destroy()方法。

62、如何現實servlet的單線程模式


63、頁面間對象傳遞的方法
request,session,application,cookie等

64、JSP和Servlet有哪些相同點和不同點,他們之間的聯繫是什麼?
JSP 是Servlet技術的擴展,本質上是Servlet的簡易方式,更強調應用的外表表

達。JSP編譯後是"類servlet"。Servlet和JSP最 主要的不同點在於,Servlet的

應用邏輯是在Java文件中,並且完全從表示層中的HTML裏分離開來。而JSP的情

況是Java和HTML可以組合 成一個擴展名爲.jsp的文件。JSP側重於視圖,

Servlet主要用於控制邏輯。

65、四種會話跟蹤技術
會話作用域ServletsJSP 頁面描述
page否是代表與一個頁面相關的對象和屬性。一個頁面由一個編譯好的 Java

servlet 類(可以帶有任何的 include 指令,但是沒有 include 動作)表示。

這既包括 servlet 又包括被編譯成 servlet 的 JSP 頁面
request是是代表與 Web 客戶機發出的一個請求相關的對象和屬性。一個請求可

能跨越多個頁面,涉及多個 Web 組件(由於 forward 指令和 include 動作的

關係)
session是是代表與用於某個 Web 客戶機的一個用戶體驗相關的對象和屬性。一

個 Web 會話可以也經常會跨越多個客戶機請求
application是是代表與整個 Web 應用程序相關的對象和屬性。這實質上是跨越

整個 Web 應用程序,包括多個頁面、請求和會話的一個全局作用域

66、Request對象的主要方法:
setAttribute(String name,Object):設置名字爲name的request的參數值
getAttribute(String name):返回由name指定的屬性值
getAttributeNames():返回request對象所有屬性的名字集合,結果是一個枚舉

的實例
getCookies():返回客戶端的所有Cookie對象,結果是一個Cookie數組
getCharacterEncoding():返回請求中的字符編碼方式
getContentLength():返回請求的Body的長度
getHeader(String name):獲得HTTP協議定義的文件頭信息
getHeaders(String name):返回指定名字的request Header的所有值,結果是

一個枚舉的實例
getHeaderNames():返回所以request Header的名字,結果是一個枚舉的實例
getInputStream():返回請求的輸入流,用於獲得請求中的數據
getMethod():獲得客戶端向服務器端傳送數據的方法
getParameter(String name):獲得客戶端傳送給服務器端的有name指定的參數


getParameterNames():獲得客戶端傳送給服務器端的所有參數的名字,結果是

一個枚舉的實例
getParameterValues(String name):獲得有name指定的參數的所有值
getProtocol():獲取客戶端向服務器端傳送數據所依據的協議名稱
getQueryString():獲得查詢字符串
getRequestURI():獲取發出請求字符串的客戶端地址
getRemoteAddr():獲取客戶端的IP地址
getRemoteHost():獲取客戶端的名字
getSession([Boolean create]):返回和請求相關Session
getServerName():獲取服務器的名字
getServletPath():獲取客戶端所請求的腳本文件的路徑
getServerPort():獲取服務器的端口號
removeAttribute(String name):刪除請求中的一個屬性

67、J2EE是技術還是平臺還是框架?
J2EE本身是一個標準,一個爲企業分佈式應用的開發提供的標準平臺。
J2EE也是一個框架,包括JDBC、JNDI、RMI、JMS、EJB、JTA等技術。

68、我們在web應用開發過程中經常遇到輸出某種編碼的字符,如iso8859-1等,

如何輸出一個某種編碼的字符串?
Public String translate (String str) {
String tempStr = "";
try {
tempStr = new String(str.getBytes("ISO-8859-1"), "GBK");
tempStr = tempStr.trim();
}
catch (Exception e) {
System.err.println(e.getMessage());
}
return tempStr;
}

69、簡述邏輯操作(&,|,^)與條件操作(&&,||)的區別。
區別主要答兩點:a.條件操作只能操作布爾型的,而邏輯操作不僅可以操作布爾

型,而且可以操作數值型
b.邏輯操作不會產生短路

70、XML文檔定義有幾種形式?它們之間有何本質區別?解析XML文檔有哪幾種方

式?
a: 兩種形式 dtd schema
b: 本質區別:schema本身是xml的,可以被XML解析器解析(這也是從DTD上發展

schema的根本目的)
c:有DOM,SAX,STAX等
DOM:處理大型文件時其性能下降的非常厲害。這個問題是由DOM的樹結構所造成

的,這種結構佔用的內存較多,而且DOM必須在解析文件之前把整個文檔裝入內

存,適合對XML的隨機訪問
SAX:不現於DOM,SAX是事件驅動型的XML解析方式。它順序讀取XML文件,不需要

一次全部裝載整個文件。當遇到像文件開頭,文檔結束,或者標籤開頭與標籤結

束時,它會觸發一個事件,用戶通過在其回調事件中寫入處理代碼來處理XML文

件,適合對XML的順序訪問
STAX:Streaming API for XML (StAX)

xml文檔有兩種定義方法:
dtd:數據類型定義(data type definition),用以描述XML文檔的文檔結構,

是早期的XML文檔定義形式。
schema:其本身是基於XML語言編寫的,在類型和語法上的限定能力比dtd強,處

理也比較方便,因爲此正逐漸代替dtd成爲新的模式定義語言。

71、簡述synchronized和java.util.concurrent.locks.Lock的異同 ?
主要相同點:Lock能完成synchronized所實現的所有功能
主要不同點:Lock有比synchronized更精確的線程語義和更好的性能。

synchronized會自動釋放鎖,而Lock一定要求程序員手工釋放,並且必須在

finally從句中釋放。

72、EJB的角色和三個對象
一 個完整的基於EJB的分佈式計算結構由六個角色組成,這六個角色可以由不同

的開發商提供,每個角色所作的工作必須遵循Sun公司提供的EJB規範,以保證

彼此之間的兼容性。這六個角色分別是EJB組件開發者(Enterprise Bean

Provider) 、應用組合者(Application Assembler)、部署者(Deployer)、

EJB 服務器提供者(EJB Server Provider)、EJB 容器提供者(EJB Container

Provider)、系統管理員(System Administrator)
三個對象是Remote(Local)接口、Home(LocalHome)接口,Bean類

73、EJB容器提供的服務
主要提供聲明週期管理、代碼產生、持續性管理、安全、事務管理、鎖和併發行

管理等服務。

74、EJB規範規定EJB中禁止的操作有哪些?
1. 不能操作線程和線程API(線程API指非線程對象的方法如notify,wait等),2.

不能操作awt,3.不能實現服務器功能,4.不能對靜態屬 生存取,5.不能使用IO

操作直接存取文件系統,6.不能加載本地庫.,7.不能將this作爲變量和返回,

8.不能循環調用。

75、remote接口和home接口主要作用
remote接口定義了業務方法,用於EJB客戶端調用業務方法。
home接口是EJB工廠用於創建和移除查找EJB實例

76、bean 實例的生命週期
對 於Stateless Session Bean、Entity Bean、Message Driven Bean一般存在

緩衝池管理,而對於Entity Bean和Statefull Session Bean存在Cache管理,通

常包含創建實例,設置上下文、創建EJB Object(create)、業務方法調用、

remove等過程,對於存在緩衝池管理的Bean,在create之後實例並不從內存清除

,而是採用緩衝 池調度機制不斷重用實例,而對於存在Cache管理的Bean則通過

激活和去激活機制保持Bean的狀態並限制內存中實例數量。

77、EJB的激活機制
以Stateful Session Bean 爲例:其Cache大小決定了內存中可以同時存在的

Bean實例的數量,根據MRU或NRU算法,實例在激活和去激活狀態之間遷移,激活

機制是當客戶端調 用某個EJB實例業務方法時,如果對應EJB Object發現自己沒

有綁定對應的Bean實例則從其去激活Bean存儲中(通過序列化機制存儲實例)回

復(激活)此實例。狀態變遷前會調用對應的 ejbActive和ejbPassivate方法。

78、EJB的幾種類型
會話(Session)Bean ,實體(Entity)Bean 消息驅動的(Message Driven)

Bean
會話Bean又可分爲有狀態(Stateful)和無狀態(Stateless)兩種
實體Bean可分爲Bean管理的持續性(BMP)和容器管理的持續性(CMP)兩種

79、客服端調用EJB對象的幾個基本步驟
設置JNDI服務工廠以及JNDI服務地址系統屬性,查找Home接口,從Home接口調用

Create方法創建Remote接口,通過Remote接口調用其業務方法。

80、如何給weblogic指定大小的內存?
在啓動Weblogic的腳本中(位於所在Domian對應服務器目錄下的

startServerName),增加set MEM_ARGS=-Xms32m -Xmx200m,可以調整最小內存

爲32M,最大200M

81、如何設定的weblogic的熱啓動模式(開發模式)與產品發佈模式?
可以在管理控制檯中修改對應服務器的啓動模式爲開發或產品模式之一。或者修

改服務的啓動文件或者commenv文件,增加set PRODUCTION_MODE=true。

82、如何啓動時不需輸入用戶名與密碼?
修改服務啓動文件,增加 WLS_USER和WLS_PW項。也可以在boot.properties文件

中增加加密過的用戶名和密碼.

83、在weblogic管理制臺中對一個應用域(或者說是一個網站,Domain)進行jms及

ejb或連接池等相關信息進行配置後,實際保存在什麼文件中?
保存在此Domain的config.xml文件中,它是服務器的核心配置文件。

84、說說weblogic中一個Domain的缺省目錄結構?比如要將一個簡單的

helloWorld.jsp放入何目錄下,然的在瀏覽器上就可打入 http://主機:端口

號//helloword.jsp就可以看到運行結果了? 又比如這其中用到了一個自己寫的

javaBean該如何辦?
Domain 目錄服務器目錄applications,將應用目錄放在此目錄下將可以作爲應

用訪問,如果是Web應用,應用目錄需要滿足Web應用目錄要求,jsp文 件可以直

接放在應用目錄中,Javabean需要放在應用目錄的WEB-INF目錄的classes目錄中

,設置服務器的缺省應用將可以實現在瀏覽器上無 需輸入應用名。

85、在weblogic中發佈ejb需涉及到哪些配置文件
不同類型的EJB涉及的配置文件不同,都涉及到的配置文件包括ejb-

jar.xml,weblogic-ejb-jar.xmlCMP實體Bean一般還需要weblogic-cmp-rdbms-

jar.xml

86、如何在weblogic中進行ssl配置與客戶端的認證配置或說說j2ee(標準)進行

ssl的配置
缺 省安裝中使用DemoIdentity.jks和DemoTrust.jks KeyStore實現SSL,需要配

置服務器使用Enable SSL,配置其端口,在產品模式下需要從CA獲取私有密鑰和

數字證書,創建identity和trust keystore,裝載獲得的密鑰和數字證書。可以

配置此SSL連接是單向還是雙向的。

87、如何查看在weblogic中已經發布的EJB?
可以使用管理控制檯,在它的Deployment中可以查看所有已發佈的EJB

88、CORBA是什麼?用途是什麼?
CORBA 標準是公共對象請求代理結構(Common Object Request Broker

Architecture),由對象管理組織 (Object Management Group,縮寫爲 OMG)標

準化。它的組成是接口定義語言(IDL), 語言綁定(binding:也譯爲聯編)和允許

應用程序間互操作的協議。 其目的爲:用不同的程序設計語言書寫在不同的進

程中運行,爲不同的操作系統開發。

89、說說你所熟悉或聽說過的j2ee中的幾種常用模式?及對設計模式的一些看法
Session Facade Pattern:使用SessionBean訪問EntityBean
Message Facade Pattern:實現異步調用
EJB Command Pattern:使用Command JavaBeans取代SessionBean,實現輕量級

訪問
Data Transfer Object Factory:通過DTO Factory簡化EntityBean數據提供特


Generic Attribute Access:通過AttibuteAccess接口簡化EntityBean數據提供

特性
Business Interface:通過遠程(本地)接口和Bean類實現相同接口規範業務邏

輯一致性
EJB架構的設計好壞將直接影響系統的性能、可擴展性、可維護性、組件可重

用性及開發效率。項目越複雜,項目隊伍越龐大則越能體現良好設計的重要性。

90、說說在weblogic中開發消息Bean時的persistent與non-persisten的差別
persistent方式的MDB可以保證消息傳遞的可靠性,也就是如果EJB容器出現問題

而JMS服務器依然會將消息在此MDB可用的時候發送過來,而non-persistent方

式的消息將被丟棄。

既然沒有標準答案,就根據自己的所瞭解的,補充修正一下好了

91、Servlet執行時一般實現哪幾個方法?
public void init(ServletConfig config)
public ServletConfig getServletConfig()
public String getServletInfo()
public void service(ServletRequest request,ServletResponse response)
public void destroy()

init ()方法在servlet的生命週期中僅執行一次,在服務器裝載servlet時執行

。缺省的init()方法通常是符合要求的,不過也可以根據需要進行 override,

比如管理服務器端資源,一次性裝入GIF圖像,初始化數據庫連接等,缺省的

inti()方法設置了servlet的初始化參數,並用它 的ServeltConfig對象參數來

啓動配置,所以覆蓋init()方法時,應調用super.init()以確保仍然執行這些任

務。

service ()方法是servlet的核心,在調用service()方法之前,應確保已完成

init()方法。對於HttpServlet,每當客戶請求一個 HttpServlet對象,該對象

的service()方法就要被調用,HttpServlet缺省的service()方法的服務功能就

是調用與 HTTP請求的方法相應的do功能,doPost()和doGet(),所以對於

HttpServlet,一般都是重寫doPost()和doGet() 方法。

destroy()方法在servlet的生命週期中也僅執行一次,即在服務器停止卸載

servlet時執行,把servlet作爲 服務器進程的一部分關閉。缺省的destroy()方

法通常是符合要求的,但也可以override,比如在卸載servlet時將統計數字保

存在文件 中,或是關閉數據庫連接。

getServletConfig()方法返回一個servletConfig對象,該對象用來返回初始化

參數和servletContext。servletContext接口提供有關servlet的環境信息。

getServletInfo()方法提供有關servlet的信息,如作者,版本,版權。

92、j2ee常用的設計模式?說明工廠模式。
Java中的23種設計模式:
Factory(工廠模式), Builder(建造模式), Factory Method(工廠方法模

式),
Prototype(原始模型模式),Singleton(單例模式), Facade(門面模式)


Adapter(適配器模式), Bridge(橋樑模式), Composite(合成模式),
Decorator(裝飾模式), Flyweight(享元模式), Proxy(代理模式),
Command(命令模式), Interpreter(解釋器模式), Visitor(訪問者模式

),
Iterator(迭代子模式), Mediator(調停者模式), Memento(備忘錄模式

),
Observer(觀察者模式), State(狀態模式), Strategy(策略模式),
Template Method(模板方法模式), Chain Of Responsibleity(責任鏈模式


工 廠模式:工廠模式是一種經常被使用到的模式,根據工廠模式實現的類可以

根據提供的數據生成一組類中某一個類的實例,通常這一組類有一個公共的抽象

父類並且 實現了相同的方法,但是這些方法針對不同的數據進行了不同的操作

。首先需要定義一個基類,該類的子類通過不同的方法實現了基類中的方法。然

後需要定義一個 工廠類,工廠類可以根據條件生成不同的子類實例。當得到子

類的實例後,開發人員可以調用基類中的方法而不必考慮到底返回的是哪一個子

類的實例。

93、EJB需直接實現它的業務接口或Home接口嗎,請簡述理由。
遠程接口和Home接口不需要直接實現,他們的實現代碼是由服務器產生的,程序

運行中對應實現類會作爲對應接口類型的實例被使用。

其實一直都不是很明白EJB的remote接口,home接口,Bean類究竟是如何使用的

,或許應該進一步瞭解EJB的原理吧,查到了一個原創文章,那就說說EJB調用的

原理吧。其實在這個問題上,最需要理解的是RMI機制原理。

一個遠程對象至少要包括4個class文件:遠程對象、遠程對象接口、實現遠程接

口的對象的stub、對象的skeleton。

而在EJB中則至少要包括10個class:
Bean類,特定App Server的Bean實現類
Bean的remote接口,特定App Server的remote接口實現類,特定App Server的

remote接口的實現類的stub類和skeleton類。
Bean的home接口,特定App Server的home接口實現類,特定App Server的home接

口的實現類的stub類和skeleton類。

和RMI不同的是,EJB中這10個class真正需要用戶寫的只有3個,Bean類,remote

接口,home接口,其它的7個究竟怎麼生成,被打包在哪裏,是否需要更多的類

文件,否根據不同的App Server表現出較大的差異。

Weblogic:
home接口和remote接口的weblogic的實現類的stub類和skeleton類是在EJB被部

署到weblogic的時候,由weblogic動態生成stub類和skeleton類的字節碼,所以

看不到這4個類文件。

對 於一次客戶端遠程調用EJB,要經過兩個遠程對象的多次RMI循環。首先是通

過JNDI查找Home接口,獲得Home接口的實現類,這個過程其實相當復 雜,首先

是找到Home接口的Weblogic實現類,然後創建一個Home接口的Weblogic實現類的

stub類的對象實例,將它序列化傳送給客戶 端(注意stub類的實例是在第1次

RMI循環中,由服務器動態發送給客戶端的,因此不需要客戶端保存Home接口的

Weblogic實現類的stub 類),最後客戶端獲得該stub類的對象實例(普通的RMI

需要在客戶端保存stub類,而EJB不需要,因爲服務器會把stub類的對象實例發

送給客戶 端)。

客戶端拿到服務器給它的Home接口的Weblogic實現類的stub類對象實例以後,調

用stub類的create方法, (在代碼上就是home.create(),但是後臺要做很多事

情),於是經過第2次RMI循環,在服務器端,Home接口的Weblogic實現類的

skeleton類收到stub類的調用信息後,由它再去調用Home接口的Weblogic實現類

的create方法。

在服務端,Home 接口的Weblogic實現類的create方法再去調用Bean類的

Weblogic實現類的ejbCreate方法,在服務端創建或者分配一個EJB 實例,然後

將這個EJB實例的遠程接口的Weblogic實現類的stub類對象實例序列化發送給客

戶端。

客戶端收到remote接 口的Weblogic實現類的stub類的對象實例,對該對象實例

的方法調用(在客戶端代碼中實際上就是對remote接口的調用),將傳送給服務

器端 remote接口的Weblogic實現類的skeleton類對象,而skeleton類對象再調

用相應的remote接口的Weblogic實現類, 然後remote接口的Weblogic實現類再

去調用Bean類的Weblogic實現類,如此就完成一次EJB對象的遠程調用。

先拿普通RMI來說,有4個class,分別是遠程對象,對象的接口,對象的stub類

和skeleton類。而對象本身和對象的stub類同時都實現了接口類。而我們在客戶

端代碼調用遠程對象的時候,雖然在代碼中操縱接口,實質上是在操縱stub類,

例如:
接口類:Hello
遠程對象:Hello_Server
stub類:Hello_Stub
skeleton類:Hello_Skeleton

客戶端代碼要這樣寫:
Hello h = new Hello_Stub();
h.getString();

我們不會這些寫:
Hello_Stub h = new Hello_Stub();
h.getString();

因 爲使用接口適用性更廣,就算更換了接口實現類,也不需要更改代碼。因此

客戶端需要Hello.class和Hello_Stub.class這兩個文件。 但是對於EJB來說,

就不需要Hello_Stub.class,因爲服務器會發送給它,但是Hello.class文件客

戶端是省不了的,必須有。表面 上我們的客戶端代碼在操縱Hello,但別忘記了

Hello只是一個接口,抽象的,實質上是在操縱Hello_Stub。

拿Weblogic上的EJB舉例子,10個class分別是:
Bean類:HelloBean (用戶編寫)
Bean類的Weblogic實現類:HelloBean_Impl (EJBC生成)

Home接口:HelloHome (用戶編寫)
Home接口的Weblogic實現類 HelloBean_HomeImpl(EJBC生成)
Home接口的Weblogic實現類的stub類 HelloBean_HomeImpl_WLStub(部署的時候

動態生成字節碼)
Home接口的Weblogic實現類的skeleton類 HelloBean_HomeImpl_WLSkeleton(部

署的時候動態生成字節碼)

Remote接口: Hello (用戶編寫)
Remote接口的Weblogic實現類 HelloBean_EOImpl(EJBC生成)
Remote接口的Weblogic實現類的stub類 HelloBean_EOImpl_WLStub(部署的時候

動態生成字節碼)
Remote接口的Weblogic實現類的skeleton類 HelloBean_EOImpl_WLSkeleton(部

署的時候動態生成字節碼)

客戶端只需要Hello.class和HelloHome.class這兩個文件。

HelloHome home = (Home) PortableRemoteObject.narrow(ctx.lookup

("Hello"), HelloHome.class);

這一行代碼是從JNDI獲得Home接口,但是請記住!接口是抽象的,那麼home這個

對象到底是什麼類的對象實例呢?很簡單,用toString()輸出看一下就明白了,

下面一行是輸出結果:
HelloBean_HomeImpl_WLStub@18c458
這表明home這個通過從服務器的JNDI樹上查找獲得的對象實際上是

HelloBean_HomeImpl_WLStub類的一個實例。
接下來客戶端代碼:

Hello h = home.create()

同樣Hello只是一個抽象的接口,那麼h對象是什麼東西呢?打印一下:
HelloBean_EOImpl_WLStub@8fa0d1
原來是HelloBean_EOImpl_WLStub的一個對象實例。

用這個例子來簡述一遍EJB調用過程:

首先客戶端JNDI查詢,服務端JNDI樹上Hello這個名字實際上綁定的對象是

HelloBean_HomeImpl_WLStub,所以服務端將創建HelloBean_HomeImpl_WLStub的

一個對象實例,序列化返回給客戶端。

於 是客戶端得到home對象,表面上是得到HelloHome接口的實例,實際上是進行

了一次遠程調用得到了 HelloBean_HomeImpl_WLStub類的對象實例,別忘記了

HelloBean_HomeImpl_WLStub也實現了 HelloHome接口。

然後home.create()實質上就是 HelloBean_HomeImpl_WLStub.create(),該方法

將發送信息給 HelloBean_HomeImpl_WLSkeleton,而

HelloBean_HomeImpl_WLSkeleton接受到信息後,再去調用 HelloBean_HomeImpl

的create方法,至此完成第1次完整的RMI循環。

注意在這次RMI循環過程中,遠程對象 是HelloBean_HomeImpl,遠程對象的接口

是HelloHome,對象的stub是HelloBean_HomeImpl_WLStub, 對象的skeleton是

HelloBean_HomeImpl_WLSkeleton。

然後HelloBean_HomeImpl 再去調用HelloBean_Impl的ejbCreate方法,而

HelloBean_Impl的ejbCreate方法將負責創建或者分配一個 Bean實例,並且創建

一個HelloBean_EOImpl_WLStub的對象實例。

這一步比較有趣的是,在前一步RMI循環 中,遠程對象HelloBean_HomeImpl在客

戶端有一個代理類HelloBean_HomeImpl_WLStub,但在這一步,

HelloBean_HomeImpl自己卻充當了HelloBean_Impl的代理類,只不過

HelloBean_HomeImpl不在客戶端,而是 在服務端,因此不進行RMI。

然後HelloBean_EOImpl_WLStub的對象實例序列化返回給客戶端,這一步也很有

趣, 上次RMI過程,主角是HelloBean_HomeImpl和它的代理類

HelloBean_HomeImpl_WLStub,但這這一次換成了 HelloBean_EOImpl和它的代理

類HelloBean_EOImpl_WLStub來玩了。


Hello h = home.create();h.helloWorld();

假設Hello接口有一個helloWorld遠程方法,那麼表面上是在調用Hello接口的

helloWorld方法,實際上是在調用HelloBean_EOImpl_WLStub的helloWorld方法

然 後HelloBean_EOImpl_WLStub的helloWorld方法將發送信息給服務器上的

HelloBean_EOImpl_WLSkeleton,而HelloBean_EOImpl_WLSkeleton收到信息以後

,再去調用 HelloBean_EOImpl的helloWorld方法。至此,完成第2次完整的RMI

循環過程。

在剛纔 HelloBean_EOImpl是作爲遠程對象被調用的,它的代理類是

HelloBean_EOImpl_WLStub,但現在 HelloBean_EOImpl要作爲HelloBean_Impl的

代理類了。現在HelloBean_EOImpl去調用 HelloBean_Impl的helloWorld方法。

注意!HelloBean_Impl繼承了HelloBean,而HelloBean中的 helloWorld方法是

我們親自編寫的代碼,現在終於調用到了我們編寫的代碼了!

至此,一次EJB調用過程終於完成。在整個過程 中,服務端主要要調用的類是

HelloBean_Impl, HelloBean_HomeImpl,HelloBean_HomeImpl_WLSkeleton,

HelloBean_EOImpl, HelloBean_EOImpl_WLSkeleton。客戶端主要調用的類是

HelloBean_HomeImpl_WLStub, HelloBean_EOImpl_WLStub,這兩個類在客戶端

代碼中並不會直接出現,出現在代碼中的類是他們的接口HelloHome和 Hello,

因此客戶端需要這兩個接口文件,而Stub是服務器傳送給他們的。

http://www.pbase.com/nobo123/image/27229257

http://forum.javaeye.com/viewtopic.php?

t=3832&postdays=0&postorder=asc&start=0

94、排序都有哪幾種方法?請列舉。用JAVA實現一個快速排序。
排序的方法有:插入排序(直接插入排序、希爾排序),交換排序(冒泡排序、

快速排序),選擇排序(直接選擇排序、堆排序),歸併排序,分配排序(箱排

序、基數排序)
快速排序的僞代碼。
/ /使用快速排序方法對a[ 0 :n- 1 ]排序
從a[ 0 :n- 1 ]中選擇一個元素作爲m i d d l e,該元素爲支點
把餘下的元素分割爲兩段left 和r i g h t,使得l e f t中的元素都小於等於

支點,而right 中的元素都大於等於支點
遞歸地使用快速排序方法對left 進行排序
遞歸地使用快速排序方法對right 進行排序
所得結果爲l e f t + m i d d l e + r i g h t

95、請對以下在J2EE中常用的名詞進行解釋(或簡單描述)
web 容器:給處於其中的應用程序組件(JSP,SERVLET)提供一個環境,使

JSP,SERVLET直接和容器中的環境變量接接口互,不必關注其它系統問 題。主要

有WEB服務器來實現。例如:TOMCAT,WEBLOGIC,WEBSPHERE等。該容器提供的接口

嚴格遵守J2EE規範中的WEB APPLICATION 標準。我們把遵守以上標準的WEB服務

器就叫做J2EE中的WEB容器。
Web container:實現J2EE體系結構中Web組件協議的容器。這個協議規定了一個

Web組件運行時的環境,包括安全,一致性,生命週期管理,事務, 配置和其它

的服務。一個提供和JSP和J2EE平臺APIs界面相同服務的容器。一個Web

container 由Web服務器或者J2EE服務器提供。
EJB容器:Enterprise java bean 容器。更具有行業領域特色。他提供給運行在

其中的組件EJB各種管理功能。只要滿足J2EE規範的EJB放入該容器,馬上就會被

容器進行高效率的管理。並 且可以通過現成的接口來獲得系統級別的服務。例

如郵件服務、事務管理。
一個實現了J2EE體系結構中EJB組件規範的容器。
這個規範指定了一個Enterprise bean的運行時環境,包括安全,一致性,生命

週期,事務,
配置,和其他的服務。
JNDI:(Java Naming & Directory Interface)JAVA命名目錄服務。主要提供

的功能是:提供一個目錄系統,讓其它各地的應用程序在其上面留下自己的索引

,從而滿足快速查找和定位分佈式應用程序的功能。
JMS:(Java Message Service)JAVA消息服務。主要實現各個應用程序之間的

通訊。包括點對點和廣播。
JTA:(Java Transaction API)JAVA事務服務。提供各種分佈式事務服務。應

用程序只需調用其提供的接口即可。
JAF:(Java Action FrameWork)JAVA安全認證框架。提供一些安全控制方面的

框架。讓開發者通過各種部署和自定義實現自己的個性安全控制策略。
RMI/IIOP: (Remote Method Invocation /internet對象請求中介協議)他們主

要用於通過遠程調用服務。例如,遠程有一臺計算機上運行一個程序,它提供股

票分析服務,我們可以在本地計算機 上實現對其直接調用。當然這是要通過一

定的規範才能在異構的系統之間進行通信。RMI是JAVA特有的。
RMI-IIOP出現以前,只有RMI和 CORBA兩種選擇來進行分佈式程序設計。RMI-

IIOP綜合了RMI和CORBA的優點,克服了他們的缺點,使得程序員能更方便的編寫

分佈式程序設 計,實現分佈式計算。首先,RMI-IIOP綜合了RMI的簡單性和

CORBA的多語言性(兼容性),其次RMI-IIOP克服了RMI只能用於Java 的缺點和

CORBA的複雜性(可以不用掌握IDL)。

96、JAVA語言如何進行異常處理,關鍵字:throws,throw,try,catch,finally分

別代表什麼意義?在try塊中可以拋出異常嗎?

Java 通過面向對象的方法進行異常處理,把各種不同的異常進行分類,並提供

了良好的接口。在Java中,每個異常都是一個對象,它是Throwable類或其它 子

類的實例。當一個方法出現異常後便拋出一個異常對象,該對象中包含有異常信

息,調用這個對象的方法可以捕獲到這個異常並進行處理。Java的異常處理是

通過5個關鍵詞來實現的:try、catch、throw、throws和finally。一般情況下

是用try來執行一段程序,如果出現異常,系統會拋 出(throws)一個異常,這

時候你可以通過它的類型來捕捉(catch)它,或最後(finally)由缺省處理器

來處理。
用try來指定一塊預防所有"異常"的程序。緊跟在try程序後面,應包含一個

catch子句來指定你想要捕捉的"異常"的類型。
throw語句用來明確地拋出一個"異常"。
throws用來標明一個成員函數可能拋出的各種"異常"。
Finally爲確保一段代碼不管發生什麼"異常"都被執行一段代碼。
可 以在一個成員函數調用的外面寫一個try語句,在這個成員函數內部寫另一個

try語句保護其他代碼。每當遇到一個try語句,"異常"的框架就放到堆棧上 面

,直到所有的try語句都完成。如果下一級的try語句沒有對某種"異常"進行處理

,堆棧就會展開,直到遇到有處理這種"異常"的try語句。

http://www.programfan.com/article/showarticle.asp?id=2731

97、一個".java"源文件中是否可以包括多個類(不是內部類)?有什麼限制?
可以。必須只有一個類名與文件名相同。

98、MVC的各個部分都有那些技術來實現?如何實現?
MVC 是Model-View-Controller的簡寫。"Model" 代表的是應用的業務邏輯(

通過JavaBean,EJB組件實現), "View" 是應用的表示面,用於與用戶的交互

(由JSP頁面產生),"Controller" 是提供應用的處理過程控制(一般是一個

Servlet),通過這種設計模型把應用邏輯,處理過程和顯示邏輯分成不同的組

件實現。這些組件可以進行交互和重 用。
model層實現系統中的業務邏輯,view層用於與用戶的交互,controller層是

model與view之間溝通的橋樑,可以分派用戶的請求並選擇恰當的視圖以用於顯

示,同時它也可以解釋用戶的輸入並將它們映射爲模型層可執行的操作。

99、java中有幾種方法可以實現一個線程?用什麼關鍵字修飾同步方法? stop()

和suspend()方法爲何不推薦使用?
有兩種實現方法,分別是繼承Thread類與實現Runnable接口
用synchronized關鍵字修飾同步方法
反 對使用stop(),是因爲它不安全。它會解除由線程獲取的所有鎖定,而且如

果對象處於一種不連貫狀態,那麼其他線程能在那種狀態下檢查和修改它們。結

果 很難檢查出真正的問題所在。suspend()方法容易發生死鎖。調用suspend()

的時候,目標線程會停下來,但卻仍然持有在這之前獲得的鎖定。此 時,其他

任何線程都不能訪問鎖定的資源,除非被"掛起"的線程恢復運行。對任何線程來

說,如果它們想恢復目標線程,同時又試圖使用任何一個鎖定的資源,就 會造

成死鎖。所以不應該使用suspend(),而應在自己的Thread類中置入一個標誌,

指出線程應該活動還是掛起。若標誌指出線程應該掛起,便用 wait()命其進入

等待狀態。若標誌指出線程應當恢復,則用一個notify()重新啓動線程。

100、java中有幾種類型的流?JDK爲每種類型的流提供了一些抽象類以供繼承,

請說出他們分別是哪些類?
字節流,字符流。字節流繼承於InputStream OutputStream,字符流繼承於

InputStreamReader OutputStreamWriter。在java.io包中還有許多其他的流,

主要是爲了提高性能和使用方便。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章