速動(dòng)畫教程第二十五集 使用 xfire 開(kāi)發(fā) web service 應(yīng)用
速動(dòng)畫教程第二十五集? 使用 xfire 開(kāi)發(fā) web service 應(yīng)用
下載地址: http://this.oksonic.cn
在這里請(qǐng)大家?guī)兔Γ心俏慌笥咽褂眠^(guò)
xfire
開(kāi)發(fā)客戶端的話,請(qǐng)與我聯(lián)系!
聯(lián)系方法見(jiàn)文章結(jié)尾處
制作工具:Eclipse3.2?? MyEclipse5.0m2?? Tomcat5.5.x
一、一個(gè)簡(jiǎn)單的 web service
?? 新建一個(gè) web service 工程,名稱為 xfire
?? 新建一個(gè) java 文件,名稱為 Hello.java,內(nèi)容如下:
-------------------------------------------------------------------------------------
package
com.test;
public
class
Hello {
???
public
String getName(String name){
??????
return
"Hello world "
+ name;
??? }
}
-------------------------------------------------------------------------------------
? 修改Web Services目錄下的 services.xml 文件,內(nèi)容如下:
-------------------------------------------------------------------------------------
<
beans
xmlns
=
"http://xfire.codehaus.org/config/1.0"
>
???
<
service
>
??????
<
name
>
Hello
</
name
>
??????
<
namespace
>
http://www.oksonic.cn/xfire
</
namespace
>
??????
<
serviceClass
>
com.test.Hello
</
serviceClass
>
???
</
service
>
</
beans
>
-------------------------------------------------------------------------------------
?
<
name
>
Hello
</
name
>
?
服務(wù)名稱
?
<
serviceClass
>
com.test.Hello
</
serviceClass
>
?
服務(wù)類
?
現(xiàn)在可以部署項(xiàng)目,使用以下鏈接訪問(wèn):
?
http://localhost/xfire/services/Hello?wsdl
?
注:我的端口已經(jīng)修改為80,如果沒(méi)有修改過(guò)的話請(qǐng)使用
http://localhost:8080/xfire/services/Hello?wsdl
? 網(wǎng)上原有的教程中提到可以使用 http://localhost/xfire/services/ 訪問(wèn),但測(cè)試時(shí)出現(xiàn)無(wú)法連接
? 頁(yè)面中出現(xiàn) xml 文件內(nèi)容表示服務(wù)正常
二、使用 jsr181 風(fēng)格
---------------------
介紹 摘抄自 XFire 實(shí)戰(zhàn)? ------------------------
? JSR 181通過(guò)標(biāo)準(zhǔn)化一個(gè)易于學(xué)習(xí)且可以快速開(kāi)發(fā)的Web服務(wù)簡(jiǎn)單編程模型,從而刺激了對(duì)Web服務(wù)的采用。一直以來(lái),J2EE開(kāi)發(fā)人員要開(kāi)發(fā)和部署Web服務(wù)就必須掌握相當(dāng)多的信息。通過(guò)使用J2SE 5.0中的新增注釋功能,Java軟件源代碼可以使用JSR 181注釋進(jìn)行注釋,從而聲明式地定義所需的Web服務(wù)行為。這使開(kāi)發(fā)人員可以將注意力集中在Web服務(wù)的應(yīng)用邏輯上而無(wú)需擔(dān)心復(fù)雜的API、協(xié)議和部署描述符。
BEA官方網(wǎng)站有一篇
“
web服務(wù)元數(shù)據(jù)簡(jiǎn)介
”
,對(duì)理解JSR 181規(guī)范很有幫助。
這一節(jié)的例子和上一節(jié)的例子很相似,或者通過(guò)使用java注釋,比上一節(jié)的POJO稍微復(fù)雜了一點(diǎn)。不是說(shuō)JSR 181節(jié)省了很多的配置信息嗎?鄙人認(rèn)為可以從這個(gè)方面來(lái)理解,正常情況下,POJO如果配置到其他webservices框架下,比如axis2、Celtix、weblogic等容器中,必然需要編寫適合這些容器的配置文件,以便這些容器能夠識(shí)別這個(gè)POJO類是wenservices,并根據(jù)配置文件中的比如命名空間、參數(shù)類型、web服務(wù)的方法等信息提供web服務(wù)。而通過(guò)jsr 181規(guī)范中的定義可以自動(dòng)識(shí)別這些信息,這樣這些信息不必在每個(gè)容器中所配置,這些容器通過(guò)java注釋就可以得到這些信息,所以說(shuō)jsr181在這方面進(jìn)行了簡(jiǎn)化。XFire通過(guò)services.xml文件得到哪個(gè)類被定義為web服務(wù), XFire可以通過(guò)java注釋來(lái)獲取web服務(wù)的相關(guān)信息。
-------------------------------------------------------------------------------------
? 修改 Hello.java 文件,內(nèi)容如下:
-------------------------------------------------------------------------------------
package
com.test;
import
javax.jws.WebMethod;
import
javax.jws.WebParam;
import
javax.jws.WebResult;
import
javax.jws.WebService;
@WebService
(name=
"Hello"
,serviceName=
"Hello"
,
?????? targetNamespace=
"http://www.oksonic.cn/xfire"
)
public
class
Hello {
???
@WebMethod
???
@WebResult
???
public
String getName(
@WebParam
String name){
??????
return
"Hello world "
+ name;
??? }
}
-------------------------------------------------------------------------------------
? 修改 services.xml 文件,內(nèi)容如下:
-------------------------------------------------------------------------------------
<
beans
xmlns
=
"http://xfire.codehaus.org/config/1.0"
>
???
<
service
>
??????
<
serviceClass
>
com.test.Hello
</
serviceClass
>
??????
<
serviceFactory
>
jsr181
</
serviceFactory
>
???
</
service
>
</
beans
>
-------------------------------------------------------------------------------------
? 啟動(dòng)服務(wù),現(xiàn)次測(cè)試,沒(méi)什么變化,服務(wù)正常
三、對(duì) xfire 進(jìn)行單元測(cè)試
---------------------
介紹 摘抄自 XFire 實(shí)戰(zhàn)? ------------------------
? 你不必發(fā)布到 tomcat 等容器中就可以進(jìn)行測(cè)試,常用的測(cè)試類常繼承 AbstractXFireTest 抽像類。
AbstractXFireSpringTest 類又實(shí)現(xiàn)了 AbstractXFireTest 類,AbstractXFireTest 類是 TestCase
的子類,所以你可以使用 junit 進(jìn)行單元測(cè)試。
------------------------------------------------------------------------------
? 新建一個(gè) JUnit case ,這是為了讓 IDE 自動(dòng)增加 JUnit 相關(guān)的類庫(kù)
? 新建一個(gè) java 文件,名稱為 HelloTest.java,此類繼承 AbstractXFireSpringTest,
實(shí)現(xiàn)一個(gè) createContest 方法,內(nèi)容如下:
------------------------------------------------------------------------------
package
test.com.test;
import
org.apache.xbean.spring.context.ClassPathXmlApplicationContext;
import
org.codehaus.xfire.spring.AbstractXFireSpringTest;
import
org.jdom.Document;
import
org.springframework.context.ApplicationContext;
public
class
HelloTest
extends
AbstractXFireSpringTest {
???
@Override
???
protected
ApplicationContext createContext() {
??????
return
new
ClassPathXmlApplicationContext(
new
String[] {
?????????????
"/org/codehaus/xfire/spring/xfire.xml"
,
?????????????
"/META-INF/xfire/services.xml"
});
??? }
???
???
public
void
testService()
throws
Exception
??? {
??????? Document wsdl = getWSDLDocument(
"Hello"
);
??????? printNode(wsdl);
??? }
}
------------------------------------------------------------------------------
? 為了讓
createContext
方法可以找到
services.xml
文件,需要把
Web Services
目錄下的
services.xml
拷貝到
src/
META-INF/xfire
目錄下
? 不用啟動(dòng) tomcat 直接在 HelloTest.java 文件上點(diǎn)擊鼠標(biāo)右鍵 Run as --> Junit ... 進(jìn)行測(cè)試,結(jié)果顯示綠色條,通過(guò)測(cè)試!
? 關(guān)于其它的測(cè)試方法請(qǐng)查看《XFire實(shí)戰(zhàn).pdf》
四、和 Spring 集成
? 新建一個(gè) service 層接口 IHelloService,內(nèi)容如下:
------------------------------------------------------------------------------
package
com.test.services;
public
interface
IHelloService {
???
public
String getName(String name);
???
}
------------------------------------------------------------------------------
? 創(chuàng)建接口的實(shí)現(xiàn) HelloService,內(nèi)容如下:
------------------------------------------------------------------------------
package
com.test.services.impl;
import
com.test.services.IHelloService;
public
class
HelloService
implements
IHelloService {
???
public
String getName(String name) {
??????
return
"Hello World "
+ name;
??? }
}
------------------------------------------------------------------------------
?
添加
spirng
框架,設(shè)置將
applicationContext.xml
文件創(chuàng)建到 WEB-INF 目錄下
? 修改
applicationContext.xml
文件,內(nèi)容如下:
------------------------------------------------------------------------------
<?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
<!
DOCTYPE
beans
PUBLIC
"-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd"
>
<
beans
>
???
<
bean
id
=
"
helloBean
"
class
=
"com.test.services.impl.HelloService"
/>
</
beans
>
------------------------------------------------------------------------------
? 在 WEB-INF 目錄下新建
xfire
-servlet.xml
文件,文件內(nèi)容如下:
------------------------------------------------------------------------------
<?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
<!
DOCTYPE
beans
PUBLIC
"-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd"
>
<
beans
>
???
<
bean
??????
class
=
"org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"
>
??????
<
property
name
=
"urlMap"
>
??????????
<
map
>
?????????????
<!--
配置
service
名稱和
Service Bean -->
?????????????
<
entry
key
=
"/Hello"
>
?????????????????
<
ref
bean
=
"
hello
"
/>
?????????????
</
entry
>
??????????
</
map
>
??????
</
property
>
???
</
bean
>
???
<
bean
id
=
"
hello
"
??????
class
=
"org.codehaus.xfire.spring.remoting.XFireExporter"
>
??????
<
property
name
=
"serviceFactory"
>
??????????
<
ref
bean
=
"xfire.serviceFactory"
/>
??????
</
property
>
??????
<
property
name
=
"xfire"
>
??????????
<
ref
bean
=
"xfire"
/>
??????
</
property
>
??????
<
property
name
=
"serviceBean"
>
??????????
<
ref
bean
=
"
helloBean
"
/>
??????
</
property
>
??????
<
property
name
=
"serviceClass"
>
??????????
<
value
>
com.test.services.IHelloService
</
value
>
??????
</
property
>
???
</
bean
>
</
beans
>
------------------------------------------------------------------------------
? 注意:紅色字體部份必需一r致,深紅色字體部份要和 spring 的配置文件部份一致
? 修改 web.xml 文件,增加 spring 配置部份,修改 xfire 的名稱
------------------------------------------------------------------------------
<?
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"
>
???
<
context-param
>
??????
<
param-name
>
contextConfigLocation
</
param-name
>
??????
<
param-value
>
?????????? /WEB-INF/applicationContext.xml
??????????
classpath:org/codehaus/xfire/spring/xfire.xml
??????
</
param-value
>
???
</
context-param
>
???
<
listener
>
??????
<
listener-class
>
?????????? org.springframework.web.context.ContextLoaderListener
??????
</
listener-class
>
???
</
listener
>
???
<
servlet
>
??????
<
servlet-name
>
xfire
</
servlet-name
>
??????
<
servlet-class
>
??????????
org.springframework.web.servlet.DispatcherServlet
??????
</
servlet-class
>
??????
<
load-on-startup
>
0
</
load-on-startup
>
???
</
servlet
>
???
<
servlet-mapping
>
??????
<
servlet-name
>
xfire
</
servlet-name
>
??????
<
url-pattern
>
/services/*
</
url-pattern
>
???
</
servlet-mapping
>
</
web-app
>
------------------------------------------------------------------------------
?
注:紅色字體部份為新重點(diǎn)關(guān)注部份
? 重啟服務(wù),進(jìn)行測(cè)試!!!
? 一切正常,現(xiàn)在用一個(gè)web service測(cè)試工具進(jìn)行一下測(cè)試
?
本集就到這里了!!!
為了制作更多更好的錄像教程,希望大家多多提供相關(guān)資料!!!
聯(lián)系方法:
? http://www.oksonic.cn
? Email: oksonic@tom.com
? QQ: 71279650