一荷逞、Java基礎(chǔ)
1.寫出下面代碼的執(zhí)行結(jié)果
public class Foo {
public static void main(String[] args) {
String strValue="ABCDEFG";
strValue.substring(3);
strValue.concat("123");
System.out.println("result=" + strValue);
String value = new String ("ABCDEFG");
System.out.println(strValue== value);
}
}
result=ABCDEFG
false
2.寫出下面代碼的執(zhí)行結(jié)果
public class Foo{ (分值5分)
public static void main(String args[]) {
int x = 100;
int y = 200;
if (x = y)
System.out.println("Not equal");
else
System.out.println("Equal");
}
}
編譯報錯if (true或false)x = y結(jié)果為int類型不兼容
3.寫出下面代碼的執(zhí)行結(jié)果 (此題需寫出分析過程,沒有分析過程不得分篮灼,分值10分)
public static void main(String args[]) {
try {
new TestAll().methodA(5);
} catch (IOException e) {
System.out.println("caught IOException");
} catch (Exception e) {
System.out.println("caught Exception");
}finally{
System.out.println("no Exception");
}
}
void methodA(int i) throws IOException {
if (i%2 != 0)
throw new IOException("methodA IOException");
}
caught IOException
no Exception
try{}
catch(){}
finally{}
try catch捕獲相應(yīng)的異常類型棚辽,finally始終會執(zhí)行
4.寫出下面代碼執(zhí)行的結(jié)果(此題需寫出分析過程兢孝,沒有分析過程不得分浇坐,分值10分)
static boolean isTrue() {
System.out.println("isTrue");
return true;
}
static boolean isFalse() {
System.out.println("isFalse");
return false;
}
public static void main(String[] args) {
if (isTrue() || isFalse()) {
System.out.println(" || operate return true");
}
if (isFalse() & isTrue()) {
System.out.println(" & operate return true");
}
}
isTrue
|| operate return true
isFalse
isTrue
||具有“短路功能”當左邊為真后 右邊不在執(zhí)行
5.寫出下面代碼執(zhí)行的結(jié)果(此題需寫出分析過程睬捶,沒有分析過程不得分)
class MyThread extends Thread{
public void run(){
try {
Thread.currentThread().sleep(3000);
} catch (InterruptedException e) {
}
System.out.println("MyThread running");
}
}
public class ThreadTest{
public static void main(String argv[]) {
MyThread t = new MyThread();
t.run();
t.start();
System.out.println("Thread Test");
}
}
MyThread running
Thread Test
MyThread running
t.run();調(diào)用 MyThread 的run()方法,當前線程為主線程main睡眠3s
t.start();啟動一個新的線程近刘,先的線程睡眠3s所以Thread Test會先打印
6.執(zhí)行B.main的結(jié)果是什么擒贸?(此題需寫出分析過程,沒有分析過程不得分觉渴,分值10分)
class A {
void fun1() {
System.out.println(this.fun2());
}
int fun2() {
return 123;
}
}
class B extends A {
int fun2() {
return 456;
}
public static void main(String argv[]) {
A a;
B b = new B();
b.fun1();
a = b;
a.fun1();
}
}
456
456
this調(diào)用的是當前對象介劫,a = b a指向new B();
7.執(zhí)行ListTest.main的結(jié)果是什么?(此題需寫出分析過程案淋,沒有分析過程不得分座韵,分值10分)
class Data {
int val;
int getVal() {
return val;
}
void setVal(int val) {
this.val = val;
}
}
public class ListTest {
public static void main(String argv[]) {
Data data = new Data();
ArrayList list = new ArrayList();
for (int i=100; i<103; i++) {
data.setVal(i);
list.add(data);
}
int j = 0;
while (j < list.size()) {
Data tmp = (Data )list.get(j);
System.out.println("list(" + j + ") = " + tmp.getVal());
j++;
}
}
}
list(0) = 102
list(1) = 102
list(2) = 102
for循環(huán)當中每次改變的都是同一個date對象中的值,應(yīng)該在for循環(huán)內(nèi)創(chuàng)建(new)對象
8.請指出以下代碼有哪些錯誤(分值15分)
1.
abstract class Name {
private String name;
// 抽象類中的抽象方法踢京,不應(yīng)該有方法體
public abstract boolean isStupidName(String name) {}
}
2.
public class Something {
void doSomething ()
{
private String s = ""; // 方法中的修飾符不能是private回右,這個只能在類中使用
int l = s.length();
}
}
3.
abstract class Something {
private abstract String doSomething ();// 抽象方法不應(yīng)該是private的,因為注定要被繼承, 如果是private漱挚,就繼承不了啦
}
4.
public class Something {
public int addOne(final int x) {
return ++x; // final 修飾的x,不能被修改
}
}
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;
}
6. 沒錯
class Something {
int i;
public void doSomething() {
System.out.println("i = " + i);
}
}
7.
class Something {
final int i; // final修飾的變量要被初始化
public void doSomething() {
System.out.println("i = " + i);
}
}
8.
public class Something {
public static void main(String[] args) {
Something s = new Something();
// 靜態(tài)方法main中調(diào)用doSomething, 但是doSomething不是static修飾的
System.out.println("s.doSomething() returns " + doSomething());
}
public String doSomething() {
return "Do something ...";
}
}
9. 寫法沒錯渺氧,但是和文件名稱不統(tǒng)一
class Something {
private static void main(String[] something_to_do)
{
System.out.println("Do something ...");
}
}
9.寫出以下正則表達式(分值10分)
1-6位字母或數(shù)字: ^[0-9a-zA-Z]{1,6}$
手機號(只能以139或159開通旨涝,11位數(shù)字):
"^(139|159)\d{8}$"
10.寫一個方法,實現(xiàn)字符串的反轉(zhuǎn),如:輸入abc白华,輸出cba(分值10分)
Java code
String str = "abc";
String reStr = new StringBuilder(str).reverse().toString();
或者
/**
* 將字符串變成數(shù)組
* 對數(shù)組反轉(zhuǎn),將數(shù)組變成字符串
*/
public static String reverseString(String s, int start, int end) {
//字符串變數(shù)組慨默。
char[] chs = s.toCharArray();
//反轉(zhuǎn)數(shù)組。
reverse(chs, start, end);
//將數(shù)組變成字符串弧腥。
return new String(chs);
}
private static void reverse(char[] arr, int x, int y) {
for (int start = x, end = y - 1; start < end; start++, end--) {
swap(arr, start, end);
}
}
private static void swap(char[] arr, int x, int y) {
char temp = arr[x];
arr[x] = arr[y];
arr[y] = temp;
11.寫一個延遲加載的單例模式(Singleton)的例子(分值10分)
//懶漢
public class Singleton {
private Singleton(){}
private static class LazyHodler{
private static Singleton Instance = new Singleton();
}
public static Singleton getInstance(){
return LazyHodler.Instance;
}
}
public class OuterClass {
private double d1 = 1.0;
//insert code here
}
把下列答案存放在指定code位置上厦取,哪兩個答案是正確的。闡述原因管搪。
A. class InnerOne{
public static double methoda() {return d1;}
}
B. public class InnerOne{
static double methoda() {return d1;}
}
C. private class InnerOne{
double methoda() {return d1;}
}
D. static class InnerOne{
protected double methoda() {return d1;}
}
E. abstract class InnerOne{
public abstract double methoda();
}
說明如下:
靜態(tài)內(nèi)部類可以有靜態(tài)成員虾攻,而非靜態(tài)內(nèi)部類不能有靜態(tài)成員AB錯,
靜態(tài)內(nèi)部類的非靜態(tài)成員可以訪問外部類的靜態(tài)變量更鲁,而不可訪問外部類的非靜態(tài)變量return d1;出錯故D錯
非靜態(tài)內(nèi)部類的非靜態(tài)成員可以訪問外部類的非靜態(tài)變量 故C正確
CE
題目補充
1霎箍、Java里的傳引用和傳值的區(qū)別是什么?
答案:傳引用是指傳遞的是地址而不是值本身澡为,傳值則是傳遞值的一份拷貝漂坏。
2、為什么Java里沒有全局變量?
答案:全局變量是全局可見的媒至,Java不支持全局可見的變量顶别,因為:全局變量破壞了引用透明性原則。全局變量導(dǎo)致了命名空間的沖突拒啰。
3驯绎、如何將String類型轉(zhuǎn)化成Number類型?
答案:Integer類的valueOf方法可以將String轉(zhuǎn)成Number图呢。
4条篷、面向?qū)ο缶幊痰脑瓌t是什么?
答案:主要有三點,多態(tài)蛤织,繼承和封裝赴叹。
5、所有類的父類是什么指蚜?
答案:object
6乞巧、Java的基本類型有哪些?
答案:byte,char, short, int, long, float, double, boolean。
7摊鸡、怎么判斷數(shù)組是null還是為空?
答案:輸出array.length的值绽媒,如果是0,說明數(shù)組為空免猾。如果是null的話是辕,會拋出空指針異常。
8猎提、JDK和JRE的區(qū)別是什么获三?
答案:Java運行時環(huán)境(JRE)是將要執(zhí)行Java程序的Java虛擬機。它同時也包含了執(zhí)行applet需要的瀏覽器插件。Java開發(fā)工具包(JDK)是完整的Java軟件開發(fā)包疙教,包含了JRE棺聊,編譯器和其他的工具(比如:JavaDoc,Java調(diào)試器)贞谓,可以讓開發(fā)者開發(fā)限佩、編譯、執(zhí)行Java應(yīng)用程序裸弦。
9祟同、Java中的方法覆蓋(Overriding)和方法重載(Overloading)是什么意思?
答案:Java的方法重載烁兰,就是在類中可以創(chuàng)建多個方法耐亏,它們具有相同的名字,Java中的方法重載發(fā)生在同一個類里面兩個或者是多個方法的方法名相同但是參數(shù)不同的情況沪斟。與此相對广辰,方法覆蓋是說子類重新定義了父類的方法。方法覆蓋必須有相同的方法名主之,參數(shù)列表和返回類型择吊。覆蓋者可能不會限制它所覆蓋的方法的訪問。
10槽奕、Java支持多繼承么几睛?
答案:不支持,Java不支持多繼承粤攒。每個類都只能繼承一個類所森,但是可以實現(xiàn)多個接口。
11夯接、進程和線程的區(qū)別是什么焕济?
答案:進程是執(zhí)行著的應(yīng)用程序,而線程是進程內(nèi)部的一個執(zhí)行序列盔几。一個進程可以有多個線程晴弃。線程又叫做輕量級進程。
12逊拍、創(chuàng)建線程有幾種不同的方式上鞠?你喜歡哪一種?為什么芯丧?
答案:有三種方式可以用來創(chuàng)建線程:
繼承Thread類
實現(xiàn)Runnable接口
實現(xiàn)Callable接口
應(yīng)用程序可以使用Executor框架來創(chuàng)建線程池
實現(xiàn)Runnable接口這種方式更受歡迎芍阎,因為這不需要繼承Thread類。在應(yīng)用設(shè)計中已經(jīng)繼承了別的對象的情況下缨恒,這需要多繼承(而Java不支持多繼承)谴咸,只能實現(xiàn)接口度硝。同時,線程池也是非常高效的寿冕,很容易實現(xiàn)和使用。
13椒袍、什么是死鎖(deadlock)驼唱?
答案:兩個進程都在等待對方執(zhí)行完畢才能繼續(xù)往下執(zhí)行的時候就發(fā)生了死鎖。結(jié)果就是兩個進程都陷入了無限的等待中驹暑。
14玫恳、簡單的說下HashMap和TreeMap的區(qū)別?
答案:HashMap:適用于在Map中插入优俘、刪除和定位元素京办。TreeMap:適用于按自然順序或自定義順序遍歷鍵(key)。HashMap通常比TreeMap快一點(樹和哈希表的數(shù)據(jù)結(jié)構(gòu)使然)帆焕,建議多使用HashMap惭婿,在需要排序的Map時候才用TreeMap。
18叶雹、try {}里有一個return語句财饥,那么緊跟在這個try后的finally {}里的code會不會被執(zhí)行,什么時候被執(zhí)行折晦,在return前還是后?
答案:會執(zhí)行钥星,在return前執(zhí)行。
19满着、在JAVA中谦炒,如何跳出當前的循環(huán)?
答案:用break; return方法风喇。
20宁改、在Java中,如何跳出當前的多重嵌套循環(huán)响驴?
答案:在最外層循環(huán)前加一個標記如A透且,然后用break A;可以跳出多重循環(huán)。
21豁鲤、在書寫代碼記錄操作日志時秽誊,是先寫日志 還是后寫日志?哪個會好些琳骡?
答案:先寫日志锅论。 先寫日志-->處理業(yè)務(wù)-->更新日志狀態(tài)。
25楣号、說出幾種java中的修飾符最易?
答案:public怒坯、protect、default藻懒、private
27剔猿、當一個線程進入一個對象的一個synchronized方法后,其它線程是否可進入此對象的其它方法?
答案:當一個線程訪問“某對象”的“synchronized方法”或者“synchronized代碼塊”時嬉荆,其他線程仍然可以訪問“該對象”的非同步代碼塊;當一個線程訪問“某對象”的“synchronized方法”或者“synchronized代碼塊”時归敬,其他線程對“該對象”的其他的“synchronized方法”或者“synchronized代碼塊”的訪問將被阻塞。
28鄙早、Collection 和 Collections的區(qū)別汪茧?
答案:Collection是集合類的上級接口,繼承與他的接口主要有Set 和List限番。Collections是針對集合類的一個幫助類舱污,他提供一系列靜態(tài)方法實現(xiàn)對各種集合的搜索、排序弥虐、線程安全化等操作扩灯。
29、在java中一個類被聲明為final類型躯舔,表示了什么意思驴剔?
答案:表示該類不能被繼承,是頂級類粥庄。
30丧失、存在使i + 1 < i的數(shù)嗎?
答案:存在惜互,解析:如果i為int型布讹,那么當i為int能表示的最大整數(shù)時,i+1就溢出變成負數(shù)了训堆,此時不就<i了嗎描验。
31、Java接口的修飾符可以為(D)
A private B protected C final D abstract
32坑鱼、不通過構(gòu)造函數(shù)也能創(chuàng)建對象嗎(A)
A 是 B 否
(1)用new語句創(chuàng)建對象膘流,這是最常見的創(chuàng)建對象的方法。
(2) 運用反射手段,調(diào)用java.lang.Class或者java.lang.reflect.Constructor類的newInstance()實例方法鲁沥。
(3) 調(diào)用對象的clone()方法呼股。
(4) 運用反序列化手段,調(diào)用java.io.ObjectInputStream對象的 readObject()方法画恰。
33彭谁、swtich是否能作用在byte上,是否能作用在long上允扇,是否能作用在String上?
答:早期的JDK中缠局,switch(expr)中则奥,expr可以是byte、short狭园、char读处、int。從1.5版開始唱矛,Java中引入了枚舉 類型(enum)档泽,expr也可以是枚舉,從JDK 1.7版開始揖赴,還可以是字符串(String)。長整型(long)是不可以的抑胎。
34燥滑、是否可以繼承String 類?
答:String類是final類,不可以被繼承阿逃。
35铭拧、當一個對象被當作參數(shù)傳遞到一個方法后,此方法可改變這個對象的屬性恃锉,并可返回變化后的結(jié)果搀菩,那么這里到底是值傳遞還是引用傳遞?
答:是值傳遞。Java編程語言只有值傳遞參數(shù)破托。當一個對象實例作為一個參數(shù)被傳遞到方法中時肪跋,參數(shù)的值就是對該對象的引用。對象的屬性可以在被調(diào)用過程中被改變土砂,但對象的引用是永遠不會改變的州既。
36、String 和StringBuilder萝映、StringBuffer的區(qū)別?
答:Java 平臺提供了兩種類型的字符串:String和StringBuffer / StringBuilder吴叶,它們可以儲存和操作字符串。其中String是只讀字符串序臂,也就意味著String引用的字符串內(nèi)容是不能被改變的蚌卤。而 StringBuffer和StringBuilder類表示的字符串對象可以直接進行修改。StringBuilder是JDK 1.5中引入的奥秆,它和StringBuffer的方法完全相同逊彭,區(qū)別在于它是在單線程環(huán)境下使用的,因為它的所有方面都沒有被synchronized修飾吭练,因此它的效率也比StringBuffer略高诫龙。
37、char 型變量中能不能存貯一個中文漢字?為什么?
答:char類型可以存儲一個中文漢字鲫咽,因為Java中使用的編碼是Unicode(不選擇任何特定的編碼签赃,直接使用字符在字符集中的編號谷异,這是統(tǒng)一的唯一方法),一個char類型占2個字節(jié)(16bit)锦聊,所以放一個中文是沒問題的歹嘹。
補充:使用Unicode意味著字符在JVM內(nèi)部和外部有不同的表現(xiàn)形式囊嘉,在JVM內(nèi)部都是Unicode猖任,當這個字符被從JVM內(nèi)部轉(zhuǎn)移到外部時 (例如存入文件系統(tǒng)中),需要進行編碼轉(zhuǎn)換日丹。所以Java中有字節(jié)流和字符流圆到,以及在字符流和字節(jié)流之間進行轉(zhuǎn)換的轉(zhuǎn)換流怎抛,如 InputStreamReader和OutputStreamReader,這兩個類是字節(jié)流和字符流之間的適配器類芽淡,承擔了編碼轉(zhuǎn)換的任務(wù)马绝;
38、抽象類(abstract class)和接口(interface)有什么異同?
答:抽象類和接口都不能夠?qū)嵗醴疲梢远x抽象類和接口類型的引用富稻。一個類如果繼承了某個抽象類或者實現(xiàn)了某個接口都需要對其中的抽象方法全部進行實現(xiàn),否則該類仍然需要被聲明為抽象類白胀。接口比抽象類更加抽象椭赋,因為抽象類中可以定義構(gòu)造器,可以有抽象方法和具體方法或杠,而接口中不能定義構(gòu)造器而且其 中的方法全部都是抽象方法哪怔。抽象類中的成員可以是private、默認向抢、protected蔓涧、public的,而接口中的成員全都是public的笋额。抽象 類中可以定義成員變量元暴,而接口中定義的成員變量實際上都是常量。有抽象方法的類必須被聲明為抽象類兄猩,而抽象類未必要有抽象方法茉盏。
39、靜態(tài)變量和實例變量的區(qū)別枢冤?
答:靜態(tài)變量是被static修飾符修飾的變量鸠姨,也稱為類變量,它屬于類淹真,不屬于類的任何一個對象讶迁,一個類不管創(chuàng)建多少個對象,靜態(tài)變量在內(nèi)存中有 且僅有一個拷貝核蘸;實例變量必須依存于某一實例巍糯,需要先創(chuàng)建對象然后通過對象才能訪問到它啸驯。靜態(tài)變量可以實現(xiàn)讓多個對象共享內(nèi)存。在Java開發(fā)中祟峦,上下文 類和工具類中通常會有大量的靜態(tài)成員罚斗。
40、是否可以從一個靜態(tài)(static)方法內(nèi)部發(fā)出對非靜態(tài)(non-static)方法的調(diào)用宅楞?
答:不可以针姿,靜態(tài)方法只能訪問靜態(tài)成員,因為非靜態(tài)方法的調(diào)用要先創(chuàng)建對象厌衙,因此在調(diào)用靜態(tài)方法時可能對象并沒有被初始化距淫。
41、如何實現(xiàn)對象克律粝!溉愁?
答:有兩種方式:
1.實現(xiàn)Cloneable接口并重寫Object類中的clone()方法;
2.實現(xiàn)Serializable接口饲趋,通過對象的序列化和反序列化實現(xiàn)克隆,可以實現(xiàn)真正的深度克隆撤蟆。
42奕塑、GC 是什么?為什么要有GC家肯?
答:GC是垃圾收集的意思龄砰,內(nèi)存處理是編程人員容易出現(xiàn)問題的地方,忘記或者錯誤的內(nèi)存回收會導(dǎo)致程序或系統(tǒng)的不穩(wěn)定甚至崩潰讨衣,Java提供的GC功能可以自動監(jiān)測對象是否超過作用域從而達到自動回收內(nèi)存的目的换棚,Java語言沒有提供釋放已分配內(nèi)存的顯示操作方法。Java程序員不用擔心內(nèi)存管理反镇, 因為垃圾收集器會自動進行管理固蚤。要請求垃圾收集,可以調(diào)用下面的方法之一:System.gc()或Runtime.getRuntime().gc()歹茶,但JVM可以屏蔽掉顯示的垃圾回收調(diào)用夕玩。
43、String s=new String(“xyz”);創(chuàng)建了幾個字符串對象惊豺?
答:兩個對象燎孟,一個是靜態(tài)存儲區(qū)的"xyz",一個是用new創(chuàng)建在堆上的對象尸昧。
44揩页、接口是否可繼承(extends)接口? 抽象類是否可實現(xiàn)(implements)接口? 抽象類是否可繼承具體類(concrete class)?
答:接口可以繼承接口。抽象類可以實現(xiàn)(implements)接口烹俗,抽象類可繼承具體類爆侣,但前提是具體類必須有明確的構(gòu)造函數(shù)萍程。
45、什么時候用assert累提?
答:assertion(斷言)在軟件開發(fā)中是一種常用的調(diào)試方式尘喝,很多開發(fā)語言中都支持這種機制。一般來說斋陪,assertion用于保證程序最基本朽褪、關(guān)鍵的正確性。assertion檢查通常在開發(fā)和測試時開啟无虚。為了提高性能缔赠,在軟件發(fā)布后,assertion檢查通常是關(guān)閉的友题。在實現(xiàn)中嗤堰,斷言是一個包含布爾表達式的語句,在執(zhí)行這個語句時假定該表達式為true度宦;如果表達式計算為false踢匣,那么系統(tǒng)會報告一個AssertionError。
46戈抄、Error和Exception有什么區(qū)別?
答:Error 表示系統(tǒng)級的錯誤和程序不必處理的異常离唬,是恢復(fù)不是不可能但很困難的情況下的一種嚴重問題;比如內(nèi)存溢出划鸽,不可能指望程序能處理這樣的情 況输莺;Exception表示需要捕捉或者需要程序進行處理的異常,是一種設(shè)計或?qū)崿F(xiàn)問題裸诽;也就是說嫂用,它表示如果程序運行正常,從不會發(fā)生的情況丈冬。
47嘱函、sleep()和wait()有什么區(qū)別?
答:sleep()方法是線程類(Thread)的靜態(tài)方法,導(dǎo)致此線程暫停執(zhí)行指定時間埂蕊,將執(zhí)行機會給其他線程实夹,但是監(jiān)控狀態(tài)依然保持,到時后會 自動恢復(fù)(線程回到就緒(ready)狀態(tài))粒梦,因為調(diào)用sleep不會釋放對象鎖亮航。wait()是Object類的方法,對此對象調(diào)用wait()方法導(dǎo)致本線程放棄對象鎖(線程暫停執(zhí)行)匀们,進入等待此對象的等待鎖定池缴淋,只有針對此對象發(fā)出notify 方法(或notifyAll)后本線程才進入對象鎖定池準備獲得對象鎖進入就緒狀態(tài)。
48、sleep()和yield()有什么區(qū)別?
答:sleep()方法給其他線程運行機會時不考慮線程的優(yōu)先級重抖,因此會給低優(yōu)先級的線程以運行的機會露氮;yield()方法只會給相同優(yōu)先級或更高優(yōu)先級的線程以運行的機會;線程執(zhí)行sleep()方法后轉(zhuǎn)入阻塞(blocked)狀態(tài)钟沛,而執(zhí)行yield()方法后轉(zhuǎn)入就緒(ready)狀態(tài)畔规;sleep()方法聲明拋出InterruptedException,而yield()方法沒有聲明任何異常恨统;sleep()方法比yield()方法(跟操作系統(tǒng)相關(guān))具有更好的可移植性叁扫。
49、請說出與線程同步相關(guān)的方法畜埋。
答:
1.wait():使一個線程處于等待(阻塞)狀態(tài)莫绣,并且釋放所持有的對象的鎖;
2.sleep():使一個正在運行的線程處于睡眠狀態(tài)悠鞍,是一個靜態(tài)方法对室,調(diào)用此方法要捕捉InterruptedException異常,不會釋放鎖咖祭;
3.notify():喚醒一個處于等待狀態(tài)的線程掩宜,當然在調(diào)用此方法的時候,并不能確切的喚醒某一個等待狀態(tài)的線程么翰,而是由JVM確定喚醒哪個線程牺汤,而且與優(yōu)先級無關(guān);
4.notityAll():喚醒所有處入等待狀態(tài)的線程硬鞍,注意并不是給所有喚醒線程一個對象的鎖,而是讓它們競爭戴已;
5.JDK 1.5通過Lock接口提供了顯式(explicit)的鎖機制固该,增強了靈活性以及對線程的協(xié)調(diào)。Lock接口中定義了加鎖(lock())和解鎖 (unlock())的方法糖儡,同時還提供了newCondition()方法來產(chǎn)生用于線程之間通信的Condition對象伐坏;
6.JDK 1.5還提供了信號量(semaphore)機制,信號量可以用來限制對某個共享資源進行訪問的線程的數(shù)量握联。在對資源進行訪問之前桦沉,線程必須得到信號量的 許可(調(diào)用Semaphore對象的acquire()方法);在完成對資源的訪問后金闽,線程必須向信號量歸還許可(調(diào)用Semaphore對象的release()方法)纯露。
50、什么是線程池(thread pool)代芜?
答:
在面向?qū)ο缶幊讨胁和剩瑒?chuàng)建和銷毀對象是很費時間的,因為創(chuàng)建一個對象要獲取內(nèi)存資源或者其它更多資源。在Java中更是如此钞速,虛擬機將試圖跟蹤每 一個對象贷掖,以便能夠在對象銷毀后進行垃圾回收。所以提高服務(wù)程序效率的一個手段就是盡可能減少創(chuàng)建和銷毀對象的次數(shù)渴语,特別是一些很耗資源的對象創(chuàng)建和銷 毀苹威,這就是"池化資源"技術(shù)產(chǎn)生的原因。線程池顧名思義就是事先創(chuàng)建若干個可執(zhí)行的線程放入一個池(容器)中驾凶,需要的時候從池中獲取線程不用自行創(chuàng)建牙甫,使用完畢不需要銷毀線程而是放回池中,從而減少創(chuàng)建和銷毀線程對象的開銷狭郑。
在Java 5+中的Executor接口定義一個執(zhí)行線程的工具腹暖。它的子類型即線程池接口是ExecutorService。要配置一個線程池是比較復(fù)雜的翰萨,尤其是對于線程池的原理不是很清楚的情況下脏答,因此在工具類Executors面提供了一些靜態(tài)工廠方法,生成一些常用的線程池亩鬼,如下所示:
newSingleThreadExecutor:創(chuàng)建一個單線程的線程池殖告。這個線程池只有一個線程在工作,也就是相當于單線程串行執(zhí)行所有任務(wù)雳锋。如果這個唯一的線程因為異常結(jié)束黄绩,那么會有一個新的線程來替代它。此線程池保證所有任務(wù)的執(zhí)行順序按照任務(wù)的提交順序執(zhí)行玷过。
newFixedThreadPool:創(chuàng)建固定大小的線程池爽丹。每次提交一個任務(wù)就創(chuàng)建一個線程,直到線程達到線程池的最大大小辛蚊。線程池的大小一旦達到最大值就會保持不變粤蝎,如果某個線程因為執(zhí)行異常而結(jié)束,那么線程池會補充一個新線程袋马。
newCachedThreadPool: 創(chuàng)建一個可緩存的線程池初澎。如果線程池的大小超過了處理任務(wù)所需要的線程,那么就會回收部分空閑(60秒不執(zhí)行任務(wù))的線程虑凛,當任務(wù)數(shù)增加時碑宴,此線程池又可 以智能的添加新線程來處理任務(wù)。此線程池不會對線程池大小做限制桑谍,線程池大小完全依賴于操作系統(tǒng)(或者說JVM)能夠創(chuàng)建的最大線程大小延柠。
newScheduledThreadPool:創(chuàng)建一個大小無限的線程池。此線程池支持定時以及周期性執(zhí)行任務(wù)的需求锣披。
newSingleThreadExecutor:創(chuàng)建一個單線程的線程池捕仔。此線程池支持定時以及周期性執(zhí)行任務(wù)的需求匕积。
如果希望在服務(wù)器上使用線程池,強烈建議使用newFixedThreadPool方法來創(chuàng)建線程池榜跌,這樣能獲得更好的性能闪唆。
82、簡述synchronized和java.util.concurrent.locks.Lock的異同钓葫?
答:Lock是Java 5以后引入的新的API悄蕾,和關(guān)鍵字synchronized相比主要相同點:Lock 能完成synchronized所實現(xiàn)的所有功能;主要不同點:Lock有比synchronized更精確的線程語義和更好的性能础浮。synchronized會自動釋放鎖帆调,而Lock一定要求程序員手工釋放,并且必須在finally 塊中釋放(這是釋放外部資源的最好的地方)豆同。
83番刊、Java中如何實現(xiàn)序列化,有什么意義影锈?
答:序列化就是一種用來處理對象流的機制芹务,所謂對象流也就是將對象的內(nèi)容進行流化⊙纪ⅲ可以對流化后的對象進行讀寫操作枣抱,也可將流化后的對象傳輸于網(wǎng)絡(luò)之間。序列化是為了解決對象流讀寫操作時可能引發(fā)的問題(如果不進行序列化可能會存在數(shù)據(jù)亂序的問題)辆床。要實現(xiàn)序列化佳晶,需要讓一個類實現(xiàn)Serializable接口,該接口是一個標識性接口讼载,標注該類對象是可被序列化的轿秧,然后使用一個輸出流來。構(gòu)造一個對象輸出流并通過writeObject(Object obj)方法就可以將實現(xiàn)對象寫出(即保存其狀態(tài))咨堤;如果需要反序列化則可以用一個輸入流建立對象輸入流菇篡,然后通過readObject方法從流中讀取對 象。序列化除了能夠?qū)崿F(xiàn)對象的持久化之外吱型,還能夠用于對象的深度克隆逸贾。
84陨仅、heap和stack有什么區(qū)別津滞。
答:java的內(nèi)存分為兩類,一類是棧內(nèi)存灼伤,一類是堆內(nèi)存触徐。棧內(nèi)存是指程序進入一個方法時,會為這個方法單獨分配一塊私屬存儲空間狐赡,用于存儲這個方法內(nèi)部的局部變量撞鹉,當這個方法結(jié)束時,分配給這個方法的棧會釋放,這個棧中的變量也將隨之釋放鸟雏。堆是與棧作用不同的內(nèi)存享郊,一般用于存放不放在當前方法棧中的那些數(shù)據(jù),例如孝鹊,使用new創(chuàng)建的對象都放在堆里炊琉,所以,它不會隨方法的結(jié)束而消失又活。方法中的局部變量使用final修飾后苔咪,放在堆中,而不是棧中柳骄。
1团赏、談?wù)勀銓γ嫦驅(qū)ο蟮睦斫?br>
答:
面向?qū)ο竦某绦蚴怯深惤M成的,每個類包含對用戶公開的特定功能部分和隱藏的實現(xiàn)部分耐薯。傳統(tǒng)的結(jié)構(gòu)化程序設(shè)計通過設(shè)計一系列的過程(即算法)來求解問題舔清。這一些過程一旦被確定,就要開始考考慮存儲數(shù)據(jù)的方式可柿,這就明確的表述了程序員的工作方式鸠踪。但面相對像卻調(diào)換了這個順序,它不必關(guān)心數(shù)據(jù)對象的具體實現(xiàn)复斥,只要能滿足用戶的需求即可营密。面向?qū)ο笥腥齻€最基本的特性,即:封裝目锭,繼承评汰,多態(tài)。
2痢虹、ClassLoader如何加載class 被去。
答:
jvm里有多個類加載,每個類加載可以負責加載特定位置的類奖唯,例如惨缆,bootstrap類加載負責加載jre/lib/rt.jar中的類, 我們平時用的jdk中的類都位于rt.jar中丰捷。extclassloader負責加載jar/lib/ext/*.jar中的類坯墨,appclassloader負責classpath指定的目錄或jar中的類。除了bootstrap之外病往,其他的類加載器本身也都是java類捣染,它們的父類是ClassLoader。
3停巷、如何實現(xiàn)線程通訊
①同步 這里講的同步是指多個線程通過synchronized關(guān)鍵字這種方式來實現(xiàn)線程間的通信耍攘。
這種方式榕栏,本質(zhì)上就是“共享內(nèi)存”式的通信。多個線程需要訪問同一個共享變量蕾各,誰拿到了鎖(獲得了訪問權(quán)限)扒磁,誰就可以執(zhí)行。
③wait/notify機制
②while輪詢的方式
二式曲、jsp/servlet/jquery/ajax
1渗磅、SERVLET API中forward() 與redirect()的區(qū)別?
答:前者僅是容器中控制權(quán)的轉(zhuǎn)向检访,在客戶端瀏覽器地址欄中不會顯示出轉(zhuǎn)向后的地址始鱼;后者則是完全的跳轉(zhuǎn),瀏覽器將會得到跳轉(zhuǎn)的地址脆贵,并重新發(fā)送請求鏈接医清。這樣,從瀏覽器的地址欄中可以看到跳轉(zhuǎn)后的鏈接地址卖氨。所以会烙,前者更加高效,在前者可以滿足需要時筒捺,盡量使用forward()方法柏腻,并且,這樣也有助于隱藏實際的鏈接系吭。在有些情況下五嫂,比如,需要跳轉(zhuǎn)到一個其它服務(wù)器上的資源肯尺,則必須使用sendRedirect()方法沃缘。
2、什么情況下調(diào)用doGet()和doPost()则吟?
答:Jsp頁面中的FORM標簽里的method屬性為get時調(diào)用doGet()槐臀,為post時調(diào)用doPost()。
15氓仲、自定義標簽要繼承哪個類水慨?
答案:這個類可以繼承TagSupport或者BodyTagSupport,兩者的差別是前者適用于沒有主體的標簽敬扛,而后者適用于有主體的標簽晰洒。如果選擇繼承TagSupport,可以實現(xiàn)doStartTag和doEndTag兩個方法實現(xiàn)Tag的功能舔哪,如果選擇繼承BodyTagSupport欢顷,可以實現(xiàn)doAfterBody這個方法槽棍。
3捉蚤、request.getAttribute()和request.getParameter() 有何區(qū)別?
答:getAttribute是返回對象抬驴,getParameter返回字符串 ±虑桑總的來說:request.getAttribute()方法返回request范圍內(nèi)存在的對象布持,而request.getParameter()方法是獲取http提交過來的數(shù)據(jù)。
4陕悬、jsp有哪些內(nèi)置對象?作用分別是什么? 分別有什么方法题暖?
答:
JSP中九大內(nèi)置對象為:
對象 含義 類型 作用域
request 請求對象 javax.servlet.ServletRequest Request
response 響應(yīng)對 javax.servlet.SrvletResponse Page
pageContext 頁面上下文對象 javax.servlet.jsp.PageContext Page
session 會話對象 javax.servlet.http.HttpSession Session
application 應(yīng)用程序?qū)ο?javax.servlet.ServletContext Application
out 輸出對象 javax.servlet.jsp.JspWriter Page
config 配置對象 javax.servlet.ServletConfig Page
page 頁面對象 javax.lang.Object Page
exception 例外對象 javax.lang.Throwable page
相關(guān)方法:
request對象代表的是來自客戶端的請求,例如我們在FORM表單中填寫的信息等捉超,是最常用的對象胧卤。常用的方法有:getParameter、getParameterNames 和getParameterValues通過調(diào)用這幾個方法來獲取請求對象中所包含的參數(shù)的值拼岳。
response 對象代表的是對客戶端的響應(yīng)枝誊,也就是說可以通過response 對象來組織發(fā)送到客戶端的數(shù)據(jù)。但是由于組織方式比較底層惜纸,所以不建議普通讀者使用叶撒,需要向客戶端發(fā)送文字時直接使用
pageContext對象直譯時可以稱作“頁面上下文”對象,代表的是當前頁面運行的一些屬性耐版。常用的方法有 :findAttribute祠够、getAttribute、getAttributesScope 和getAttributeNamesInScope粪牲。一般情況下pageContext對象用到得也不是很多古瓤,只有在項目所面臨的情況比較復(fù)雜的情況下,才會利用到頁面屬性來輔助處理腺阳。
session對象代表服務(wù)器與客戶端所建立的會話湿滓,當需要在不同的JSP頁面中保留客戶信息的情況下使用,比如在線購物舌狗、客戶軌跡跟蹤等叽奥。“session” 對象建立在cookie的基礎(chǔ)上痛侍,所以使用時應(yīng)注意判斷一下客戶端是否打開了cookie朝氓。常用的方法包括getId、 getValue主届、 getValueNames和putValue等赵哲。
5、頁面間對象傳遞的方法
答:request君丁,session枫夺,application,cookie等绘闷。
6橡庞、J2EE是技術(shù)還是平臺還是框架较坛? 什么是J2EE
答:J2EE本身是一個標準,一個為企業(yè)分布式應(yīng)用的開發(fā)提供的標準平臺扒最。 J2EE也是一個框架丑勤,包括JDBC、JNDI吧趣、RMI法竞、JMS、EJB强挫、JTA等技術(shù)岔霸。
7、什么是MVC模式?
MVC是三個單詞的首字母縮寫俯渤,它們是Model(模型)秉剑、View(視圖)和Controller(控制)。
這個模式認為稠诲,程序不論簡單或復(fù)雜侦鹏,從結(jié)構(gòu)上看,都可以分成三層:
1)最上面的一層臀叙,是直接面向最終用戶的"視圖層"(View)略水。它是提供給用戶的操作界面,是程序的外殼劝萤。
2)最底下的一層渊涝,是核心的"數(shù)據(jù)層"(Model),也就是程序需要操作的數(shù)據(jù)或信息床嫌。
3)中間的一層跨释,就是"控制層"(Controller),它負責根據(jù)用戶從"視圖層"輸入的指令厌处,選取"數(shù)據(jù)層"中的數(shù)據(jù)鳖谈,然后對其進行相應(yīng)的操作,產(chǎn)生最終結(jié)果阔涉。
這三層是緊密聯(lián)系在一起的缆娃,但又是互相獨立的,每一層內(nèi)部的變化不影響其他層瑰排。每一層都對外提供接口(Interface)贯要,供上面一層調(diào)用。這樣一來椭住,軟件就可以實現(xiàn)模塊化崇渗,修改外觀或者變更數(shù)據(jù)都不用修改其他層,大大方便了維護和升級。
8宅广、解析xml有哪幾種方式,優(yōu)缺點?
1葫掉、JDOM生成和解析XML
為減少DOM、SAX的編碼量乘碑,出現(xiàn)了JDOM。優(yōu)點:20-80原則,極大減少了代碼量金拒。使用場合:要實現(xiàn)的功能簡單,如解析兽肤、創(chuàng)建等,但在底層绪抛,JDOM還是使用SAX(最常用)资铡、DOM、Xanan文檔幢码。
2笤休、SAX生成和解析XML文檔
為解決DOM的問題,出現(xiàn)了SAX,SAX事件驅(qū)動症副。當解析器發(fā)現(xiàn)元素開始店雅、元素結(jié)束、文本贞铣、文檔的開始或結(jié)束等時發(fā)送事件,程序員編寫響應(yīng)這些事件的代碼,保存數(shù)據(jù)闹啦。優(yōu)點:不用事先調(diào)入整個文檔,占用資源少辕坝。SAX解析器代碼比DOM解析器代碼小窍奋,適于Applet下載。缺點:不是持久的酱畅,事件過后若沒保存數(shù)據(jù),那么數(shù)據(jù)就丟了琳袄。無狀態(tài)性,從事件中只能得到文本纺酸,但不知該文本屬于哪個元素窖逗。使用場合:Applet。只需XML文檔的少量內(nèi)容,很少回頭訪問,機器內(nèi)存少餐蔬。
3滑负、DOM生成和解析XML文檔
為XML文檔的已解析版本定義了一組接口。解析器讀入整個文檔,然后構(gòu)建一個駐留內(nèi)存的樹結(jié)構(gòu),然后代碼就可以使用DOM 接口來操作這個樹結(jié)構(gòu)用含。優(yōu)點:整個文檔樹在內(nèi)存中,便于操作,支持刪除矮慕、修改、重新排列等多種功能啄骇。缺點:將整個文檔調(diào)入內(nèi)存(包括無用的節(jié)點),浪費時間和空間痴鳄。使用場合:一旦解析了文檔還需多次訪問這些數(shù)據(jù),硬件資源充足(內(nèi)存、CPU)缸夹。
4痪寻、DOM4J生成和解析XML文檔
DOM4J是一個非常非常優(yōu)秀的Java XML API螺句,具有性能優(yōu)異、功能強大和極端易用使用的特點,同時它也是一個開放源代碼的軟件橡类。如今你可以看到越來越多的Java 軟件都在使用DOM4J來讀寫XML蛇尚,特別值得一提的是連 Sun 的JAXM也在用DOM4J。
題目補充
1顾画、靜態(tài)include和動態(tài)include的區(qū)別
<% @ include file="include.html" %>靜態(tài)include主要是對靜態(tài)頁面的引入取劫,不會檢查所包含文件的變化
<jsp:include>動態(tài)include主要是對動態(tài)頁面的引入,它總是會檢查所引入的頁面的變化研侣,如果所包含的資源在請求間發(fā)生變化谱邪,則下一次請求包含<jsp:include>動作的jsp時蛛枚,將包含資源的新內(nèi)容忿墅。
<jsp:include>動作包含的屬性:
page:指定所包含資源的相對url路徑互纯,該資源必須時同一web應(yīng)用程序的組成部分童叠。
flush:指定在執(zhí)行include動作后是否應(yīng)刷新緩沖區(qū)枫吧,在jsp1.1中丸逸,該屬性必須設(shè)置為真脖律。
使用動態(tài)include動作時牺弹,根據(jù)jsp1.1規(guī)范喇澡,jsp容器允許判斷通過include指令包含的資源是否發(fā)生變化蘸吓。如果發(fā)生變化。則容器可以重新編譯包含該資源的jsp撩幽,然而库继,該規(guī)范并沒有提供向容器表明某個包含的資源發(fā)生變化的機制。
動態(tài)include的優(yōu)點和不足:
優(yōu)點:
1:引入和同步一個動態(tài)的頁面窜醉,使jsp頁面更具靈活性
2:能和不同頁面之間進行信息的交互和快捷的實現(xiàn)方式宪萄。
3:改變了原始的所有頁面編碼都放在一個jsp上,使不同的功能分別寫在不同頁里榨惰,通過動態(tài)include方式引用到頁面拜英,更易于編碼,更易于管理琅催。
不足:
動態(tài)的引入時需要頻繁的變化和頁面信息的更新和交互居凶,要占用大量的資源開銷。降低頁面的訪問速度藤抡。如果在沒必要動態(tài)引入的情況下侠碧,不要使用動態(tài)include
應(yīng)該注意事項:
1:<jsp:include>動作的flush屬性必須要定義,不定義會出現(xiàn)轉(zhuǎn)換錯誤缠黍。而且設(shè)置的flush必須要為true
2:在<jsp:include>動作中指定的頁面必須是同一web應(yīng)用程序的一部分弄兜。如果引入的是非同一web應(yīng)用的頁面將導(dǎo)致請求時錯誤。
16、jsp頁面是在服務(wù)器端運行還是在客戶端運行替饿?
答案:服務(wù)器端语泽。JSP與Java Servlet一樣
三、Spring/SpringMVC/mybatis/hibernate
22视卢、什么是ORM框架踱卵?
答案:ORM(Object Relational Mapping)框架采用元數(shù)據(jù)來描述對象一關(guān)系映射細節(jié),元數(shù)據(jù)一般采用XML格式据过,并且存放在專門的對象一映射文件中惋砂。通過某種關(guān)系來維持實體對象和數(shù)據(jù)庫之間的關(guān)系,然后通過實體對象的操作來實現(xiàn)數(shù)據(jù)庫的操作蝶俱。也就是對象關(guān)系映射班利。
23饥漫、你了解哪幾種orm框架榨呆?
答案:Hibernate/myBatis 等。myBatis不完全是orm庸队,需要手動寫sql积蜻。
24、你用過哪幾個版本控制工具彻消?
答案:GIT等竿拆。
未完待續(xù)...
四、數(shù)據(jù)庫
五宾尚、編程題
六丙笋、編程題
webservice是什么?
一言以蔽之:WebService是一種跨編程語言和跨操作系統(tǒng)平臺的遠程調(diào)用技術(shù)煌贴。
所謂跨編程語言和跨操作平臺御板,就是說服務(wù)端程序采用java編寫,客戶端程序則可以采用其他編程語言編寫牛郑,反之亦然怠肋!跨操作系統(tǒng)平臺則是指服務(wù)端程序和客戶端程序可以在不同的操作系統(tǒng)上運行。
所謂遠程調(diào)用淹朋,就是一臺計算機a上的一個程序可以調(diào)用到另外一臺計算機b上的一個對象的方法笙各,譬如,銀聯(lián)提供給商場的pos刷卡系統(tǒng)础芍,商場的POS機轉(zhuǎn)賬調(diào)用的轉(zhuǎn)賬方法的代碼其實是跑在銀行服務(wù)器上杈抢。再比如,amazon仑性,天氣預(yù)報系統(tǒng)春感,淘寶網(wǎng),校內(nèi)網(wǎng),百度等把自己的系統(tǒng)服務(wù)以webservice服務(wù)的形式暴露出來鲫懒,讓第三方網(wǎng)站和程序可以調(diào)用這些服務(wù)功能嫩实,這樣擴展了自己系統(tǒng)的市場占有率,往大的概念上吹甲献,就是所謂的SOA應(yīng)用。
其實可以從多個角度來理解WebService颂翼,從表面上看晃洒,WebService就是一個應(yīng)用程序向外界暴露出一個能通過Web進行調(diào)用的API,也就是說能用編程的方法通過Web來調(diào)用這個應(yīng)用程序朦乏。我們把調(diào)用這個WebService的應(yīng)用程序叫做客戶端球及,而把提供這個WebService的應(yīng)用程序叫做服務(wù)端。從深層次看呻疹,WebService是建立可互操作的分布式應(yīng)用程序的新平臺吃引,是一個平臺,是一套標準刽锤。它定義了應(yīng)用程序如何在Web上實現(xiàn)互操作性镊尺,你可以用任何你喜歡的語言,在任何你喜歡的平臺上寫Web service 并思,只要我們可以通過Web service標準對這些服務(wù)進行查詢和訪問庐氮。
WebService平臺需要一套協(xié)議來實現(xiàn)分布式應(yīng)用程序的創(chuàng)建。任何平臺都有它的數(shù)據(jù)表示方法和類型系統(tǒng)宋彼。要實現(xiàn)互操作性弄砍,WebService平臺必須提供一套標準的類型系統(tǒng),用于溝通不同平臺输涕、編程語言和組件模型中的不同類型系統(tǒng)音婶。Web service平臺必須提供一種標準來描述Web service,讓客戶可以得到足夠的信息來調(diào)用這個Web service占贫。最后桃熄,我們還必須有一種方法來對這個Web service進行遠程調(diào)用,這種方法實際是一種遠程過程調(diào)用協(xié)議(RPC)。為了達到互操作性型奥,這種RPC協(xié)議還必須與平臺和編程語言無
WebService平臺技術(shù)
XML+XSD,SOAP和WSDL就是構(gòu)成WebService平臺的三大技術(shù)瞳收。
XML+XSD:
WebService采用HTTP協(xié)議傳輸數(shù)據(jù),采用XML格式封裝數(shù)據(jù)(即XML中說明調(diào)用遠程服務(wù)對象的哪個方法厢汹,傳遞的參數(shù)是什么螟深,以及服務(wù)對象的返回結(jié)果是什么)。XML是WebService平臺中表示數(shù)據(jù)的格式烫葬。除了易于建立和易于分析外界弧,XML主要的優(yōu)點在于它既是平臺無關(guān)的凡蜻,又是廠商無關(guān)的。無關(guān)性是比技術(shù)優(yōu)越性更重要的:軟件廠商是不會選擇一個由競爭對手所發(fā)明的技術(shù)的垢箕。
XML解決了數(shù)據(jù)表示的問題划栓,但它沒有定義一套標準的數(shù)據(jù)類型,更沒有說怎么去擴展這套數(shù)據(jù)類型条获。例如忠荞,整形數(shù)到底代表什么?16位帅掘,32位委煤,64位?這些細節(jié)對實現(xiàn)互操作性很重要修档。XML Schema(XSD)就是專門解決這個問題的一套標準碧绞。它定義了一套標準的數(shù)據(jù)類型,并給出了一種語言來擴展這套數(shù)據(jù)類型吱窝。WebService平臺就是用XSD來作為其數(shù)據(jù)類型系統(tǒng)的讥邻。當你用某種語言(如VB.NET或C#)來構(gòu)造一個Web service時,為了符合WebService標準癣诱,所有你使用的數(shù)據(jù)類型都必須被轉(zhuǎn)換為XSD類型计维。你用的工具可能已經(jīng)自動幫你完成了這個轉(zhuǎn)換袜香,但你很可能會根據(jù)你的需要修改一下轉(zhuǎn)換過程撕予。
SOAP:
WebService通過HTTP協(xié)議發(fā)送請求和接收結(jié)果時,發(fā)送的請求內(nèi)容和結(jié)果內(nèi)容都采用XML格式封裝蜈首,并增加了一些特定的HTTP消息頭实抡,以說明HTTP消息的內(nèi)容格式,這些特定的HTTP消息頭和XML內(nèi)容格式就是SOAP協(xié)議欢策。SOAP提供了標準的RPC方法來調(diào)用Web Service吆寨。
SOAP協(xié)議 = HTTP協(xié)議 + XML數(shù)據(jù)格式
SOAP協(xié)議定義了SOAP消息的格式,SOAP協(xié)議是基于HTTP協(xié)議的踩寇,SOAP也是基于XML和XSD的啄清,XML是SOAP的數(shù)據(jù)編碼方式。打個比喻:HTTP就是普通公路俺孙,XML就是中間的綠色隔離帶和兩邊的防護欄辣卒,SOAP就是普通公路經(jīng)過加隔離帶和防護欄改造過的高速公路。
WSDL:
好比我們?nèi)ド痰曩I東西睛榄,首先要知道商店里有什么東西可買荣茫,然后再來購買,商家的做法就是張貼廣告海報场靴。 WebService也一樣啡莉,WebService客戶端要調(diào)用一個WebService服務(wù)港准,首先要有知道這個服務(wù)的地址在哪,以及這個服務(wù)里有什么方法可以調(diào)用咧欣,所以浅缸,WebService務(wù)器端首先要通過一個WSDL文件來說明自己家里有啥服務(wù)可以對外調(diào)用,服務(wù)是什么(服務(wù)中有哪些方法魄咕,方法接受的參數(shù)是什么疗杉,返回值是什么),服務(wù)的網(wǎng)絡(luò)地址用哪個url地址表示蚕礼,服務(wù)通過什么方式來調(diào)用烟具。
WSDL(Web Services Description Language)就是這樣一個基于XML的語言,用于描述Web Service及其函數(shù)奠蹬、參數(shù)和返回值朝聋。它是WebService客戶端和服務(wù)器端都能理解的標準格式。因為是基于XML的囤躁,所以WSDL既是機器可閱讀的冀痕,又是人可閱讀的,這將是一個很大的好處狸演。一些最新的開發(fā)工具既能根據(jù)你的Web service生成WSDL文檔言蛇,又能導(dǎo)入WSDL文檔,生成調(diào)用相應(yīng)WebService的代理類代碼宵距。
WSDL文件保存在Web服務(wù)器上腊尚,通過一個url地址就可以訪問到它÷模客戶端要調(diào)用一個WebService服務(wù)之前婿斥,要知道該服務(wù)的WSDL文件的地址。WebService服務(wù)提供商可以通過兩種方式來暴露它的WSDL文件地址:1.注冊到UDDI服務(wù)器哨鸭,以便被人查找民宿;2.直接告訴給客戶端調(diào)用者。
webservice有幾種實現(xiàn)方式?
1.Axis2
Axis是apache下一個開源的webservice開發(fā)組件像鸡,出現(xiàn)的算是比較早了活鹰,也比較成熟。這里主要介紹Axis+eclipse開發(fā)webservice只估,當然不用eclipse也可以開發(fā)和發(fā)布webservice志群,只是用eclipse會比較方便。
2.Apche CXF
CXF開發(fā)webservice也是比較方便和簡單的仅乓,它和spring的集成可以說是非常地好赖舟。
3.JDK開發(fā)webservice(jdk自帶的jaxws)
webservice配置步驟?
施用Spring+CXF開發(fā)WebService,使用注解方式
Webservice如何控制事務(wù)?