1. XFire介紹<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
XFire和Axis都是新一代的java web服務框架。XFire提供了非常方便的API,使用這些API可以開發面向服務(SOA)的程序。他比axis性能要高,支持各種標準,性能優良,基於低內存的STAX模型,也是其於流的XML。
• 支持多個重要的Web Service標準,包括SOAP、WSDL、WS-I Basic Profile、 WSAddressing、WS-Security等
• 高性能的SOAP棧
• 可選的綁定(binding)方式,如POJO、XMLBeansJAXB1.1、JAXB2.0、CastorJiBX等
• 支持JSR181 API
• 多種傳輸方式,如HTTP、JMS、XMPP、In-JVM等
• 靈活的接口
• 支持多個容器,如Spring、Pico
關於XFire就知道這麼多,關於它的更祥細的資料或更深層次東西,就不去研究了,當然關於webservice的基本的知識還要學習的。作爲技術人員不能光知其然,不知其所以然。(行了,又廢話了)。
2. 準備
在開始介紹開發實例之前,你首先要準備工具有:eclipse、Myeclipse、weblogic8,當然你也可以自己下載最新xfire。http://repository.codehaus.org/org/codehaus/xfire/xfire-distribution/1.2.6/xfire-distribution-1.2.6.zip都準備好了 ,那就正式開工吧!
3. 開發
l 服務端
首先,eclipse新建一個webservice工程
<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />
工程名字就叫JuneService,web root、content root都爲June
一路next後,點擊”Finish”,會看到如下結構,有了工具就是好,什麼東西都自己生成,那先看看WEB-INF/web.xml都生成了什麼吧。。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<servlet>
<servlet-name>XFireServlet</servlet-name>
<servlet-class>
org.codehaus.xfire.transport.http.XFireConfigurableServlet
</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>XFireServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
在這個web.xml文件中定義了一個 XfireServlet,它負責提供Web Services,並提供
每個Web Service的WSDL。如果你發佈了一個Web Service,比如叫JuneService,你
就可以通過網址http://<server_url[:port]>/<context>/ services/JuneService來訪問這個Web Service,並且通過網址http://<server_url[:port]>/<context>/
services/BookService?WSDL得到這個Web Service的WSDL信息。
在源文件夾WEB-INF/src下新建一個java package:com.june,在這個package下新建一個接口JuneService,(往往很多文章在介紹某項技術怎麼用時,都會用helloworld這個例子,這個例子確實應用廣泛,不過,咱換一種例子,或都另一種方式的HelloWorld)
這個接口定義了只定義了一個addDate方法。這個方法要求傳入一個整數的參數,返回類型爲一個字符串,用來得到當的時間的加上n天以後的日期,也很簡單吧。。
package com.june;
public interface JuneService {
public String addDate(int d);
}
最寫一個實現這個接口的類
package com.june;
import java.util.Calendar;
public class JuneServiceImpl implements JuneService {
public String addDate(int d) {
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, d);
SimpleDateFormat dateFormat = new SimpleDateFormat();
dateFormat.applyPattern("yyyy年MM月dd日");
return dateFormat.format(cal.getTime());
}
}
實現的很簡單,就是加上天數後,直接tostring反回就可以了。
現在看來很簡單吧,webserice的類跟普通的沒有什麼區別。好,繼續吧。在WebServices目錄下有一個services.xml文件,他就是用來發布你上面的這兩個類做爲webservice的,好,我們來配置一下這個文件。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xfire.codehaus.org/config/1.0">
<service>
<name>HelloService</name>
<namespace>http://services.june.come/JuneService</namespace>
<serviceClass>
com.june.JuneService
</serviceClass>
<implementationClass>
com.june.JuneServiceImpl
</implementationClass>
</service>
</beans>
好了,services.xml配置好了,關於services.xml配置結構這裏也不說明了,大家可以去查資料,這裏能說明問題就行了,那我就開始發佈我們的webservice吧!說明一點,如果使用的不是eclipse工具,你可能要手動裝services.xml文件考到WEB-INF/classes/META-INF/xfire下面。但是myeclipe都不用你關心這些事情,它替你搞定。
那就先發布到weblogic上,啓動服務。在地址裏輸入http://localhost:7001/June/services
這個問題是怎麼會事,難道是配置錯了,可是查來查去沒有什麼錯誤呀。那到google上找(真不知道現在程序員如果沒有Google會是什麼樣?),找了好長時間,終於在xfire的官網上找到相關的資料。如下:
Qname.jar 下載地址:http://docs.codehaus.org/download/attachments/27836/qname.jar?version=1
原來發生錯誤原因,是因爲weblogic.jar包的qname.jar太舊了,確切的說是 qname.class,好那就按照解決方法做,把qname.jar加到工程中,在weblogic server也加上qname.jar,還要在startweblogic.cmd的classpath里加放%WL_HOME%/server/lib/qname.jar,或是直接替換weblogic.jar裏的qname.class,這樣啓動時就會用這個新包了。加入weblogic.xml就是要用戶自己的jar先於系統的jar加載。好了,再重啓一下服務。
再輸入地址http://localhost:7001/June/services,好,終於看我們期盼已久的界面了。這樣我們webservice服務就發佈成功了。
l 客戶端
有了服務端,那我們就應用一下,下面我們來做webservice的客戶端。
首先建一個java application工程。就叫JuneClient吧,這個工程很簡單,什麼也沒有,那我先建一下src源目錄,並做爲建我們的java package com.june,client來做爲webservice的客戶端。在工程上右鍵new->others選擇webservice client.
然後,next按照提示來設置。
Wsdl url填寫剛發佈成功的webservice的地址http://localhost:7001/June/services/JuneService?wsdl
這一步next,我這裏的eclipse會報web 服務描述語言有錯誤,直接finish就OK了
這樣,myeclipse就會自動生成客戶端所需要的程序,有了工具確實是很方便,這樣確實提高了開發效率,但是也造成了許多程序員沒有工具就不會寫程序,工具一通搞定,具體裏面的關係也不用管,我覺得程序員不光要會用工具,還要知道工具怎麼來實現的,爲什麼要設置這一步,在沒有工具情況下,我應該先從那做起,明白原理後,再利於工具,才能對你有所提高。才能提高對整個系統的整體把握。不光要知其然,還要知其所然,這纔是搞技術應有的態度。(哎,又廢話了)
既然,自動生成了客戶端程序,我們就來測試一下我們的webservice。
package com.june.client;
import com.june.client.JuneServiceClient;
import com.june.client.JuneServicePortType;
public class JuneClientMain {
public static void main(String[] args) {
JuneServiceClient client = new JuneServiceClient();
JuneServicePortType juneService = client.getJuneServiceHttpPort();
// 調用服務
String result = juneService.addDate(21);
System.out.println(result);
}
以上爲通過webservice客戶端調用web服務的一個例子,我調用webservice的addDate()方法,參數傳入21,然後運行這個程序。也就是說通過webservice應該返回當前日期加上21天那天的日期是多少,結果是:2008年08月08日。正好是北京奧運會的日子,好日子呀,哈哈。。
好了,其實webservice在好多地方都可以佈署,也可以在web應用下,也可以桌面應用,C++、C#、VB等等。只要你提供相應的WSDL,告訴調用者相應的接口方法,只需傳入相應的參數,就能得到你想要的結果。
關鍵點:
l
l
l
l