|
Posted on 2005-11-28 15:24 勇敢的心 閱讀(240) 評論(0) 編輯 收藏 所屬分類: Java
91、 應用服務器與WEB SERVER的區(qū)別? 通俗的講,Web服務器傳送(serves)頁面使瀏覽器可以瀏覽,然而應用程序服務器提供的是客戶端應用程序可以調(diào)用(call)的方法(methods)。確切一點,你可以說:Web服務器專門處理HTTP請求(request),但是應用程序服務器是通過很多協(xié)議來為應用程序提供(serves)商業(yè)邏輯(business logic)。
92、BS與CS的聯(lián)系與區(qū)別。 C/S是Client/Server的縮寫。服務器通常采用高性能的PC、工作站或小型機,并采用大型數(shù)據(jù)庫系統(tǒng),如Oracle、Sybase、Informix或 SQL Server。客戶端需要安裝專用的客戶端軟件。 B/S是Brower/Server的縮寫,客戶機上只要安裝一個瀏覽器(Browser),如Netscape Navigator或Internet Explorer,服務器安裝Oracle、Sybase、Informix或 SQL Server等數(shù)據(jù)庫。在這種結構下,用戶界面完全通過WWW瀏覽器實現(xiàn),一部分事務邏輯在前端實現(xiàn),但是主要事務邏輯在服務器端實現(xiàn)。瀏覽器通過Web Server 同數(shù)據(jù)庫進行數(shù)據(jù)交互。 C/S 與 B/S 區(qū)別: 1.硬件環(huán)境不同: C/S 一般建立在專用的網(wǎng)絡上, 小范圍里的網(wǎng)絡環(huán)境, 局域網(wǎng)之間再通過專門服務器提供連接和數(shù)據(jù)交換服務. B/S 建立在廣域網(wǎng)之上的, 不必是專門的網(wǎng)絡硬件環(huán)境,例與電話上網(wǎng), 租用設備. 信息自己管理. 有比C/S更強的適應范圍, 一般只要有操作系統(tǒng)和瀏覽器就行 2.對安全要求不同 C/S 一般面向相對固定的用戶群, 對信息安全的控制能力很強. 一般高度機密的信息系統(tǒng)采用C/S 結構適宜. 可以通過B/S發(fā)布部分可公開信息. B/S 建立在廣域網(wǎng)之上, 對安全的控制能力相對弱, 可能面向不可知的用戶。 3.對程序架構不同 C/S 程序可以更加注重流程, 可以對權限多層次校驗, 對系統(tǒng)運行速度可以較少考慮. B/S 對安全以及訪問速度的多重的考慮, 建立在需要更加優(yōu)化的基礎之上. 比C/S有更高的要求 B/S結構的程序架構是發(fā)展的趨勢, 從MS的.Net系列的BizTalk 2000 Exchange 2000等, 全面支持網(wǎng)絡的構件搭建的系統(tǒng). SUN 和IBM推的JavaBean 構件技術等,使 B/S更加成熟. 4.軟件重用不同 C/S 程序可以不可避免的整體性考慮, 構件的重用性不如在B/S要求下的構件的重用性好. B/S 對的多重結構,要求構件相對獨立的功能. 能夠相對較好的重用.就入買來的餐桌可以再利用,而不是做在墻上的石頭桌子 5.系統(tǒng)維護不同 C/S 程序由于整體性, 必須整體考察, 處理出現(xiàn)的問題以及系統(tǒng)升級. 升級難. 可能是再做一個全新的系統(tǒng) B/S 構件組成,方面構件個別的更換,實現(xiàn)系統(tǒng)的無縫升級. 系統(tǒng)維護開銷減到最小.用戶從網(wǎng)上自己下載安裝就可以實現(xiàn)升級. 6.處理問題不同 C/S 程序可以處理用戶面固定, 并且在相同區(qū)域, 安全要求高需求, 與操作系統(tǒng)相關. 應該都是相同的系統(tǒng) B/S 建立在廣域網(wǎng)上, 面向不同的用戶群, 分散地域, 這是C/S無法作到的. 與操作系統(tǒng)平臺關系最小. 7.用戶接口不同 C/S 多是建立的Window平臺上,表現(xiàn)方法有限,對程序員普遍要求較高 B/S 建立在瀏覽器上, 有更加豐富和生動的表現(xiàn)方式與用戶交流. 并且大部分難度減低,減低開發(fā)成本. 8.信息流不同 C/S 程序一般是典型的中央集權的機械式處理, 交互性相對低 B/S 信息流向可變化, B-B B-C B-G等信息、流向的變化, 更像交易中心。
二、JAVA代碼查錯
1. abstract class Name { private String name; public abstract boolean isStupidName(String name) {} } 大俠們,這有何錯誤? 答案: 錯。abstract method必須以分號結尾,且不帶花括號。 2. public class Something { void doSomething () { private String s = ""; int l = s.length(); } } 有錯嗎? 答案: 錯。局部變量前不能放置任何訪問修飾符 (private,public,和protected)。final可以用來修飾局部變量 (final如同abstract和strictfp,都是非訪問修飾符,strictfp只能修飾class和method而非variable)。 3. abstract class Something { private abstract String doSomething (); } 這好像沒什么錯吧? 答案: 錯。abstract的methods不能以private修飾。abstract的methods就是讓子類implement(實現(xiàn))具體細節(jié)的,怎么可以用private把abstract method封鎖起來呢? (同理,abstract method前不能加final)。 4. public class Something { public int addOne(final int x) { return ++x; } } 這個比較明顯。 答案: 錯。int x被修飾成final,意味著x不能在addOne method中被修改。 5. public class Something { public static void main(String[] args) { Other o = new Other(); new Something().addOne(o); } public void addOne(final Other o) { o.i++; } } class Other { public int i; } 和上面的很相似,都是關于final的問題,這有錯嗎? 答案: 正確。在addOne method中,參數(shù)o被修飾成final。如果在addOne method里我們修改了o的reference (比如: o = new Other();),那么如同上例這題也是錯的。但這里修改的是o的member vairable (成員變量),而o的reference并沒有改變。 6. class Something { int i; public void doSomething() { System.out.println("i = " + i); } } 有什么錯呢? 看不出來啊。 答案: 正確。輸出的是"i = 0"。int i屬於instant variable (實例變量,或叫成員變量)。instant variable有default value。int的default value是0。 7. class Something { final int i; public void doSomething() { System.out.println("i = " + i); } } 和上面一題只有一個地方不同,就是多了一個final。這難道就錯了嗎? 答案: 錯。final int i是個final的instant variable (實例變量,或叫成員變量)。final的instant variable沒有default value,必須在constructor (構造器)結束之前被賦予一個明確的值。可以修改為"final int i = 0;"。 8. public class Something { public static void main(String[] args) { Something s = new Something(); System.out.println("s.doSomething() returns " + doSomething()); } public String doSomething() { return "Do something ..."; } } 看上去很完美。 答案: 錯。看上去在main里call doSomething沒有什么問題,畢竟兩個methods都在同一個class里。但仔細看,main是static的。static method不能直接call non-static methods。可改成"System.out.println("s.doSomething() returns " + s.doSomething());"。同理,static method不能訪問non-static instant variable。 9. 此處,Something類的文件名叫OtherThing.java class Something { private static void main(String[] something_to_do) { System.out.println("Do something ..."); } } 這個好像很明顯。 答案: 正確。從來沒有人說過Java的Class名字必須和其文件名相同。但public class的名字必須和文件名相同。 10. interface A{ int x = 0; } class B{ int x =1; } class C extends B implements A { public void pX(){ System.out.println(x); } public static void main(String[] args) { new C().pX(); } } 答案:錯誤。在編譯時會發(fā)生錯誤(錯誤描述不同的JVM有不同的信息,意思就是未明確的x調(diào)用,兩個x都匹配(就象在同時import java.util和java.sql兩個包時直接聲明Date一樣)。對于父類的變量,可以用super.x來明確,而接口的屬性默認隱含為 public static final.所以可以通過A.x來明確。 11. interface Playable { void play(); } interface Bounceable { void play(); } interface Rollable extends Playable, Bounceable { Ball ball = new Ball("PingPang"); } class Ball implements Rollable { private String name; public String getName() { return name; } public Ball(String name) { this.name = name; } public void play() { ball = new Ball("Football"); System.out.println(ball.getName()); } } 這個錯誤不容易發(fā)現(xiàn)。 答案: 錯。"interface Rollable extends Playable, Bounceable"沒有問題。interface可繼承多個interfaces,所以這里沒錯。問題出在interface Rollable里的"Ball ball = new Ball("PingPang");"。任何在interface里聲明的interface variable (接口變量,也可稱成員變量),默認為public static final。也就是說"Ball ball = new Ball("PingPang");"實際上是"public static final Ball ball = new Ball("PingPang");"。在Ball類的Play()方法中,"ball = new Ball("Football");"改變了ball的reference,而這里的ball來自Rollable interface,Rollable interface里的ball是public static final的,final的object是不能被改變reference的。因此編譯器將在"ball = new Ball("Football");"這里顯示有錯。
|