第一篇:java 中常用的方法總結(jié)
8月1日
練習(xí):
合理覆蓋Cat數(shù)據(jù)類型的,equals()方法
Cat.java 覆蓋 hashCode()返回的整型值是唯一的int hashCode()用法:
一般使用String提供hashCode的編碼 +基本數(shù)據(jù)類型
hashCode 生成原則: 當(dāng)對象內(nèi)容一致時,生成的hashCode必須是一樣的當(dāng)對象內(nèi)容不致時,生成的hashCode必須是唯一的HashtableTest1.java
hashtable 中的key如果是自定義數(shù)據(jù)類型,那么它必須覆蓋equals()和hashCode()//考試 hashCode()ArrayList * Hashtable * 其他的存儲方式:
LinkedList //特點:可以刪除指定位置數(shù)據(jù)
練習(xí):
向LinkedList添加:
A B C D
打印出時為: DCBA LinkedListTest.java
練習(xí)(MyQueueTest.java):
模擬一個隊伍(隊列),去買票一個動作
思路: 模擬一個隊列(add)模擬出列(removeXXXX)
//先買票的人,先出隊列——先入先出
隊伍是一個特殊數(shù)據(jù)結(jié)構(gòu),特點:FIFO(先入先出)
HashSet //不允許重復(fù)元素
集合框架類的特點: Collection 接口是一組允許重復(fù)的對象 Set接口繼承Collection,但不允許重復(fù)使用自己內(nèi)部的一個排列機制 List接口繼承Collection,允許重復(fù),以元素安插的次序來放置元素,不會重新排列。Map接口是一組成對的鍵——值對象,即所持有的是key—value pairs。Map中不能有重復(fù)的key。擁有自己內(nèi)部機制。在集合框架類中有兩大類接口: 5.1 Collection 5.2 Map
注意:集合框架類——容器,容器中存儲引用數(shù)據(jù)類型
繼承關(guān)系:
接口 實現(xiàn) 歷史集合類型
Set HashSet TreeSet
List ArrayList Vector LinkedList Stack
Map HashMap Hashtable TreeMap Properties
集合框架類解決的問題?變長數(shù)組操作的效率。
集合框架類的特點:Vector 2 ArrayList * 3 Hashtable * 4 HashSet 5 Properties
集合框架類的使用:聲明
private Vector vec;2 構(gòu)造中實例化
vec = new vector();向容器中添加數(shù)據(jù):
vec.add();練習(xí):
FILOTest.java
第一個進來,最后一個出去
FILO------棧
練習(xí):
將Student類作為Hashtable的key StudentHash 1 Student StudentHash(主類)StudentHash.java 8月2日
練習(xí):
使用HashMap進行數(shù)據(jù)的存儲,與遍歷
.keySet()//返回key的集合(Set)
.values()//返回value的列表(ArrayList)HashMapTest.java
HashMap與Hashtable的區(qū)別:
Hashtable是非同步的(效率高)
HashMap是同步的(效率低)
獲得系統(tǒng)java的相關(guān)的環(huán)境變量:
System.getProperties();//可以返回
Properties數(shù)據(jù)類型(是Map的子類),內(nèi)容為系統(tǒng)的全部環(huán)境變量
練習(xí):
打印輸出系統(tǒng)中全部的環(huán)境變量:
//2 了解Properties,還可以與文件系統(tǒng)交互
PropertiesTest.java 思路: Properties p = System….2 遍歷p 復(fù)習(xí):
java.lang:
String特點
常用構(gòu)造:
String(byte[] bytes)//將byte型數(shù)組轉(zhuǎn)換為字符串
String(char[] ch)//將char型數(shù)組轉(zhuǎn)換為字符串
String(char[] value, int offset, int count)
//將char[]轉(zhuǎn)換為字符串,offset從那里開始(0)//count(char.length)個數(shù)
常用方法: char charAt(int index)String str = “ABC”;Char ch = str.charAt(0);ch ==A;String concat(String str)//連接字符串==”+”號 boolean equalsIgnoreCase(String anotherString)//忽略大小寫比較byte[] getBytes()// 將字符串處理為byte[] int indexOf(String str)//判斷字符串所在的索引位置,如果描述的字符串不存在,返回值為-1 int lastIndexOf(String str)//字符串所在的最后一個索引位置,如果描述的字符串不存在,返回值為-1 int length()//返回字符串的長度 String replace(char oldChar,char newChar)//字符串替換 boolean startsWith(String prefix)// 判斷字符串的開頭,是否有匹配的字符串 10 boolean endsWitn(String prerfix)//判斷字符串的結(jié)尾,是否有匹配的字符串String substring(int beginIndex, int endIndex)//字符串的截取char[] toCharArray()//將字符串處理為char[] 13 String toLowerCase()//將字符串處理為小寫String toUpperCase()//將字符串處理為大寫String trim()//除去字符串左右兩邊的空格StringBuffer //初始化的容量16 構(gòu)造:
StringBuffer()//初始化容量 16 StringBuffer(10)//初始化容量 10 StringBuffer(String str)方法:
StringBuffer append(float f)// 向StirngBuffer添加內(nèi)容
int capacity()// 返回容量
int length()// 返回StringBufferInt實際存儲長度
StringBuilde(效率高)==StringBuffer 基本數(shù)據(jù)類型的包裝包:
Byte b = new Byte();Int Integer char Character
int a = Integer.parseInt(“11”);System常用的方法:
System.gc();
System.exit(0);//退出java程序,0代表正常退出,非0代表異常退出
System.arraycopy()//數(shù)組的拷貝
System.currentTimeMillis()//系統(tǒng)毫秒(1970)
System.getProperties()//系統(tǒng)環(huán)境變量
Math 算術(shù)類:
Math.abs()// 絕對值
max min
random //1.0----0.0的隨機值
round //四舍五入
Runtime // 獲得系統(tǒng)運行環(huán)境,通常用于java調(diào)用
//第三方應(yīng)用程序(.exe).exec(“ ”)java.util
Date //獲得系統(tǒng)時間,不考慮時區(qū)
構(gòu)造:
Date()//獲得系統(tǒng)時間
Date(long date)//根據(jù)用戶傳入的系統(tǒng)毫秒獲取時間
方法:
toString()格式化日期: java.text.SimpleDateFormat 構(gòu)造:
SimpleDateFormat(String str)方法:
String format(date)
Calendar //日期,可以考慮時區(qū)
固定用法:
Calendar cal = Calendar.getInstance();//時區(qū)
TimeZone tz = TimeZone.getTimeZone(“GMT + 8:00”);Calendar cal = Calendar.getInstance(tz);常用的方法:
Date getTime();//返回當(dāng)前系統(tǒng)時區(qū)
int get(int filed);// Calendar.靜態(tài)變量
Random 構(gòu)造:
Random()方法:
int nextInt(xxxx)//返回指定范圍的隨機數(shù)字
需要可以變長的數(shù)組,可以提高效率
集合框架類:一組相同元素的集合。Vector 構(gòu)造:
Vector()//無參構(gòu)造,初始化容量為10 方法:
Boolean add(E e)//向容器中存儲數(shù)據(jù)
Void addElement(E obj)//向容器中存儲數(shù)據(jù)
elements()//為Enumeration提供容器的地址Enumeration //應(yīng)用于容器元素的遍歷
方法:
boolean hasMoreElements()//判斷指針是否還有數(shù)據(jù)
E nextElement()//返回當(dāng)前的元素,并且指針下移
ArrayList 構(gòu)造:
ArrayList()//初始化容量 10 方法:
add()
iterator()//為Iterator()提供容器的地址
Iterator: //遍歷容器中的元素
方法:
boolean hasNext()// 判斷指針是否還有數(shù)據(jù)
E next()//返回當(dāng)前的元素,并且指針下移
Vector 與ArrayList的區(qū)別:
Vector效率低,線程同步 ArrayList 效率高,線程非同步
Hashtable //存儲數(shù)據(jù)時,通過key,value的方式成對存儲
//只要知道key可以一次性操作value 方法:
put(key,value)//向Hashtable容器存儲數(shù)據(jù)
elements()//返回Enumeration value的地址
key()//返回Enumeration 提供key的地址
E get(key)//根據(jù)表述的key一次獲得value remove(Object key)//根據(jù)表述的key刪除value
Hashtable中key是一個自定義的數(shù)據(jù)類型,那么這個自定義類型,必須合理覆蓋Object;public boolean equals(Object obj)public int hashCode()HashMap(同步)
LinkedList //鏈表——提供了方便的操作方法
方法:
addFirst()removeFirst()addLast()removeLast()繼承關(guān)系:
Collection Set-------不允許重復(fù)數(shù)據(jù)List---------允許重復(fù)數(shù)據(jù)
Collection list = new ArrayList();//面向接口
Map
使用官方類庫方法:結(jié)合面向?qū)ο蟮乃枷?/p>
1.1 這個類的作用
1.2 這個類的構(gòu)造
1.3 這個類的常用方法一些特殊類的固定用法
8月3日
java.io //為硬盤文件的讀,寫提供功能
File //在java中就代表磁盤上的一個文件
//它只可以訪問這個文件的屬性,并且它可以創(chuàng)建,刪除文件,但是,它不可以控制文件中的內(nèi)容
構(gòu)造:
File(String pathname)示例:聲明
File f;構(gòu)造中初始化
//f代表當(dāng)前目錄下的new.txt f = new File(“new,txt”);3 方法:
boolean createNewFile()//新建一個空文件
boolean delete()//刪除這個文件
練習(xí):
在當(dāng)前目錄下創(chuàng)建一個新的文件判斷這個文件是否存在
1.1 不存在,則創(chuàng)建一個新的文件
1.2存在,則輸出這個文件的修改時間
新建項目:IO
新建類:FileTest.java 2 輸出文件產(chǎn)相關(guān)信息
2.1 這個文件的名字
2.2 這個文件的絕對路徑
I/O的基本原理:
流(stream):流是指在計算機的輸入輸出之間運動的數(shù)據(jù)序列。是用于I/O編程的抽象概念,表示線性的,順序的輸入和輸出的數(shù)據(jù)流。
流分為兩類:
輸入流:代表從外設(shè)流入計算機的數(shù)據(jù)序列:輸入流:源流(source stream)輸出流:代表從計算機流向外設(shè)的數(shù)據(jù)序列:輸出流:目的流(sink stream)在java中流的分類:
主體是程序 字節(jié)流---------代表傳輸?shù)臄?shù)據(jù)類型為byte類型,1字節(jié)
1.1 InputStream //可以從磁盤中讀取文件
1.2 OutputStream //可以向磁盤中的文件寫入內(nèi)容 字符流---------代表傳輸?shù)臄?shù)據(jù)類型為char類型,2字節(jié)
2.1 Reader(輸入流):可以從磁盤中讀取文件
2.2 Writer(輸出流):可以向磁盤中的文件寫入內(nèi)容
使用字節(jié)流:
練習(xí):ByteStream中實現(xiàn)文件的寫入,讀取 使用FileOutputStream 向hello.txt中寫入內(nèi)容“MyFirstOutput” 1.1 FileOutputStream 的構(gòu)造:
FileOutputStream(File file)
FileOutputStream(File file, Boolean append)
//append參數(shù):為true,將會以追加模式進行寫操作
false,將會覆蓋原有文件
1.2 方法:
void write(byte[] b)
void close()//釋放資源使用FileInputStream()2.1 構(gòu)造
2.2 方法
int read(byte[] b)
//將讀出的內(nèi)容存儲到byte[] 中,并且返回數(shù)組的長度
操作資源三大步: 打開
操作(讀,寫)
關(guān)閉
ByteStream.java
練習(xí):使用java實現(xiàn)copy指令:
MyCopy
要求:java MyCopy args1 args2
結(jié)果:將args1中的內(nèi)容copy到args2 思路:
1、從args1中讀取內(nèi)容
2、將讀取的內(nèi)容寫入到args2 書寫:
1、考慮需要的屬性
2、構(gòu)造初始化屬性
3、方法實現(xiàn)copy
int read()//無參read方法 返回byte型數(shù)據(jù)
int read(byte[ ] b)//返回讀取內(nèi)容的長度
8月5日
字符流:char FileReader 構(gòu)造:
FileReader(String filename)// 以參數(shù)中的文件名,創(chuàng)建輸入字符流
FileWriter 練習(xí):
FileRW.java
使用字符流實現(xiàn)文件的讀寫
注:程序結(jié)構(gòu)參考ByteStream 字符流的特點:
由于字符流在write()實現(xiàn)時,使用了緩沖機制,所以在write()完畢后,必須同步緩沖區(qū)。
調(diào)用:
flush();或者
close();
System.in //可以接收用戶在終端的輸入
int read()//返回用戶在程序運行過程中的鍵盤輸入,為此輸入的ascii碼
System.in.read();//程序會阻塞狀態(tài),只有當(dāng)用戶輸入字符,并且按下“回車鍵”程序,才會繼續(xù)運行
ReadTest.java 流鏈:
目的:
在實際開發(fā)中,提高基本的字節(jié)流或者字符流的讀取效率(讀寫效率)和更方便的操作機制(除了char,byte,String),還可以操作其他數(shù)據(jù)類型。
注意:一個程序很少只用一個流類來處理數(shù)據(jù),通常都有使用一系列流類叫流鏈來處理。
字節(jié)流: BufferedInputStream BufferdeOutputStream
//特點:為基本的I/O操作,提供緩存區(qū)域
//提高字節(jié)流的操作效率
BufferedTest.java DataInputStream DataOutputStream
//特點:為各種基本,特殊數(shù)據(jù)類型提供操作方式
DataTest.java 輸入流量
DataSource-àFileInputStream-àBufferedInputStream--àDataInputStream-àProgram 輸出流量
Program-à DataOutputStream-à BufferedOutputStream-àFileOutputStream àDatasink 練習(xí):
字符流版本的,MyCopy MyCharCopy.java 流鏈:
字節(jié)流的流鏈
字符流的流鏈
BufferedReader BufferedWriter
//提高I/O操作效率
BufferedRW.java
Alt + shift + z //自動寫出異常
System.in.read();
System.in //java 中的標(biāo)準(zhǔn)輸入流
ReadTest.java 8月6日 將對象存入到文件中(序列化存儲)* ObjectSave.java 手工實現(xiàn)步驟:
將User數(shù)據(jù)類型的構(gòu)造,封裝,進行編寫
使用DataxxxStream進行讀寫;
將User對象的數(shù)據(jù)進行拆分(setxxx,getxxx)序列化存儲實現(xiàn):
ObjectInputStream ObjectOutputStream //對于對象的讀和寫
方法:
Object readObject()
void writeObject(Object obj)
注意:讀或?qū)懙膶ο?,必須實現(xiàn)Serializable(序列化)接口
示例:
//這個對象支持了序列化存儲 //可以使用readObject()|| writeObject()方法了
class User implements Serializable { }
ObjectSerializable.java
回顧:java.io File //特點:代表磁盤的文件,只可以訪問文件的屬性流的概念:只要計算機中線性的,順序的數(shù)據(jù)輸入,輸出
輸入流:
輸出流:
java的角度:
字節(jié)流:
InputStream //讀取內(nèi)容
OutputStream //寫入內(nèi)容
特點:基本數(shù)據(jù)類型byte 字符流:
Writer: Reader:
特點:基本數(shù)據(jù)類型char 3 字節(jié)流和字符流的應(yīng)用:
字節(jié)流:
FileInputStream FileOutputStream 字符流:
FileWriter FileReader 流鏈(包裝流)
特點:
增加I/O的操作效率。(分配了一段內(nèi)存-----緩沖區(qū))
提供名種基本數(shù)據(jù)類型和特殊類型的操作機制
字節(jié)流: BufferedInputStream
BufferedOutputStream //特點:提高I/O操作效率DataInputStream
DataOutputStream //特點:提供基本,特殊類型操作
字符流: BufferedReader //特點:readLine();BufferedWriter 5 序列化存儲:
特點:將對象進行存儲,讀取ObjectInputStream ObjectOutputStream
注意:要序列化存儲對象必須實現(xiàn):Serializable 接口 大練習(xí):
使用
java.lang java.util java.io
實現(xiàn)一個用戶的管理查詢系統(tǒng)
功能:添加用戶瀏覽用戶刪除用戶查找用戶退出程序
見UserManager文件夾
解決數(shù)據(jù)的累加問題: 程序一運行的時候,就將文件中的所有數(shù)據(jù)保存在內(nèi)存中。
EOFException //文件指針已經(jīng)到末尾時,還要繼續(xù)讀取
User user
User =(User)is.readObject();While(user!= null){
array.add(user);ois.readObject();}
ArrayList:
int size()//可以返回ArrayList中的元素個數(shù)
E get(int index)//根據(jù)用戶傳入的索引值,返回所存儲數(shù)據(jù)
remove(int index)//刪除指定位置的元素
第二篇:java中常用關(guān)鍵字總結(jié)
Java中的關(guān)鍵字總結(jié)
final 關(guān)鍵字
1、用final修飾的類不能被繼承,沒有子類;
2、用final修飾的方法,方法不能被重寫;
3、用final修飾變量,變量的值不能被修改,表示常量,(書寫規(guī)范:全部字母都要大寫;多個單詞,可以使用下劃線(_)分開;)注意:如果被final修飾的變量是一個引用類型的數(shù)據(jù),那么通過這個引用改變堆空間中的數(shù)據(jù),不會報錯;如果被final修飾的變量是一個引用類型的數(shù)據(jù),那么通過這個引用改變堆空間中的數(shù)據(jù),不會報錯;
4、final用于成員變量表示該成員變量為常量,不能被修改,必須在變量定義時賦值。
5、final用于局部變量表示該局部變量為常量,不能被修改,可以在變量定義時賦值,也可以先定義變量后賦值。什么時候用final關(guān)鍵字? 有的時候不想別人重寫我的方法就使用final關(guān)鍵字修飾該方法;
static關(guān)鍵字
1、static用于成員變量表示該變量只有一份,也就是說靜態(tài)成員變量屬于類而不屬于某個具體的類實例對象,所有的類實例對象共享這個靜態(tài)成員變量; 靜態(tài)函數(shù)是不需要對象的,直接可以使用類名來調(diào)用;
2、非靜態(tài)函數(shù)可以調(diào)用靜態(tài)函數(shù);靜態(tài)函數(shù)不能調(diào)用非靜態(tài)函數(shù)(非靜態(tài)函數(shù)都是通過對象調(diào)用的);靜態(tài)函數(shù)不能使用非靜態(tài)成員變量,但可以使用靜態(tài)成員變量;
3、靜態(tài)函數(shù)調(diào)用時不需要對象的,所以不能使用和對象有關(guān)的關(guān)鍵字;(this;super;)
4、構(gòu)造函數(shù)不能使用static修飾(構(gòu)造函數(shù)是創(chuàng)建對象,開辟空間,給所有成員變量賦默認值之后,有JVM調(diào)用進棧,用來給對象的成員變量賦初始值的)static用于類,這里指的是內(nèi)部類,那么在別的地方就可以通過外部類名來引用這個靜態(tài)的內(nèi)部類。
5、static還可以用于類的代碼塊,叫做靜態(tài)代碼塊,靜態(tài)代碼塊在類加載的時候就執(zhí)行完畢,而類只加載一次;是在類中獨立于類成員的static語句塊,可以有多個,位置可以隨便放,它不在任何的方法體內(nèi),JVM加載類時會執(zhí)行這些靜態(tài)的代碼塊,如果static代碼塊有多個,JVM將按照它們在類中出現(xiàn)的先后順序依次執(zhí)行它們,每個代碼塊只會被執(zhí)行一次。什么時候用static關(guān)鍵字? 不想建立對象時;對于公用的成員變量必須使用static關(guān)鍵字修飾才能保證共享;
private關(guān)鍵字
1、java中的訪問權(quán)限修飾符(作用是控制被修飾的成員的訪問權(quán)限);被private修飾的成員,只能在本類中使用;所以被私有的成員需要在外界訪問,還需要提供一個公共的方法;
設(shè)值:set + 變量名(變量名的首字母大寫); 取值:get + 變量名(變量名的首字母大寫);
2、構(gòu)造函數(shù)私有化,就只能在被類中使用,別的地方調(diào)用不了;單例設(shè)計模式時會用到;
在開發(fā)中,一般類的成員變量都要私有化,然后提供get和set方法;
interface關(guān)鍵字
1、interface接口不是一個類,使用interface聲明;接口沒有構(gòu)造函數(shù);接口是用來描述不屬于繼承體系的擴展功能的;還可以定義規(guī)則;接口和類之間是實現(xiàn)關(guān)系,一個實現(xiàn)類可以實現(xiàn)多個接口;接口和接口之間是繼承關(guān)系,可以多繼承和多重繼承;
2、接口中可以書寫的內(nèi)容:
成員變量:只能使用一下修飾符:public static final;也就是說,接口中的成員變量,都是常量;
成員函數(shù): 只能使用修飾符:public abstract;也就是說,接口中的方法,都是公共和抽象的;一般函數(shù)前面的修飾符,推薦public不要省略;
什么時候用interface關(guān)鍵字? 對于繼承體系之外的擴展功能需要使用接口來描述;
implements關(guān)鍵字
implements用于實現(xiàn)接口,需要實現(xiàn)接口中的所有方法,可以同時實現(xiàn)多個接口。extends關(guān)鍵字
extends用于繼承父類或父接口,繼承父類時只能是單繼承。
class關(guān)鍵字
class用于聲明類,訪問權(quán)限可以是public或者默認權(quán)限,還可以指定為abstract、final,訪問權(quán)限對于頂層類和內(nèi)部類的限制是不同的。
instanceof關(guān)鍵字
1、比較運算符,運算符左邊是一個指向一個對象的引用(左邊就是一個變量名),右邊是一個類名,運算符表示的意思就是:判斷左邊的對象的類型是不是右邊的類;
2、使用instanceof關(guān)鍵字,可以實時判斷一個對象的類型,就可以避免強制類型轉(zhuǎn)換中容易出現(xiàn)的類型轉(zhuǎn)換異常。
abstract關(guān)鍵字
1、abstract用于類表示這個類為抽象類,不能實例化。
2、抽象類,必須由子類去繼承,繼承的子類必須實現(xiàn)父類中所有的抽象方法,否則子類也是抽象的;
3、抽象函數(shù)必須放在抽象類中;抽象類中除了抽象函數(shù),還可以定義所有一般類中可以定義的成員;
4、抽象類中可以不書寫抽象方法;抽象類中必須有構(gòu)造方法;抽象類一定是父類;
5、抽象類是父類,用來描述所有子類的共性信息的,只是描述的有些功能是不具體的;
6、abstract用于方法表示這個方法為抽象方法,只需聲明,不用實現(xiàn),由子類實現(xiàn),抽象方法不能用private和static關(guān)鍵字。什么時候用abstract關(guān)鍵字? 當(dāng)事物的功能描述不清,只能表示有這個功能時,就應(yīng)該使用抽象修飾該功能,這個功能就是抽象的功能;如果一個類中有抽象的功能,那么這個類也是抽象的類;不想實例化這個類(包括自己也不行),但是允許別人繼承,也可以使用抽象類。
this關(guān)鍵字
1、表示自身所屬對象的引用;哪個對象調(diào)用this,this就指向哪個對象;
2、Java關(guān)鍵字this只能用于方法方法體內(nèi)。當(dāng)一個對象創(chuàng)建后,Java虛擬機(JVM)就會給這個對象分配一個引用自身的指針,這個指針的名字就是this。因此,this只能在類中的非靜態(tài)方法中使用,靜態(tài)方法和靜態(tài)的代碼塊中絕對不能出現(xiàn)this.什么時候用this關(guān)鍵字?
1、通過this調(diào)用另一個構(gòu)造方法,用法:this(參數(shù)列表),這個僅僅在類的構(gòu)造方法中,別的地方不能這么用。如果一個構(gòu)造函數(shù)中有this()語句,就沒有隱式三步,隱式三步在this語句調(diào)用的那個構(gòu)造函數(shù)中,且this語句必須在第一行的位置;
2、函數(shù)參數(shù)或者函數(shù)中的局部變量和成員變量同名的情況下,成員變量被私有化,此時要訪問成員變量則需要用“this.成員變量名”的方式來引用成員變量。(用來區(qū)分成員變量和局部變量)
3、在函數(shù)中,需要引用該函所屬類的當(dāng)前對象時候,直接用this。
super關(guān)鍵字
1、表示父類;可以在子類中調(diào)用父類的非私有成員和構(gòu)造函數(shù);
2、調(diào)用方法:
調(diào)用父類構(gòu)造函數(shù):super(參數(shù));(父類中沒有無參構(gòu)造函數(shù)在父類中添
加一個無參構(gòu)造;在子類中手動調(diào)用有參構(gòu)造函數(shù))調(diào)用父類成員變量:super.變量名; 調(diào)用父類成員函數(shù):super.函數(shù)名(參數(shù));
3、super關(guān)鍵和this作用類似,是被私有的成員變量或者成員方法變?yōu)榭梢姡蛘哒f用來引用被私有的成員變量和成員方法,不過super是用在子類中,目的是訪問直接父類中被屏蔽的成員.什么時候用super關(guān)鍵字?
如果父類中沒有無參構(gòu)造函數(shù)是,需要在子類中用super調(diào)用有參構(gòu)造函數(shù);
第三篇:java 調(diào)用webservice的各種方法總結(jié)
一、利用jdk web服務(wù)api實現(xiàn),這里使用基于 SOAP message 的 Web 服務(wù)
1.首先建立一個Web services EndPoint:
Java代碼
package Hello;
import javax.jws.WebService;
import javax.jws.WebMethod;
import javax.xml.ws.Endpoint;
@WebService
public class Hello {
@WebMethod
public String hello(String name){
return “Hello, ” + name + “n”;}
public static void main(String[] args){
// create and publish an endpoint
Hello hello = new Hello();
Endpoint endpoint Endpoint.publish(“http://localhost:8080/hello”, hello);
} }
=
2.使用 apt 編譯 Hello.java(例:apt-d [存放編譯后的文件目錄] Hello.java),會生成 jaws目錄
3.使用java Hello.Hello運行,然后將瀏覽器指向http://localhost:8080/hello?wsdl就會出現(xiàn)下列顯示
4.使用wsimport 生成客戶端
使用如下:wsimport-p.-keep http://localhost:8080/hello?wsdl
5.客戶端程序:
Java代碼
1.class HelloClient{ 2.3.public static void main(String args[]){ 4.5.HelloService service = new HelloService();6.7.Hello helloProxy = service.getHelloPort();8.9.String hello = helloProxy.hello(“你好”);10.11.System.out.println(hello);12.13.} 14.15.} 16.二、使用xfire,我這里使用的是myeclipse集成的xfire進行測試的
利用xfire開發(fā)WebService,可以有三種方法:
1一種是從javabean 中生成;
一種是從wsdl文件中生成;
還有一種是自己建立webservice
步驟如下:
用myeclipse建立webservice工程,目錄結(jié)構(gòu)如下:
首先建立webservice接口,代碼如下:
Java代碼
1.package com.myeclipse.wsExample;2.3.//Generated by MyEclipse 4.5.6.7.public interface IHelloWorldService { 8.9.10.11.public String example(String message);12.13.14.15.} 16.Java代碼
1.package com.myeclipse.wsExample;2.3.//Generated by MyEclipse 4.5.6.7.public class HelloWorldServiceImpl implements IHelloWorldService { 8.9.10.11.public String example(String message){ 12.13.return message;14.15.} 16.17.18.19.} 20.修改service.xml 文件,加入以下代碼:
Xml代碼
1.2.3.
客戶端實現(xiàn)如下:
Java代碼
1.package com.myeclipse.wsExample.client;2.3.import java.net.MalformedURLException;4.5.import java.net.URL;6.7.8.9.import org.codehaus.xfire.XFireFactory;10.11.import org.codehaus.xfire.client.Client;12.13.import org.codehaus.xfire.client.XFireProxyFactory;14.15.import org.codehaus.xfire.service.Service;16.17.import org.codehaus.xfire.service.binding.ObjectServiceFactory;18.19.20.21.import com.myeclipse.wsExample.IHelloWorldService;22.23.24.25.public class HelloWorldClient { 26.27.public static void main(String[] args)throws MalformedURLException, Exception { 28.29.// TODO Auto-generated method stub 30.31.Service s=new ObjectServiceFactory().create(IHelloWorldService.class);32.33.XFireProxyFactory xf=new XFireProxyFactory(XFireFactory.newInstance().getXFire());34.35.String url=“http://localhost:8989/HelloWorld/services/HelloWorldService”;36.37.38.39.try 40.41.{ 42.43.44.45.IHelloWorldService hs=(IHelloWorldService)xf.create(s,url);46.47.String st=hs.example(“zhangjin”);48.49.System.out.print(st);50.51.} 52.53.catch(Exception e)54.55.{ 56.57.e.printStackTrace();58.59.} 60.61.} 62.63.64.65.} 66.這里再說點題外話,有時候我們知道一個wsdl地址,比如想用java客戶端引用.net 做得webservice,使用myeclipse引用,但是卻出現(xiàn)無法通過驗證的錯誤,這時我們可以直接在類中引用,步驟如下:
Java代碼
1.public static void main(String[] args)throws MalformedURLException, Exception { 2.3.// TODO Auto-generated method stub 4.5.Service s=new ObjectServiceFactory().create(IHelloWorldService.class);6.7.XFireProxyFactory xf=new XFireProxyFactory(XFireFactory.newInstance().getXFire());8.9.10.11.//遠程調(diào)用.net開發(fā)的webservice 12.13.Client c=new Client(new URL(“http://004km.cn/axis2/
同理,也需要將axis2復(fù)制到webapp目錄中
在axis2中部署webservice有兩種方法,第一種是pojo方式,這種方式比較簡單,但是有一些限制,例如部署的類不能加上包名
第二種方式是利用xml發(fā)布webservice,這種方法比較靈活,不需要限制類的聲明
下面分別說明使用方法:
1.pojo方式:在Axis2中不需要進行任何的配置,就可以直接將一個簡單的POJO發(fā)布成WebService。其中POJO中所有的public方法將被發(fā)布成WebService方法。先實現(xiàn)一個pojo類:
Java代碼
1.public class HelloWorld{ 2.3.public String getName(String name)4.5.{ 6.7.return ”你好 “ + name;8.9.} 10.11.public int add(int a,int b)12.13.{ 14.15.return a+b;16.17.} 18.19.} 20.由于這兩個方法都是public類型,所以都會發(fā)布成webservice。編譯HelloWorld類后,將HelloWorld.class文件放到%tomcat%webappsaxis2WEB-INFpojo目錄中(如果沒有pojo目錄,則建立該目錄),然后打開瀏覽器進行測試:
輸入一下url:
http://localhost:8080/axis2/services/listServices
會列出所有webservice
這是其中的兩個webservice列表,接著,在客戶端進行測試:
首先可以寫一個封裝類,減少編碼,代碼如下:
Java代碼
1.package MZ.GetWebService;2.3.import javax.xml.namespace.QName;4.5.6.7.import org.apache.axis2.AxisFault;8.9.import org.apache.axis2.addressing.EndpointReference;10.11.import org.apache.axis2.client.Options;12.13.import org.apache.axis2.rpc.client.RPCServiceClient;14.15.16.17.18.19.public class GetWSByAxis2 { 20.21.private static String EndPointUrl;22.23.private static String QUrl=”http://ws.apache.org/axis2“;
24.25.private QName opAddEntry;26.27.public String WSUrl;28.29.public RPCServiceClient setOption()throws AxisFault 30.31.{ 32.33.RPCServiceClient serviceClient = new RPCServiceClient();34.35.Options options = serviceClient.getOptions();36.37.EndpointReference targetEPR = new EndpointReference(WSUrl);38.39.options.setTo(targetEPR);40.41.return serviceClient;42.43.} 44.45.46.47.public QName getQname(String Option){ 48.49.50.51.return new QName(QUrl,Option);52.53.} 54.55.//返回String 56.57.public String getStr(String Option)throws AxisFault 58.59.{ 60.61.RPCServiceClient serviceClient =this.setOption();62.63.64.65.opAddEntry =this.getQname(Option);66.67.68.69.String str =(String)serviceClient.invokeBlocking(opAddEntry, 70.71.new Object[]{}, new Class[]{String.class })[0];72.73.return str;74.75.} 76.77.// 返回一維String數(shù)組 78.79.public String[] getArray(String Option)throws AxisFault
80.81.{ 82.83.RPCServiceClient serviceClient =this.setOption();84.85.86.87.opAddEntry =this.getQname(Option);88.89.90.91.String[] strArray =(String[])serviceClient.invokeBlocking(opAddEntry, 92.93.new Object[]{}, new Class[]{String[].class })[0];94.95.return strArray;96.97.} 98.99.//從WebService中返回一個對象的實例
100.101.public Object getObject(String Option,Object o)throws AxisFault 102.103.{ 104.105.RPCServiceClient serviceClient =this.setOption();106.107.QName qname=this.getQname(Option);108.109.Object object = serviceClient.invokeBlocking(qname, new Object[]{},new Class[]{o.getClass()})[0];110.111.return object;112.113.} 114.115.116.117.///////////////////////////////////////// 讀者可以自己封裝數(shù)據(jù)類型,如int,byte,float等數(shù)據(jù)類型
118.119.} 120.客戶端調(diào)用方法:
Java代碼
1.MZ.GetWebService.GetWSByAxis2 ws=new MZ.GetWebService.GetWSByAxis2();2.3.ws.WSUrl=”http://localhost:8989/axis2/services/HelloWorld“;4.5.HelloWorld hello=(HelloWorld)ws.getObject(”getName“, HelloWorld.class);6.7.8.9.10.11.System.out.println(hello.getName(”zhangjin“));12.2.使用service.xml發(fā)布webservice,這種方式和直接放在pojo目錄中的POJO類不同。要想將MyService類發(fā)布成Web Service,需要一個services.xml文件,這個文件需要放在META-INF目錄中,該文件的內(nèi)容如下:
Xml代碼
1.
http://localhost:8080/axis2/services/myService?wsdl
除此之外,還有直接可以在其中制定webservice操作方法:可以這樣些service.xml文件
Java代碼
1. 10.11.service.HelloWorld 12.13. 14.15.
第四篇:Java開發(fā)筆記 — HttpServletRequest方法總結(jié)
Java開發(fā)筆記 — HttpServletRequest方法總結(jié)
HttpServletRequest方法總結(jié)
getScheme()方法返回請求的計劃,比如http,https或者ftp.getServerName()方法返回被發(fā)送請求的服務(wù)器的主機名 getServerPort()方法返回被發(fā)送請求的端口號。
getContextPath()返回請求地址的根目錄,以“/”開關(guān),但不是以“/”結(jié)尾。
一個常用的獲得服務(wù)器地址的連接字符串是: String path = request.getContextPath();String basePath = request.getScheme()+“://”+request.getServerName()+“:”+request.getServerPort()+path+“/”;getCookies()取得cookie
getMethod()取得請求方法,如get,post或put getRequestURL()取得請求URL(統(tǒng)一資源定位符)getRequestURI()取得請求URI(統(tǒng)一資源標(biāo)識符)getSession()取得對應(yīng)session getHeaderNames()返回請求包含的所有頭名稱的一個enumeration(遍歷器)使用方法如下:
Enumeration en = request.getHeaderNames();while(en.hasMoreElements()){
out.print(en.nextElement());
} 輸出如下結(jié)果:
accept accept-language accept-encoding user-agent host connection cookie 具體含義是:
Accept:瀏覽器可接受的MIME類型。
Accept-Language:瀏覽器所希望的語言種類,當(dāng)服務(wù)器能夠提供一種以上的語言版本時要用到。
Accept-Encoding:瀏覽器能夠進行解碼的數(shù)據(jù)編碼方式,比如gzip。Servlet能夠向支持gzip的瀏覽器返回經(jīng)gzip編碼的HTML頁面。許多情形下這可以減少5到10倍的下載時間。
User-Agent:瀏覽器類型,如果Servlet返回的內(nèi)容與瀏覽器類型有關(guān)則該值非常有用。Host:初始URL中的主機和端口。
Connection:表示是否需要持久連接。如果Servlet看到這里的值為“Keep-Alive”,或者看到請求使用的是HTTP 1.1(HTTP 1.1默認進行持久連接),它就可以利用持久連接的優(yōu)點,當(dāng)頁面包含多個元素時(例如Applet,圖片),顯著地減少下載所需要的時間。要實現(xiàn)這一點,Servlet需要在應(yīng)答中發(fā)送一個Content-Length頭,最簡單的實現(xiàn)方法是:先把內(nèi)容寫入 ByteArrayOutputStream,然后在正式寫出內(nèi)容之前計算它的大小。
Cookie:這是最重要的請求頭信息之一
getHeader(name)返回指定名稱的特定請求的值。使用方法如下:
out.print(“cookie:===”+request.getHeader(“cookie”)+“
”);完整舉例: accept:===*/* accept-language:===zh-cn accept-encoding:===gzip, deflate user-agent:===Mozilla/4.0(compatible;MSIE 6.0;Windows NT 5.1;SV1;TheWorld)host:===localhost:8080 connection:===Keep-Alive cookie:===JSESSIONID=BF00F7FD72F5DF83DF8F62E3D5EFF960
第五篇:學(xué)習(xí)Java的方法
學(xué)習(xí)Java的方法
就我個人而言,是不太喜歡java的,更傾向于C++。
很多網(wǎng)友朋友問我學(xué)習(xí)Java有沒有什么捷徑,我說“沒有,絕對沒有!”。但是我卻很愿意將自己學(xué)習(xí)的一些經(jīng)驗寫出來,以便后來者少走彎路,幫助別人是最大的快樂嘛!
要想學(xué)好Java,首先要知道Java的大致分類。我們知道,自從Sun推出Java以來,就 力圖使之無所不包,所以Java發(fā)展到現(xiàn)在,按應(yīng)用來分主要分為三大塊:J2SE,J2ME和 J2EE,這也就是Sun ONE(Open Net Environment)體系。J2SE就是Java2的標(biāo)準(zhǔn)版,主要 用于桌面應(yīng)用軟件的編程;J2ME主要應(yīng)用于嵌入是系統(tǒng)開發(fā),如手機和PDA的編程; J2EE是Java2的企業(yè)版,主要用于分布式的網(wǎng)絡(luò)程序的開發(fā),如電子商務(wù)網(wǎng)站和ERP系統(tǒng)。J2SE開發(fā)桌面應(yīng)用軟件比起VC,VB,DEPHI這些傳統(tǒng)開發(fā)語言來說,優(yōu)勢好象并不明顯。J2ME對于初學(xué)者來說,好象又有點深奧,而且一般開發(fā)者很難有開發(fā)環(huán)境。所以現(xiàn)在應(yīng)用最廣泛又最好學(xué)的就是J2EE了。J2EE又包括許多組件,如 Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要學(xué)習(xí)起來可不是一兩天的事。
那么又該如何學(xué)習(xí)J2EE呢?當(dāng)然Java語法得先看一看的,I/O包,Util包,Lang包你都熟悉了嗎?然后再從JSP學(xué)起。如果你學(xué)過HTML,那么事情要好辦的多,如果沒有,那你快去補一補HTML基礎(chǔ)吧。其實JSP中的Java語法也不多,它更象一個腳本語言,有 點象ASP。然后你就該學(xué)一學(xué)Servlet了。Servlet就是服務(wù)器端小程序,他負責(zé)生成發(fā)送給客戶端的HTML文件。JSP在執(zhí)行時,也是先轉(zhuǎn)換成Servlet再運行的。雖說JSP理論上可以完全取代Servlet,這也是SUN推出JSP的本意,可是Servlet用來控制流程跳轉(zhuǎn)還
是挺方便的,也令程序更清晰。接下來你應(yīng)該學(xué)習(xí)一下Javabean了,可能你早就看不管 JSP在HTML中嵌Java代碼的混亂方式了,這種方式跟ASP又有什么區(qū)別呢?還好,SUN提供了Javabean可以把你的JSP中的Java代碼封裝起來,便于調(diào)用也便于重用。接著就是 EJB了,EJB就是Enterprise JavaBean,看名字好象它是Javabean,可是它和Javabean還是有區(qū)別的。它是一個體系結(jié)構(gòu),你可以搭建更安全、更穩(wěn)定的企業(yè)應(yīng)用。它的大量代 碼已由中間件(也就是我們常聽到的Weblogic,Websphere這些J2EE服務(wù)器)完成了,所
以我們要做的程序代碼量很少,大部分工作都在設(shè)計和配置中間件上。至于JDBC,就不用我多說了,你如果用java編過存取數(shù)據(jù)庫的程序,就應(yīng)該很熟悉。還有,如果你要用 Java編發(fā)送電子郵件的程序,你就得看看Javamail了。
好了,對Java和J2EE有了一些基本概念之后,你就應(yīng)該編一些程序了,千萬不要紙 上談兵哦。最好找一些有實例且?guī)Ч獗P的書來看,這樣看到好的程序就可以直接Ctrl+C 再Ctrl+V,也不用勞您老大架再親自把它 再輸一遍吧,再說直接復(fù)制還不用怕出錯,何樂而不為呢!還有就是要經(jīng)常上一些好的Java編程文章,有好的文章要Cut下來,有問題盡管問,只要問題不是太傻,一般高手都會回答你的。下面介紹幾個好的Java方面的編程網(wǎng)站:CSDN論壇 http:/// 那里Java資料比較全;
java.com.cn http://.cn/ 看這域名就知道有多牛,注冊用戶快接近一 萬了,同時 1
在線人數(shù)也在一千左右,人氣很旺的;
IBM的開發(fā)者網(wǎng)絡(luò) http://
IBM永遠的藍色巨人!!
那么我書也看了,程序也做了,別人問我的問題我都能解決了,是不是就成為高手 了呢?當(dāng)然沒那么簡單,這只是萬里長征走完了第一步。不信?那你出去接一個項目,你知道怎么下手嗎,你知道怎么設(shè)計嗎,你知道怎么組織人員進行開發(fā)嗎?你現(xiàn)在腦子里除了一些散亂的代碼之外,可能再沒有別的東西了吧!你現(xiàn)在最缺的是實際的工作經(jīng)驗,而不是書本上那些憑空想出來的程序。所以你快去找一份Java的編程工作來做吧(如果是在校學(xué)生可以去做兼職啊),在實踐中提高自己,那才是最快的。不過你得祈
禱在公司里碰到一個高手,而且他還愿意不厭其煩地教你,這樣好象有點難哦!
還有一個辦法就是讀開放源碼的程序了。我們知道開放源碼大都出自高手,他們設(shè) 計合理,考慮周到,再加上有廣大的程序員參與,代碼的價值自然是字字珠嘰,鏗鏘有 力(對不起,偶最近《金裝四大才子》看多了)。學(xué)Java必讀的兩個開源程序就是Jive 和Pet Store.。Jive是國外一個非常著名的BBS程序,完全開放源碼。論壇的設(shè)計采用 了很多先進的技術(shù),如Cache、用戶認證、Filter、XML等,而且論壇完全屏蔽了對數(shù)據(jù)庫的訪問,可以很輕易的在不同數(shù)據(jù)庫中移植。論壇還有方便的安裝和管理程序,這是我們平時編程時容易忽略的一部份(中國程序員一般只注重編程的技術(shù)含量,卻完全不考慮用戶的感受,這就是我們與國外軟件的差距所在)。Jive的資料在很多網(wǎng)站上都有,大家可以找來研究一下。相信你讀完代碼后,會有脫胎換骨的感覺。遺憾的是Jive 從2.5以后就不再無條件的開放源代碼,同時有l(wèi)icence限制。不過幸好還有中國一流的Java程序員關(guān)注它,外國人不開源了,中國人就不能開源嗎?這里向大家推薦一個漢化的Jive版本—J道。Jive(J道版)是由中國Java界大名鼎鼎的banq在Jive 2.1版本基礎(chǔ)上 改編而成, 全中文,增加了一些實用功能,如貼圖,用戶頭像和用戶資料查詢等,而且有一個開發(fā)團隊在不斷升級。你可以訪問banq的網(wǎng)站http:/// 去下載,或到同濟技術(shù)論壇的服務(wù)器上ftp://nro.shtdu.edu.cn去下,安裝上有什么問題,可以到論壇上去提問。Pet Store.(寵物店)是SUN公司為了演示其J2EE編程規(guī)范而推出的開放源碼的程序,應(yīng)該很具有權(quán)威性,想學(xué)J2EE和EJB的朋友不要錯過了。
你一定會高興地說,哈哈,原來成為Java高手就這么簡單啊!記得Tomjava也曾碰到過一個項目經(jīng)理,號稱Java很簡單,只要三個月就可以學(xué)會。其實說這種話的人就如當(dāng)年小日本號稱“三個月拿下中國”一樣大言不慚。不是Tomjava潑你冷水,你現(xiàn)在只是學(xué)到了Java的骨架,卻還沒有學(xué)到Java的精髓。接下來你得研究設(shè)計模式了。設(shè)計模式是高級程序員真正掌握面向?qū)ο蠛诵乃枷氲谋匦拚n。設(shè)計模式并不是一種具體“技術(shù)”, 它講述的是思想,它不僅僅展示了接口或抽象類在實際案例中的靈活應(yīng)用和智慧,讓你
能夠真正掌握接口或抽象類的應(yīng)用,從而在原來的Java語言基礎(chǔ)上躍進一步,更重要的是,設(shè)計模式反復(fù)向你強調(diào)一個宗旨:要讓你的程序盡可能的可重用。關(guān)于設(shè)計模式的資料,還是向大家推薦banq的網(wǎng)站http:///,他把GOF的23種模式以通俗易懂的方式詮釋出來,純Java描述,真是經(jīng)典中的經(jīng)典。有時間再研究一下MVC結(jié)構(gòu)(把Model-View-Control分離開的設(shè)計思想)吧,現(xiàn)在很流行的Structs就是它的一種實現(xiàn)方式,不過Structs用起來實在是很繁,我們只要學(xué)習(xí)其精髓即可,我們完全可以設(shè)計自己的MVC結(jié)構(gòu)。然后你再研究一下軟件Refactoring(重整)和極限XP編程,相信你 又會上一個臺階。做完這些,你不如整理一下你的Java代碼,把那些經(jīng)典的程序和常見的應(yīng)用整理出來,再精心打造一番,提高其重用性和可擴展性。你再找?guī)讉€志同道合的朋友成立一個工作室吧,你可以去承接一些項目做了,一開始可能有些困難,可是你有技術(shù)積累,又考慮周全,接下項目來可以迅速作完,相信大家以后都會來找你的,所以Money就嘩啦啦的 來了。。。當(dāng)然你也可以參加一些開源項目,一方面可以提高自己,另一方面也是為中國軟件事業(yè)做貢獻嘛!開發(fā)者在互聯(lián)網(wǎng)上用CVS合作開發(fā),用QQ,MSN,E-mail討論聯(lián)系,天南海北的程序員分散在各地卻同時開發(fā)同一個軟件,是不是很有意思呢?
下面介紹兩個好的開源項目網(wǎng)站:
湖北省軟件公共開發(fā)平臺http://gro.clinux.org/
共創(chuàng)聯(lián)盟http://cosoft.org.cn/
哇,好高興哦,我終于成為高手了!非也,非也。古人云:“山外有山、人外有人”。
你知道計算機界現(xiàn)在的發(fā)展形勢嗎?你知道微軟的.NET藍圖和SUN ONE計劃之間的明爭暗斗嗎?你知道計算機技術(shù)將向何處發(fā)展嗎?其實從各大計算機廠商最近的動作,都可以看出來“Web服務(wù)將是下一代互聯(lián)網(wǎng)應(yīng)用的制高點”,而微軟的.NET藍圖和SUN ONE計劃的斗爭焦點,也就是Web服務(wù)。Web服務(wù)就是一個嶄新的分布式計算模型,它是一系列標(biāo)準(zhǔn)的綜合(XML,SOAP,UDDI,WSDL和WSFL等)。它使得不同語言編寫的軟件能夠輕易的集成起來,使網(wǎng)絡(luò)資源和Web站點變成一種服務(wù)而不是混亂的垃圾場。不遠的將來,我們就可以在家里點擊一下鼠標(biāo),就可以完成出門旅游的全部準(zhǔn)備工作,包括定飛機票,定旅游線路,定好房間等。請注意,這所有的一切都是Web站點間自動完成的,再也不用象現(xiàn)在一樣,表面上是電子商務(wù),實際上很多環(huán)節(jié)都是人工操作。也許你會覺得這是天方夜談,不過就近的說,你也很有可能承接一個項目,要集成兩個企業(yè)的ERP系統(tǒng)。很有可能上游企業(yè)的系統(tǒng)是用Dephi編的,而下游企業(yè)的系統(tǒng)是用Java編的。你說你是Java高手,大家都看者你怎么做呢。所以啊,你還得學(xué)習(xí)新技術(shù),如Web服務(wù),而且你Dephi也要懂一點吧(Dephi6現(xiàn)在已經(jīng)提供Web服務(wù)的控件了)。你編的Java系統(tǒng),可能要和.NET集成,所以你.NET要懂一點吧?到最后,你可能發(fā)現(xiàn)你已經(jīng)成為Java高手了,但很多時間卻在搞別的技術(shù)。太極張三豐里說,最厲害的招式就是沒有招式,可能就是這個道理吧!
因為剛剛興起,所以網(wǎng)上Web服務(wù)的資料不是很多,我還是給大家推薦幾個網(wǎng)站吧:中國UDDI技術(shù)聯(lián)盟http:///developerWorks/cn/xml/index.shtml?csdn IBM可是Web服務(wù)的力推者