計算機類面試專業(yè)問題_第1頁
計算機類面試專業(yè)問題_第2頁
計算機類面試專業(yè)問題_第3頁
計算機類面試專業(yè)問題_第4頁
計算機類面試專業(yè)問題_第5頁
已閱讀5頁,還剩77頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

計算機類面試專業(yè)問題

2007-12-1100:01

1、java

因為我投的職位主要是java相關(guān)的,所以這方面積累的經(jīng)驗比較多一下。

這部分考

查的重點主要有:java基本語法,多線程,異常處理,抽象類,匿名類,接口,

MVC架構(gòu)

,設(shè)計模式,Servlet,Struts,Spring,J2EE。以下是我遇見過的面試問題:

1)transient和volatile是java關(guān)鍵字嗎?(瞬聯(lián))

transient:

java有個特點就是序列化,簡單地來說就是可以將這個類存儲在物理空間(當然還是

以文件的形式存在),那么當你從本地還原這個文件時,你可以將它轉(zhuǎn)換為它本身。這可以

極大地方便網(wǎng)絡(luò)上的一些操作,但同時,因為涉及到安全問題,所以并不希望把類里面所

有的東西都能存儲(因為那樣,別人可以通過序列化知道類里面的內(nèi)容),那么我們就可

以用上transient這個關(guān)鍵字,它的意思是臨時的,即不會隨類一起序列化到本地,所以當

還原后,這個關(guān)健字定義的變量也就不再存在。

volatile:

Volatile修飾的成員變量在每次被線程訪問時,都強迫從共享內(nèi)存中重讀該成員變量

的值。而且,當成員變量發(fā)生變化時,強迫線程將變化值回寫到共享內(nèi)存。這樣在任何時刻,

兩個不同的線程總是看到某個成員變量的同一個值。

2)抽象類和接口有什么區(qū)別?(瞬聯(lián))

1>飛機會飛,鳥會飛,他們都繼承了同一個接口“飛”;但是F22屬于飛機抽象類,鴿子

屬于鳥抽象類。

2>就像鐵門木門都是門(抽象類),你想要個門我給不了(不能實例化),但我可以給

你個具體的鐵門或木門(多態(tài));而且只能是門,你不能說它是窗(單繼承);一個門可以

有鎖(接口)也可以有門鈴(多實現(xiàn))。門(抽象類)定義了你是什么,接口(鎖)規(guī)定了

你能做什么(一個接口最好只能做一件事,你不能要求鎖也能發(fā)出聲音吧(接口污染))。

抽象類和接口有什么區(qū)別?

簡單來說,

接口是公會的,里面不能有私有的方法或變量,是用于讓別人使用的,而抽象類是可以有私

有方法或私有變量的.

另外,實現(xiàn)接口的-?定要實現(xiàn)接口里定義的所有方法,而實現(xiàn)抽象類可以有選擇地重寫需要

用到的方法,一般的應用里,最頂級的是接口,然后是抽象類實現(xiàn)接口,最后才到具體類實

現(xiàn)。

還有,接口可以實現(xiàn)多重繼承,而一個類只能繼承一個超類,但可以通過繼承多個接U實現(xiàn)

多重繼承,接口還有標識(里面沒有任何方法,如Remote接口)和數(shù)據(jù)共享(里面的變量

全是常量)的作用.

接口和抽象類的區(qū)別,我覺得主要是兩點,一個是抽象類里還可以有非抽象的方法,雖然抽

象類仍無法實例化,但是其子類可以,也就是說這些非抽象函數(shù)仍可以被多態(tài)調(diào)用,這也是

抽象類為什么沒有完全被接口取代的原因。接口就是相反了,不過接口也有一個優(yōu)勢是抽象

類無法比擬,就是類可以繼承多個接口,而抽象類和普通類一樣,只能繼承一個,所以接口

可以解決多重繼承問題。

抽象類可以只實現(xiàn)部分方法,接口則必須實現(xiàn)其全部方法;抽象類的方法可以有抽象方法,

也可以有普通方法,接口里的方法必須是抽象方法;抽象類的方法的訪問權(quán)限可以多種,接

口的方法的訪問權(quán)限只能是public;抽象類的子類只能繼承一個抽象類,而實現(xiàn)接口的類

可以同時實現(xiàn)多個接口.

籠統(tǒng)點說:

接口=定義了要做的所有事情,但自己啥也不干

抽象類=做了部分共做,剩下的他不干了,等后來人繼續(xù)完成

這就是區(qū)別!

抽象類的成員可以具有訪問級別,而接口的成員全部public級別

抽象類可以包含字段,而接口不可以,

抽象類可以繼承接口,而接口不能繼承抽象類

抽象類的成員可以具有具體實現(xiàn),而接口不行

抽象的子類可以選擇性實現(xiàn)其基類的抽象方法,而接口的子類必須全部實現(xiàn)

2)能說一下java的反射機制嗎?(瞬聯(lián))

JAVA反射機制是在運行狀態(tài)中,對于任意一個類,都能夠知道這個類的所有屬性和方法;

對于任意一個對象,都能夠調(diào)用它的任意?個方法:這種動態(tài)獲取的信息以及動態(tài)調(diào)用對象

的方法的功能稱為java語言的反射機制。

Java反射機制主要提供了以卜功能:在運行時判斷任意一個對象所屬的類;在運行時

構(gòu)造任意一個類的對象;在運行時判斷任意一個類所具有的成員變量和方法;在運行時調(diào)用

任意一個對象的方法;生成動態(tài)代理。

4)在java中怎樣實現(xiàn)多線程?(瞬聯(lián))

5)你用過哪種設(shè)計模式?(瞬聯(lián),IBM,aspenTech)

6)請說一下MVC架構(gòu)(瞬聯(lián),IBM,aspenTech)

7)如果類a繼承類b,實現(xiàn)接口c,而類b和接口c中定義了同名變量,請問會

出現(xiàn)什么問題?(瞬聯(lián))

8)請說一下java中為什么要引入內(nèi)部類?還有匿名內(nèi)部類?(瞬聯(lián),IBM)

9)請說一下final,finally和finalize的區(qū)別?(瞬聯(lián))

10)請說一下HTTP請示的基本過程(IBM)

11)java中存在內(nèi)存泄漏問題嗎?請舉例說明?(IBM)

12)請說一下java中的內(nèi)存回收機制所采用的算法(IBM,瞬聯(lián))

13)請說一下System.gc()函數(shù)的作用。什么什么時候可以調(diào)用垃圾回收器?(瞬

聯(lián))

14)你做過的項目中采用了什么安全認證機制?(IBM)

15)Math,round。什么作用?

2、C

C語言考查的重點一般是:指針、結(jié)構(gòu)體、條件編譯、全局變量/局部變量。

以下是

我遇見過的面試問題:

1)請說一下extemC的作用(漢略)

2)請說一下#ifdef...的作用(漢略)

3)C語言里,哪些變量是存放在堆里,哪些是存放在棧里?(普天)

4)C語言里的static關(guān)鍵詞是什么含義?(普天)

5)進程和線程有什么區(qū)別?(普天)

3、C++

C++語言考查的重點主要有:多繼承,抽象類,虛函數(shù),拷貝構(gòu)造函數(shù),析

構(gòu)函數(shù),

動態(tài)聯(lián)編,多態(tài),const,static0以下是我面試中遇到的問題:

1)你聽說過拷貝構(gòu)造函數(shù)嗎?能具體說一下它的作用嗎?(漢略)

2)析構(gòu)函數(shù)必須是虛函數(shù)嗎?為什么?(漢略)

3)你聽說過鉆石結(jié)構(gòu)嗎?請具體說一下(aspenTech)

4)什么是深拷貝?什么是淺拷貝?他們有什么區(qū)別?(aspenTech)

5)什么是虛函數(shù),什么是純虛函數(shù)?為什么引入虛函數(shù)和純虛函數(shù)?(漢略,

aspenTe

ch,普天)

6)請說一下面向?qū)ο蟮幕咎匦浴#╝spenTech)

7)C++中的const關(guān)鍵定代表什么含義?跟C語言中的const有什么區(qū)別?

(aspenTech)

8)C++中的static關(guān)鍵定代表什么含義?跟C語言、Java中的static有什么

區(qū)別?(普天

4、數(shù)據(jù)結(jié)構(gòu)

這是面試中兒乎必考的部分??疾榈闹攸c有:鏈表,二叉樹前序、中序、后

序遍歷

(遞歸,非遞歸),二叉樹結(jié)點、層次的計算,樹轉(zhuǎn)二叉樹,各種排序算法(冒

泡排序

,快速排序,堆排序是重點)。以下是我在面試中遇到過的問題:

1)請編寫程序,將一個鏈表倒置。(聯(lián)發(fā))

2)請編寫二叉樹的中序遍歷非遞歸算法。(新華社)

3)請編寫一個程序,實現(xiàn)將樹轉(zhuǎn)化成二叉樹。(華為)

4)一棵滿二叉樹有x個結(jié)點,請問整棵二叉樹有多少結(jié)點?(新華社,中國信

保)

5)請編程實現(xiàn)一個堆排序算法/快速排序算法。(漢略)

5、數(shù)據(jù)庫

這也是面試重點內(nèi)容。主要考查點有:范式,1、2、3范式,事務(wù),內(nèi)連接,

外連接

,關(guān)系代數(shù),數(shù)據(jù)庫設(shè)計。以下是我遇到過的面試問題:

1)什么是范式、1范式、2范式、3范式?(百度,中航信,新華社,中國信保)

2)事務(wù)具有哪些特性?(中航信)

3)請說說什么是外連接、左外連接、右外連接?(aspenTech)

4)請說說關(guān)系代表中的兒種基本運算?(中航信)

5)請對一個論壇進行數(shù)據(jù)庫設(shè)計,并說說你設(shè)計的數(shù)據(jù)庫滿足哪個范式(百度)

6)給你一個數(shù)據(jù)庫需求,請對數(shù)據(jù)庫進行設(shè)計,并根據(jù)要求寫出查詢語句(中

國信保)

6、網(wǎng)絡(luò)

這也是常考的部分。主要考查點有:OSI參考模型,TCP/IP參考模型。以下

是我遇到

過的具體面試問題:

1)請解釋一下OSI參考模型。(中國信保)

2)請解釋一下TCP/IP參考模型。(中國信保)

3)為什么現(xiàn)在的網(wǎng)絡(luò)最后采用了TCP/IP參考模型而沒用0SI參考模型?(中國

信保)

Java

1)transient和volatile是java關(guān)鍵字嗎

不常用到的關(guān)鍵字有:const,goto,native,strictfp,transient,volatile0

const和goto為java中的保留字。

1.native

native是方法修飾符。Native方法是由另外一種語言(如c/c++,FORTRAN,匯編)實現(xiàn)的

本地方法。因為在外部實現(xiàn)了方法,所以在java代碼中,就不需要聲明了,有點類似于借

口方法。Native可以和其他一些修飾符連用,但是abstract方法和Interface方法不能用native

來修飾。

Example:代碼

publicinterfaceTestinterface{

voiddoMethod();

}

publicclassTestimplementsTestinterface{

publicnativevoiddoMethod();

privatenativeintdoMethodB();

publicnativesynchronizedStringdoMcthodC();

staticnativevoiddoMethodD();

)

render_code();

為什么需要使用nativemethod?請參考:

/topic/72543javaNativeMethod初涉

2.strictfp

修飾類和方法,意思是FP-strict,精確浮點,符合IEEE-754規(guī)范的。當一個class或interface

用strictfp聲明,內(nèi)部所有的float和double表達式都會成為strictfp的。Interfacemethod不

能被聲明為strictfp的,class的可以。

Example:

代碼

strictfpinterfaceFPTest{

voidmethodA();

}

classFPClassimplementsFPTest{

publicvoidmethodA(){

publicvoidmcthodB(){

}

publicstrictfpvoidmethodC(){

}

}

classFPClassB{

strictfpvoidmethodA(){

}

}

render_code();

3.transient

變量修飾符。標記為transient的變量,在對象存儲時,這些變量狀態(tài)不會被持久化。當對象

序列化的保存在存儲器上時,不希望有些字段數(shù)據(jù)被保存,為了保證安全性,可以把這些字

段聲明為transiento

4.volatile

volatile修飾變量。在每次被線程訪問時,都強迫從共享內(nèi)存中重讀該成員變量的值。而且,

當成員變量發(fā)生變化時,強迫線程將變化值回寫到共享內(nèi)存。這樣在任何時刻,兩個不同的

線程總是看到某個成員變量的同一個值。

看看JavaLanguageSpecification中的例子。

條件:一個線程不停的調(diào)用方法。ne(),一個線程不停的調(diào)用方法two()。我測試過多次,這

種情況好像一直沒有現(xiàn)。

抽象類和接口有什么區(qū)別?(瞬聯(lián))

聲明方法的存在而不去實現(xiàn)它的類被叫做抽象類(abstractclass),它用于要創(chuàng)建一個體現(xiàn)某

些基本行為的類,并為該類聲明方法,但不能在該類中實現(xiàn)該類的情況。不能創(chuàng)建abstract類

的實例。然而可以創(chuàng)建一個變量,其類型是一個抽象類,并讓它指向具體子類的一個實例。

不能有抽象構(gòu)造函數(shù)或抽象靜態(tài)方法。Abstract類的子類為它們父類中的所有抽象方法提供

實現(xiàn),否則它們也是抽象類為。取而代之,在子類中實現(xiàn)該方法。知道其行為的其它類可以

在類中實現(xiàn)這些方法。

接口(interface)是抽象類的變體。在接口中,所有方法都是抽象的。多繼承性可通過

實現(xiàn)這樣的接口而獲得。接口中的所有方法都是抽象的,沒有一個有程序體。接口只可以定

義staticfinal成員變量。接口的實現(xiàn)與子類相似,除了該實現(xiàn)類不能從接口定義中繼承行為。

當類實現(xiàn)特殊接口時,它定義(即將程序體給予)所有這種接U的方法。然后,它可以在實

現(xiàn)了該接口的類的任何對象卜.調(diào)用接口的方法。由于有抽象類,它允許使用接口名作為引用

變量的類型。通常的動態(tài)聯(lián)編將生效。引用可以轉(zhuǎn)換到接口類型或從接口類型轉(zhuǎn)換,

instanceof運算符可以用來決定某對象的類是否實現(xiàn)了接口。

3)能說一下java的反射機制嗎?(瞬聯(lián))

JAVA反射機制是在運行狀態(tài)中,對于任意一個類,都能夠知道這個類的所有屬性和方法;

對于任意一個對象,都能夠調(diào)用它的任意一個方法;這種動態(tài)獲取的信息以及動態(tài)調(diào)用對象

的方法的功能稱為java語言的反射機制。

Java反射機制主要提供了以下功能:在運行時判斷任意一個對象所屬的類;在運行時構(gòu)造

任意一個類的對象;在運行時判斷任意一個類所具有的成員變量和方法;在運行時調(diào)用任意

一個對象的方法;生成動態(tài)代理。

1.得到某個對象的屬性

1publicObjectgetProperty(Objectowner,StringfieldName)throwsException{

2ClassownerClass=owner.getClass();

3

4Fieldfield=ownerClass.getField(fieldName);

5

6Objectproperty=field.get(owner);

7

8returnproperty;

9)

ClassownerClass=owner.getClass():得到該對象的Classo

Fieldfield=ownerClass.getField(fieldName):通過Class得到類聲明的屬性。

Objectproperty=field.get(owner):通過對象得到該屬性的實例,如果這個屬性是非公有的,

這里會報HlegalAccessException。

2.得到某個類的靜態(tài)屬性

1publicObjectgetStaticProperty(StringclassName,StringfieldName)

2throwsException{

3ClassownerClass=Class.forName(className);

4

5Fieldfield=ownerClass.getField(fieldName);

6

7Objectproperty=field.get(ownerClass);

8

9returnproperty;

10)

ClassownerClass=Class.fbrName(className):首先得到這個類的Classo

Fieldfield=ownerClass.getField(fieldName):和上面一樣,通過Class得到類聲明的屬性。

Objectproperty=field.get(ownerClass):這里和上面有些不同,因為該屬性是靜態(tài)的,所以

直接從類的Class里取。

3.執(zhí)行某對象的方法

1publicObjectinvokeMethod(Objectowner,StringmethodName,Object[]args)throwsExcepti

on{

2

3ClassownerClass=owner.getClass();

4

5Classf]argsClass=newClass[args.length];

6

7for(inti=0,j=args.length;i<j;i-H-){

8argsClass[i]=args[i].getClass();

9}

10

11Methodmethod=ownerClass.getMethod(methodName,argsClass);

12

13returnmethod.invoke(owner,args);

14)

Classownerclass=owner.getClass():首先還是必須得到這個對象的Class0

5?9行:配置參數(shù)的Class數(shù)組,作為尋找Method的條件。

Methodmethod=ownerClass.getMethod(methodName,argsClass):通過Method名和參數(shù)的

Class數(shù)組得到要執(zhí)行的Methodo

method.invoke(owner,args):執(zhí)行該Method,invoke方法的參數(shù)是執(zhí)行這個方法的對象,和

參數(shù)數(shù)組。返回值是Object,也既是該方法的返回值。

4.執(zhí)行某個類的靜態(tài)方法

1publicObjectinvokeStaticMethod(StringclassName,StringmethodName,

2Object[]args)throwsException{

3ClassownerClass=Class.fbrName(className);

4

5Classf]argsClass=newClass[args.length];

6

7for(inti=0,j=args.length;i<j;i-H-){

8argsClass[i]=args[i].getClass();

9)

10

11Methodmethod=ownerClass.getMethod(methodName,argsClass);

12

13returnmethod.invoke(null,args);

14}

基本的原理和實例3相同,不同點是最后一行,invoke的一個參數(shù)是null,因為這是靜態(tài)方

法,不需要借助實例運行。

5.新建實例

1

2publicObjectnewInstance(StringclassName,Object[]args)throwsException{

3ClassnewoneClass=Class.fbrName(className);

4

5Class[]argsClass=newClass[args.length];

6

7for(inti=0,j=args.length;i<j;i++){

8argsClass[i]=args[i].getClass();

9}

10

11Constructorcons=newoneClass.getConstructor(argsClass);

12

13returncons.newlnstance(args);

14

15)

這里說的方法是執(zhí)行帶參數(shù)的構(gòu)造函數(shù)來新建實例的方法。如果不需要參數(shù),可以直接使用

newoneClass.newInstance()來實現(xiàn)。

ClassnewoneClass=Class.fbrName(className):第一步,得到要構(gòu)造的實例的Classo

第5?第9行:得到參數(shù)的Class數(shù)組。

Constructorcons=newoneClass.getConstructor(argsClass):得到構(gòu)造子。

cons.newlnstance(args):新建實例。

6.判斷是否為某個類的實例

1publicbooleanisInstance(Objectobj,Classcis){

2returncls.islnstance(obj);

3)

7.得到數(shù)組中的某個元素

1publicObjectgetByArray(Objectarray,intindex){

2returnArray.get(array,index);

3)

4)在java中怎樣實現(xiàn)多線程?(瞬聯(lián))

與其他語言不一樣的是,線程的觀念在java是語言中是重要的,根深蒂固的,因為在java

語言中的線程系統(tǒng)是java語言自建的,java中有專門的支持多線程的API庫,所以你可以

以最快的速度寫一個支持線程的程序。在使用java創(chuàng)建線程的時候,你可以生成一個Thread

類或者他的子類對象,并給這個對象發(fā)送start。消息(程序可以向任何個派生自Runnable

接口的類對象發(fā)送start()消息的),這樣一來程序會一直執(zhí)行,直到run返回為止,此時該

線程就死掉了。

在java語言中,線程有如下特點:

§在一個程序中而言,主線程的執(zhí)行位置就是main。而其他線程執(zhí)行的位置,程序員

是可以自定義的。值得注意的是對Applet也是一樣。

§每個線程執(zhí)行其代碼的方式都是一次順序執(zhí)行的。

§一個線程執(zhí)行其代碼是與其他線程獨立開來的。如果諸線程之間又相互協(xié)作的話,就

必須采用一定的交互機制。

§前面已經(jīng)說過,線程是共享地址空間的,如果控制不當,這里很有可能出現(xiàn)死鎖。

各線程之間是相互獨立的,那么本地變量對一個線程而言就是完全獨立,私有的。所以

呢,線程執(zhí)行時,每個線程都有各自的本地變量拷貝。對象變量(instancevariable)在線程之

間是可以共享的,這也就是為什么在java中共享數(shù)據(jù)對象是如此的好用,但是java線程不

能夠武斷地訪問對象變量:他們是需要訪問數(shù)據(jù)對象的權(quán)限的。

二、準備知識

在分析這個例子之前,然我們先看看關(guān)于線程的幾個概念,上鎖,信號量,和java所

提供的API。

上鎖

對于大多數(shù)的程序而言,他們都需要線程之間相互的通訊來完成整個線程的生命周期,

二實現(xiàn)線程之間同步的最簡單的辦法就是上鎖。為了防止相互關(guān)聯(lián)的兩個線程之間錯誤地訪

間共享資源,線程需要在訪問資源的時候上鎖和解鎖,對于鎖而言,有讀鎖,寫鎖和讀寫鎖

等不同的同步策略。在java中,所有的對象都有鎖:線程只需要使用synchronized關(guān)鍵字就

可以獲得鎖。在任時刻對于給定的類的實例,方法或同步的代碼塊只能被一個線程執(zhí)行。

這是因為代碼在執(zhí)行之前要求獲得對象的鎖。

/士旦啟-

1萬節(jié)里

通常情況下,多個線程所訪問為數(shù)不多的資源,那怎么控制呢?一個比較非常經(jīng)典而起

非常簡單的辦法就是采用信號量機制。信號量機制的含義就是定義一個信號量,也就是說能

夠提供的連接數(shù);當有一個線程占用了一個連接時,信號量就減一;當一個線程是放了連接

時,信號量就加一。采用這種方法就可以簡單有效地控制線程的同步問題,而且實現(xiàn)起來也

特別方便??聪旅娴拇a:

classSemaphore{

privateintcount;

publicSemaphore(intcount){

this.count=count;

}

publicsynchronizedvoidacquire(){

while(count==0){

trycatch(InterruptedExceptione){

//keeptrying

}

count—;

}

publicsynchronizedvoidrelease(){

count++;

notify();//alertathreadthat'sblockingonthissemaphore

}

)

java中提供了哪些api以編寫多線程程序

這里只列出幾個常用的方法和屬性值。

屬性值,有三個MAX_PRIORITY,MINPRIORITY,NORMPRIORITY

方法:

Thread。;〃建立一個線程

voidrun();〃對于--個繼承了Runnable接口的class而言,

〃他運行一個線程,否著他什么都不做

voidsctPriority(intnewPriority);//設(shè)置優(yōu)先級

voidstart。;//運行一個程序

voidsleep(longmillis);〃線程睡眠millis毫秒

staticvoidyield。;//臨時pause一個程序以便起他線程運行

:程序示例

例一、

讓我們看看下面的例子。取錢的流程是輸入密碼,然后確定要取得金額,如果所取的金

額小于或等于可以取出的金額,WITHDRAW則返回TRUE,然后ATM機出錢,然后打印

清單;否則返回FALSE,然后打印清單。如下圖:

publicclassAutomatedTellerMachineextendsTeller{

publicvoidwithdraw(floatamount){

Accounta=getAccount();

if(a.deduct(amount))

dispense(amount);

printReceipt();

)

publicclassAccount{

privatefloattotal;

publicbooleandeduct(floatt){

if(t<=total){

total-=t;

returntrue;

)

returnfalse;

)

}

就這個例子而言,假設(shè)有這種情況,對同一個賬號可以在不同的地方取錢,在同一時間,

不同地點,妻子和丈夫取錢,妻子輸入了賬號上的最大金額,丈夫也是一樣,假如妻子輸入

后已經(jīng)得到true的返回值,但是丈夫的線程所得到的值還沒有更新,這樣丈夫也能夠得到

true的返回值,這樣就出現(xiàn)了問題!這個問題怎么解決呢?在java里面提供了控制機制以保

證deduct操作時的原子性,那就是關(guān)鍵字synchronizedo

在Account的deduct方法加入synchronized就可以解決這個問題。

例二、

在這里我們用多線程中最典型的例子,生產(chǎn)者與消費者問題。在這個例子里面我們定義

了生產(chǎn)者Producer,消費者Consumer和倉庫Warehouse?:個類,在整個程序的生命周期里,

生產(chǎn)者隨機地制造出產(chǎn)品放到倉庫中,消費者也是隨即地從倉庫中取出產(chǎn)品。

importexception.ProducerConsumerException;

*Consumer.java

*Consumer

*By:Jiabo

*Date:Mar21,2004

*Time:2:47:58PM

*/

publicclassConsumerextendsThread{

privateWarehousewarehouse;

privateStringid;

publicConsumer(Warehousewarehouse,Stringid){

this.warehouse=warehouse;

this.id=id;

}

publicvoidrun(){

inttmp=(int)Math.random()*10;

try(

warehouse.get(tmp);

System.out.println(nConsumer#"+this.id+”get"+tmp);

}catch(ProducerConsumerExceptione)

try(

sleep((int)(Math.random()*100));

}catch(InterruptedExceptione)

)

}

在這個類中,值得注意的?點是run方法中必須使用try-catch,因為,消費者從倉庫中

取東西時有可能諸如倉庫中的儲量不夠得異常,在消費者里面也是一樣,只不過異常變?yōu)閭}

庫已滿。

importexception.*;

/**

*Producer.]ava

*Producer

*By:Jiabo

*Date:Mar21,2004

*Time:2:47:45PM

*/

publicclassProducerextendsThread{

privateWarehousewarehouse;

privateStringid;

publicProducer(Warehousewarehouse,Stringid){

this.warehouse=warehouse;

this.id=id;

}

publicvoidrun(){

inttmp=(int)Math.random()*10;

if(tmp!=0){

try{

warehouse.put(tmp);

System.out.println(,,Consumer#"+this.id+“put"+tmp);

}catch(ProducerConsumerExceptione)

)

try{

sleep((int)(Math.random()*100));

}catch(InterruptedExceptione)

最重要的一部分在Warehouse類,如上所說為了保證get何set的原子性,在這里使用了synchronized關(guān)鍵字,

并且在操作時拋出了可能跑出的異常。

5)你用過哪種設(shè)計模式?(瞬聯(lián),舊M,aspenTech)

MVC模式,靜態(tài)工廠模式,適配器模式,門面模式,DAO模式,單例模式,Template模式.

command模式

在網(wǎng)上看見了這篇文章,作者以輕松的語言比喻了java的23種模式,有很好的啟發(fā)作用。

創(chuàng)建型模式

1、FACTORY—追MM少不了請吃飯了,麥當勞的雞翅和肯德基的雞翅都是MM愛吃的東

西,雖然口味有所不同,但不管你帶MM去麥當勞或肯德基,只管向服務(wù)員說“來四個雞翅”就

行了。麥當勞和肯德基就是生產(chǎn)雞翅的Factory

工廠模式:客戶類和工廠類分開。消費者任何時候需要某種產(chǎn)品,只需向工廠請求即可。消

費者無須修改就可以接納新產(chǎn)品。缺點是當產(chǎn)品修改時,工廠類也要做相應的修改。如:如何創(chuàng)

建及如何向客戶端提供。

2、BUILDER—MM最愛聽的就是“我愛你”這句話了,見到不同地方的MM,要能夠用她們

的方言跟她說這句話哦,我有一個多種語言翻譯機,上面每種語言都有一個按鍵,見到MM我

只要按對應的鍵,它就能夠用相應的語言說出“我愛你”這句話了,國外的MM也可以輕松搞掂,

這就是我的“我愛你"builder,(這一定比美軍在伊拉克用的翻譯機好賣)

建造模式:將產(chǎn)品的內(nèi)部表象和產(chǎn)品的生成過程分割開來,從而使一個建造過程生成具有不

同的內(nèi)部表象的產(chǎn)品對象。建造模式使得產(chǎn)品內(nèi)部表象可以獨立的變化,客戶不必知道產(chǎn)品內(nèi)部

組成的細節(jié)。建造模式可以強制實行一種分步驟進行的建造過程。

3、FACTORYMETHOD—請MM去麥當勞吃漢堡,不同的MM有不同的口味,要每個都

記住是一件煩人的事情,我一般采用FactoryMethod模式,帶著MM到服務(wù)員那兒,說“要?

個漢堡”,具體要什么樣的漢堡呢,讓MM直接跟服務(wù)員說就行了。

工廠方法模式:核心工廠類不再負責所有產(chǎn)品的創(chuàng)建,而是將具體創(chuàng)建的工作交給子類去做,

成為一個抽象工廠角色,僅負責給出具體工廠類必須實現(xiàn)的接口,而不接觸哪一個產(chǎn)品類應當被

實例化這種細節(jié)。

4、PROTOTYPE一跟MM用QQ聊天,一定要說些深情的話語了,我搜集了好多肉麻的情

話,需要時只要copy出來放到QQ里面就行了,這就是我的情話prototype了。(100塊錢-

份,你要不要)

原始模型模式:通過給出一個原型對象來指明所要創(chuàng)建的對象的類型,然后用復制這個原型

對象的方法創(chuàng)建出更多同類型的對象。原始模型模式允許動態(tài)的增加或減少產(chǎn)品類,產(chǎn)品類不需

要非得有任何事先確定的等級結(jié)構(gòu),原始模型模式適用于任何的等級結(jié)構(gòu)。缺點是每一個類都必

須配備一個克隆方法。

5、SINGLETON—俺有6個漂亮的老婆,她們的老公都是我,我就是我們家里的老公

Sigleton,她們只要說道“老公”,都是指的同一個人,那就是我(剛才做了個夢啦,哪有這么好

的事)

單例模式:單例模式確保某一個類只有一個實例,而且自行實例化并向整個系統(tǒng)提供這個實

例單例模式。單例模式只應在有真正的“單一實例”的需求時才可使用。

結(jié)構(gòu)型模式

6、ADAPTER—在朋友聚會上碰到了一個美女Sarah,從香港來的,可我不會說粵語,她

不會說普通話,只好求助于我的朋友kent了,他作為我和Sarah之間的Adapter,讓我和Sarah

可以相互交談了(也不知道他會不會耍我)

適配器(變木器)模式:把一個類的接口變換成客戶端所期待的另一種接口,從而使原本因

接口原因不匹配而無法一起工作的兩個類能夠一起工作。適配類可以根據(jù)參數(shù)返還一個合適的實

例給客戶端。

7、BRIDGE—早上碰到MM,要說早上好,晚上碰到MM,要說晚上好;碰到MM穿了件

新衣服,要說你的衣服好漂亮哦,碰到MM新做的發(fā)型,要說你的頭發(fā)好漂亮哦。不要問我“早

上碰到MM新做了個發(fā)型怎么說”這種問題,自己用BRIDGE組合一下不就行了

橋梁模式:將抽象化與實現(xiàn)化脫耦,使得二者可以獨立的變化,也就是說將他們之間的強關(guān)

聯(lián)變成弱關(guān)聯(lián),也就是指在一個軟件系統(tǒng)的抽象化和實現(xiàn)化之間使用組合/聚合關(guān)系而不是繼承

關(guān)系,從而使兩者可以獨立的變化。

8、COMPOSITE—Mary今天過生日?!拔疫^生日,你要送我?件禮物。”“嗯,好吧,去商

店,你自己挑?!薄斑@件T恤挺漂亮,買,這條裙子好看,買,這個包也不錯,買?!薄拔?,買了三

件了呀,我只答應送一件禮物的哦?!薄笆裁囱?,T恤加裙子加包包,正好配成一套呀,小姐,麻

煩你包起來。":',MM都會用Composite模式了,你會了沒有?

合成模式:合成模式將對象組織到樹結(jié)構(gòu)中,可以用來描述整體與部分的關(guān)系。合成模式就

是一個處理對象的樹結(jié)構(gòu)的模式。合成模式把部分與整體的關(guān)系用樹結(jié)構(gòu)表示出來。合成模式使

得客戶端把一個個單獨的成分對象和由他們復合而成的合成對象同等看待。

9、DECORATOR—Mary過完輪到Sarly過生日,還是不要叫她自己挑了,不然這個月伙

食費肯定玩完,拿出我去年在華山頂上照的照片,在背面寫上“最好的的禮物,就是愛你的Fita",

再到街上禮品店買了個像框(賣禮品的MM也很漂亮哦),再找隔壁搞美術(shù)設(shè)計的Mike設(shè)計了

一個漂亮的盒子裝起來……,我們都是Decorator,最終都在修飾我這個人呀,怎么樣,看懂了

嗎?

裝飾模式:裝飾模式以對客戶端透明的方式擴展對象的功能,是繼承關(guān)系的一個替代方案,

提供比繼承更多的靈活性。動態(tài)給一個對象增加功能,這些功能可以再動態(tài)的撤消。增加由一些

基本功能的排列組合而產(chǎn)生的非常大量的功能。

10、FACADE—我有一個專業(yè)的Nikon相機,我就喜歡自己手動調(diào)光圈、快門,這樣照出

來的照片才專業(yè),但MM可不懂這些,教了半天也不會。幸好相機有Facade設(shè)計模式,把相

機調(diào)整到自動檔,只要對準目標按快門就行了,一切由相機自動調(diào)整,這樣MM也可以用這個

相機給我拍張照片了。

門面模式:外部與一個子系統(tǒng)的通信必須通過一個統(tǒng)一的門面對象進行。門面模式提供一個

高層次的接口,使得子系統(tǒng)更易于使用。每一個子系統(tǒng)只有一個門面類,而且此門面類只有一個

實例,也就是說它是個單例模式。但整個系統(tǒng)可以有多個門面類。

11、FLYW日GHJ每天跟MM發(fā)短信,手指都累死了,最近買了個新手機,可以把一些

常用的句子存在手機里,要用的時候,直接拿出來,在前面加上MM的名字就可以發(fā)送了,冉

不用一個字一個字敲了。共享的句子就是Flyweight,MM的名字就是提取出來的外部特征,根

據(jù)上下文情況使用。

享元模式:FLYW曰GHT在拳擊比賽中指最輕量級。享元模式以共享的方式高效的支持大

量的細粒度對象。享元模式能做到共享的關(guān)鍵是區(qū)分內(nèi)蘊狀態(tài)和外蘊狀態(tài)。內(nèi)蘊狀態(tài)存儲在享元

內(nèi)部,不會隨環(huán)境的改變而有所不同。外蘊狀態(tài)是隨環(huán)境的改變而改變的。外蘊狀態(tài)不能影響內(nèi)

蘊狀態(tài),它們是相互獨立的。將可以共享的狀態(tài)和不可以共享的狀態(tài)從常規(guī)類中區(qū)分開來,將不

可以共享的狀態(tài)從類里剔除出去。客戶端不可以直接創(chuàng)建被共享的對象,而應當使用一個工廠對

象負責創(chuàng)建被共享的對象。享元模式大幅度的降低內(nèi)存中對象的數(shù)量。

6)請說一下MVC架構(gòu)(瞬聯(lián),IBM,aspenTech)

MVC指的是Model,View,Controller嘀罩來-Model是負責資料眉,:ft責輿資料需1接:View

是負責資料的呈垣方式,可以是^真,統(tǒng)吉十1園等;Controller是^^系統(tǒng)的流程及決定如何呈現(xiàn)

資料

1解釋■/article/52/52575.shtm

模型一視圖一控制器(MVC)是XeroxPARC在八十年代為編程語言Smalltalk-80發(fā)明的一種軟件

設(shè)計模式,至今已被廣泛使用。最近幾年被推薦為Sun公司J2EE平臺的設(shè)計模式,并且受到越來越多的

使用ColdFusion和PHP的開發(fā)者的歡迎。模型一視圖一控制器模式是一個有用的工具箱,它有很多好

處,但也有一些缺點。

MVC如何工作

MVC是一個設(shè)計模式,它強制性的使應用程序的輸入、處理和輸出分開。使用MVC應用程序被分成:個

核心部件:模型、視圖、控制器.它們各自處理自己的任務(wù)。

視圖

視圖是用戶看到并與之交互的界面。對老式的Web應用程序來說,視圖就是由HTML元素組成的界面,

在新式的Web應用程序中,HTML依舊在視圖中扮演著重要的角色,但?些新的技術(shù)已層出不窮,它們

包括MacromediaFlash和象XHTML,XML/XSL,WML等一些標識語言和Webservices.

如何處理應用程序的界面變得越來越有挑戰(zhàn)性。MVC一個大的好處是它能為你的應用程序處理很多不同的

視圖。在視圖中其實沒有真正的處理發(fā)生,不管這些數(shù)據(jù)是聯(lián)機存儲的還是一個雇員列表,作為視圖來講,

它只是作為一種輸出數(shù)據(jù)并允許用戶操縱的方式。

模型

模型表示企業(yè)數(shù)據(jù)和業(yè)務(wù)規(guī)則。在MVC的三個部件中,模型擁有最多的處理任務(wù)。例如它可能用象EJBs

和ColdFusionComponents這樣的構(gòu)件對象來處理數(shù)據(jù)庫。被模型返回的數(shù)據(jù)是中立的,就是說模型

與數(shù)據(jù)格式無關(guān),這樣一個模型能為多個視圖提供數(shù)據(jù)。由于應用于模型的代碼只需寫一次就可以被多個

視圖重用,所以減少了代碼的重復性。

控制器

控制器接受用戶的輸入并調(diào)用模型和視圖去完成用戶的需求。所以當單擊Web頁面中的超鏈接和發(fā)送

HTML表單時,控制器本身不輸出任何東西和做任何處理。它只是接收請求并決定調(diào)用哪個模型構(gòu)件去處

理請求,然后用確定用哪個視圖來顯示模型處理返回的數(shù)據(jù)。

現(xiàn)在我們總結(jié)MVC的處理過程,首先控制器接收用戶的請求,并決定應該調(diào)用哪個模型來進行處理,然后

模型用業(yè)務(wù)邏輯來處理用戶的請求并返回數(shù)據(jù),最后控制器用相應的視圖格式化模型返回的數(shù)據(jù),并通過

表示層呈現(xiàn)給用戶。

為什么要使用MVC

大部分Web應用程序都是用像ASP,PHP,或者CFML這樣的過程化語言來創(chuàng)建的。它們將像數(shù)據(jù)庫查

詢語句這樣的數(shù)據(jù)層代碼和像HTML這樣的表示層代碼混在一起。經(jīng)驗比較豐富的開發(fā)者會將數(shù)據(jù)從表示

層分離開來,但這通常不是很容易做到的,它需要精心的計劃和不斷的嘗試。MVC從根本上強制性的將它

們分開.盡管構(gòu)造MVC應用程序需要一些額外的工作,但是它給我們帶來的好處是無庸質(zhì)疑的。

首先,最重要的一點是多個視圖能共享一個模型,正如我所提及的,現(xiàn)在需要用越來越多的方式來訪問你

的應用程序。對此,其中一個解決之道是使用MVC,無論你的用戶想要Flash界面或是WAP界面;用

?個模型就能處理它們。由于你已經(jīng)將數(shù)據(jù)和業(yè)務(wù)規(guī)則從表示層分開,所以你可以最大化的重用你的代碼

了。

由于模型返回的數(shù)據(jù)沒有進行格式化,所以同樣的構(gòu)件能被不同界面使用。例如,很多數(shù)據(jù)可能用HTML

來表示,但是它們也有可能要用MacromediaFlash和WAP來表示。模型也有狀態(tài)管理和數(shù)據(jù)持久性處

理的功能,例如,基于會話的購物車和電子商務(wù)過程也能被Flash網(wǎng)站或者無線聯(lián)網(wǎng)的應用程序所重用。

因為模型是自包含的,并且與控制器和視圖相分離,所以很容易改變你的應用程序的數(shù)據(jù)層和業(yè)務(wù)規(guī)則。

如果你想把你的數(shù)據(jù)庫從MySQL移植到Oracle,或者改變你的基于RDBMS數(shù)據(jù)源到LDAP,只需改變

你的模型即可。一旦你正確的實現(xiàn)了模型,不管你的數(shù)據(jù)來自數(shù)據(jù)庫或是LDAP服務(wù)器,視圖將會正確的

顯示它們。由于運用MVC的應用程序的三個部件是相互對立,改變其中一個不會影響其它兩個,所以依

據(jù)這種設(shè)計思想你能構(gòu)造良好的松偶合的構(gòu)件

對我來說,控制器的也提供了一個好處,就是可以使用控制器來聯(lián)接不同的模型和視圖去完成用戶的需求,

這樣控制器可以為構(gòu)造應用程序提供強有力的手段。給定一些可重用的模型和視圖,控制器可以根據(jù)用戶

的需求選擇模型進行處理,然后選擇視圖將處理結(jié)果顯示給用戶。

MVC的缺點

MVC的缺點是由于它沒有明確的定義,所以完全理解MVC并不是很容易。使用MVC需要精心的計劃,

由于它的內(nèi)部原理比較復雜,所以需要花費?些時間去思考。

你將不得不花費相當可觀的時間去考慮如何將MVC運用到你的應用程序,同時由于模型和視圖要嚴格的

分離,這樣也給調(diào)試應用程序到來了一定的困難。每個構(gòu)件在使用之前都需要經(jīng)過徹底的測試。一旦你的

構(gòu)件經(jīng)過了測試,你就可以毫無顧忌的重用它們了。

根據(jù)我個人經(jīng)驗,由于我們將?個應用程序分成了三個部件,所以使用MVC同時也意味著你將要管理比

以前更多的文件,這一點是顯而易見的。這樣好像我們的工作量增加了,但是請記住這比起它所能帶給我

們的好處是不值?提。

MVC并不適介小吧其至中等規(guī)模的應用程序,花費大量時間將MVC應用到規(guī)模并不是很大的應用程序通

常會得不償失。

MVC是一條創(chuàng)建軟件的好途徑

MVC設(shè)計模式是?個很好創(chuàng)建軟件的途徑,它所提倡的?些原則,像內(nèi)容和顯示互相分離可能比較好理解。

但是如果你要隔離模型、視圖和控制器的構(gòu)件,你可能需要重新思考你的應用程序,尤其是應用程序的構(gòu)

架方面。如果你肯接受MVC,并且有能力應付它所帶來的額外的工作和復雜性,MVC將會使你的軟件在

健壯性,代碼重用和結(jié)構(gòu)方面上一個新的臺階。

2解釋二http://www.ask321.com/ask8/ask151598.htm

Model-View-Controller

a.問題

如果開發(fā)?個企業(yè)級應用,只需要?種客戶端的話,那么?切都非常容易解決。但真實情況是,我們必須

面對運行在各種設(shè)備上客戶端,象PDA,WAP瀏覽器以及運行在桌面上的瀏覽器,我們不得不開發(fā)不同

的應用程序來處理來自不同客戶端的請求。數(shù)據(jù)訪問與現(xiàn)實將混淆在?起,可能會出現(xiàn)重復的數(shù)據(jù)訪問,

導致整個開發(fā)周期沒有必要的延長。

b.建議的解決方法

Model-View-Controller(MVC)開發(fā)模式被證明是有效的處理方法之-?它可以分離數(shù)據(jù)訪問和數(shù)據(jù)表

現(xiàn)。你可以開發(fā)一個有伸縮性的,便于擴展的控制器,來維護整個流程。如圖1所示為整個模式的結(jié)構(gòu)。

MVC模式可以被映射到多層企業(yè)級的J2EE應用上。

§所有的企業(yè)數(shù)據(jù)以及商業(yè)邏輯可以作為模式。

§視圖可以通過模式訪問數(shù)據(jù),并根據(jù)客戶端的要求來技示數(shù)據(jù)。視圖必須保證當模式改變的時候,

數(shù)據(jù)顯示也必須同時改變。

§控制器用來結(jié)合模式和視圖,把客戶端來的請求轉(zhuǎn)換成模式能夠理解并執(zhí)行的請求,并且根據(jù)請

求以及執(zhí)行結(jié)果來決定下?次顯示那?個視圖。

根據(jù)以上的邏輯,你可以象這樣建立個應用:

§應用的商業(yè)邏輯由MVC中的模式也就是EJB來表現(xiàn)。模式必須處理由控制器傳遞過來的對數(shù)據(jù)

的訪問請求。

§多個頁面組成了MVC中的視圖,這些視圖必須隨模式一起更新。

§控制器是一系列接收用戶動作的對象,他們把用戶的請求轉(zhuǎn)換成模式可理解的請求,并決定顯示

那個頁面當模式處理完請求后。

圖1

c.要點

§MVC結(jié)構(gòu)適用于那些多用戶的,可擴展的,可維護的,具有很高交互性的系統(tǒng)。

§MVC可以很好的表達用戶的交互和系統(tǒng)模式。

§很方便的用多個視圖來顯示多套數(shù)據(jù),是系統(tǒng)很方便的支持其他新的客戶端類型。

§代碼重復達到最低。

§由于分離了模式中的流控制和數(shù)據(jù)表現(xiàn),可以分清開發(fā)者的責任,另外,也可以加快產(chǎn)品推向市

場的時間

3解釋三/bbsjhZ14/1135.html

[轉(zhuǎn)帖]了解MVC架構(gòu)對于用Struts構(gòu)建的強大的Web應用程序很重要

作者:cine發(fā)表時間:2002/12/0308:48am

了解MVC架構(gòu)對于用Struts構(gòu)建的強大的Web應用程序很重要

Struts是雅加達的,個項目,它提供了一個方法,可以在?,個Web應用程序中一起使用JavaServer

Pages(JSP)和servlets。它的目的是要解決完全由JSP或完全由servlet實現(xiàn)的應用程序中的固有的

題。例如,servelts可以生成HTML頁面,但這么做很麻煩。另一方面,JSP可以很容易地用于傳統(tǒng)的

HTML頁面,但JSP頁面有其它的缺點。特別是,用JSP很難將內(nèi)容同內(nèi)容的顯示分開。很容易將Java

碼同HTML混在一起,結(jié)果做出的東西又慢乂難以維護。

然而,因為JSP頁面容易使用,所以它們成為用Java構(gòu)建動態(tài)的Web應用程序的首選方法。除了容易編

外,JSP頁面也被改進了,所以現(xiàn)在它們克服了以前的某些局限性。JavaBeans和標記庫只是在基礎(chǔ)的

JSP技術(shù)上的幾個改進。這種類型的方法一JSP頁面單獨負責處理輸入的請求和回復客戶端一被稱為

Model1架構(gòu)。

JavaServerPages是servlets的特殊情況,所以兩者可以「?起工作以彌補每個的不足,這似乎是合乎邏

輯的。這種類型的方法一你的Web架構(gòu)包含截然不同的但又互聯(lián)的處理數(shù)據(jù)模式、顯示代碼和程序控

制邏輯的JSP和servlet組件——被稱為Model2架構(gòu),或Model-View-Controller(MVC)架構(gòu)。

為了使用Struts架構(gòu)以及用JSP和servlets有效地編程,對MVC架構(gòu)的了解是很必要的。Model1和

MVC架

構(gòu)的主要不同就是請求是在哪里處理的。在Model1架構(gòu)中,請求通過JSP接收,主要通過JSP處理。

果JSP頁面需要來自任何其它應用程序組件的服務(wù),如一個數(shù)據(jù)庫,那么你就從頁面做適當?shù)恼{(diào)用,把

數(shù)據(jù)返回到頁面,安排數(shù)據(jù)的格式并顯示出來。你可以把一些代碼放到一個或多個JavaBean中,但是這

么做本身沒有將邏輯同顯示完全分離。

MVC方法采用了JSP和servlet方法的最佳特性,使這兩種技術(shù)可以協(xié)同工作。明確的是,servlet是處

層(控制器)。Servlet接收請求,很像Model1架構(gòu)中JSP頁面所做的那樣,并確定如何滿足那些請

求。這就意味著,servlet控制輸入的請求和輸出的回應。

商業(yè)邏輯體現(xiàn)了MVC架構(gòu)中的模式。商業(yè)邏輯代碼為頁面做處理。如果進入servlet的請求是一個數(shù)據(jù)庫

查詢,servlet就將這個請求傳送到個SQL調(diào)用或類似的數(shù)據(jù)庫代碼。如果請求是一個包括輸入信用卡

號的購買請求,那么事物處理代碼就接管了。在某種意義上,架構(gòu)的模式部分是讓應用程序處于領(lǐng)先地

位的全部原因。

JSP頁面是顯示層(視圖),是用戶與應用程序交互的地方。它提供輸入并顯示結(jié)果。頁面不應該包括

任何腳本。它只是將數(shù)據(jù)傳送到servlet,并接收和顯示返回的數(shù)據(jù)。

該架構(gòu)的優(yōu)勢應該是很明顯的。首先,它將計算和顯示清楚地分開了。結(jié)果很理想,在JSP頁面上沒有

出現(xiàn)處理過程,在servlet或商業(yè)邏輯中沒有數(shù)據(jù)格式。這種分離的另?個好處是Java程序員可以專注

于servlet代碼,HTML編寫者可以專注于JSP。第二點,控制器servlet做頁面上的所有的決定。在

的頁面和邏輯中不會出現(xiàn)任何決策。這就提高了一個應用程序的性能和可擴展性,因為請求可以被導向

架構(gòu)的不同的組件,甚至是不同的服務(wù)器。

運用MVC架構(gòu)

MVC架構(gòu)沒有必要成為用于所有Java應用程序的最佳方法。如你想象的那樣,它在準備和編碼時往往

復雜一這對簡單的應用程序來說是沒必要的。當頁面導航相對來說比較簡單和固定,而且應用程序中

的頁面結(jié)構(gòu)可以由一個簡單的目錄結(jié)構(gòu)管理時,Model1架構(gòu)仍然是最好的方法。這些應用程序往往將

頁面流動信息嵌入到頁面間的鏈接中。(JSP中出現(xiàn)forward。就告訴你,在該頁中有嵌入的邏輯,讓你

對顯示下一頁作出決定。)對于對流量或可擴展性需求有限的靜態(tài)的應用程序來說,標準的JSP模式仍

然是一個可行的選擇方案。

在一些情況下,你可能想把一個JSP應用程序移植到MVC架構(gòu)中。例如,你可能開始時用的是Model1,

簡單的JSP架構(gòu),隨著你的需求的增加,你會發(fā)現(xiàn)維護起來太復雜或太難了。如果你花很長的時間對應

用程序做相對來說較簡單的修改,或者如果你經(jīng)常在你的代碼中發(fā)現(xiàn)bug,那么你的JSP導向的應用程序

也許就不再是合適的方法了。

隨著應用程序的發(fā)展和變化,頁面的流動和商業(yè)邏輯也增加了。應用程序變得難以維護,因為頁面流動

邏輯跨多個頁面分布,而且商業(yè)邏輯可能開始存在于未計劃的地方。從Model1轉(zhuǎn)到MVC的最佳時機就

當這些類型的維護問題出現(xiàn)的時候。

你也可以預先計劃將你的應用程序從一個架構(gòu)移植到另一個架構(gòu)。當你的應用程序中的JSP頁面包含腳

本元素,定制標記或JavaScript來執(zhí)行?個forward。操作時,你可能想調(diào)整你最初的設(shè)計,變成一種

用MVC架構(gòu)的設(shè)計。

Refactoring用在這兒是個不錯的術(shù)語。它指的是以一種高度嚴謹?shù)姆绞街亟ùa結(jié)構(gòu)的一種技術(shù)。當

你的代碼變得難以理解、修改和調(diào)試時,你通常就開始考慮調(diào)整了。你可以用兒種方式來調(diào)整代碼:你

可以簡單地重新命名變量和方法,或者將部分代碼移植到不同類型的執(zhí)行模式中。更多的關(guān)于調(diào)整及其

技術(shù)方面的信息,請訪問MartinFowler的網(wǎng)站或者閱讀他寫的書

Refactoring:ImprovingtheDesignofExistingCode。

在許多情況下,一開始就選擇MVC架構(gòu)是很有意義的,例如你的應用程序是為廣泛的企業(yè)應用而設(shè)計

的,或者在幾年內(nèi),你的應用程序可能擴展到一個相當高的流量。設(shè)計一個MVC架構(gòu)需要有深謀遠慮。

大多數(shù)程序員發(fā)現(xiàn)寫邏輯腳本或JavaBeans,以及用HTML顯示很容易。當你設(shè)計一個MVC架構(gòu)時,你

必須

首先進行一個完整的設(shè)計。這就意味著,分析需要處理的請求的類型,確定哪些組件(JavaBean.數(shù)據(jù)

庫或其它servlets)將處理這些請求,以及對那些請求的回應是如何顯示給用戶的。該設(shè)計的關(guān)鍵就

是請求和數(shù)據(jù)的流動性。為MVC架構(gòu)設(shè)計應用程序組件只是對你現(xiàn)在用JSP和servlets所做工作的擴

展。

面臨的挑戰(zhàn)就是構(gòu)建一個servlet,它接收請求并把那些請求分到應用程序的不同的組件。將一個數(shù)據(jù)

庫請求傳送到?個數(shù)據(jù)庫,或?qū)?個處理請求傳送到個JavaBean是很容易的,但是如果?個請求包含

這兩種元素,會怎樣呢?或者如果請求的性質(zhì)在一些處理出現(xiàn)前不能確定,又怎樣呢?

Struts構(gòu)架

該挑戰(zhàn)使我們乂回到Struts構(gòu)架。Struts提供了?個實現(xiàn)MVC架構(gòu)的高度自動化的方式。它的結(jié)構(gòu)實現(xiàn)

了MVC,并包括一個控制器servlet、一組JSP頁面和應用程序的商業(yè)邏輯??刂破鲗⒂脩粽埱蟠虬?,并

把它們導向架構(gòu)中的其他對象。

Struts構(gòu)架是圍繞?個ActionMapping結(jié)構(gòu)的??刂破饔肁ctionMapping把HTTP消息形式的用戶

請求

轉(zhuǎn)換成應用程序的動作。ActionMapping指定請求的路徑、計劃處理請求的對象以及任何服務(wù)該請求需

要的其它信息。ActionMa

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論