速動(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