速动画教程第二十五集 使用 xfire 开发 web service 应用
下载地址:
http://this.oksonic.cn
在这里请大家帮忙,有那位朋友使用过
xfire
开发客户端的话,请与我联系!
联系方法见文章结尾处
制作工具:Eclipse3.2 MyEclipse5.0m2 Tomcat5.5.x
一、一个简单的 web service
新建一个 web service 工程,名称为 xfire
新建一个 java 文件,名称为 Hello.java,内容如下:
-------------------------------------------------------------------------------------
package
com.test;
public
class
Hello {
public
String getName(String name){
return
"Hello world "
+ name;
}
}
-------------------------------------------------------------------------------------
修改Web Services目录下的 services.xml 文件,内容如下:
-------------------------------------------------------------------------------------
<
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
>
服务名称
<
serviceClass
>
com.test.Hello
</
serviceClass
>
服务类
现在可以部署项目,使用以下链接访问:
http://localhost/xfire/services/Hello?wsdl
注:我的端口已经修改为80,如果没有修改过的话请使用
http://localhost:8080/xfire/services/Hello?wsdl
网上原有的教程中提到可以使用 http://localhost/xfire/services/ 访问,但测试时出现无法连接
页面中出现 xml 文件内容表示服务正常
二、使用 jsr181 风格
---------------------
介绍 摘抄自 XFire 实战 ------------------------
JSR 181通过标准化一个易于学习且可以快速开发的Web服务简单编程模型,从而刺激了对Web服务的采用。一直以来,J2EE开发人员要开发和部署Web服务就必须掌握相当多的信息。通过使用J2SE 5.0中的新增注释功能,Java软件源代码可以使用JSR 181注释进行注释,从而声明式地定义所需的Web服务行为。这使开发人员可以将注意力集中在Web服务的应用逻辑上而无需担心复杂的API、协议和部署描述符。
BEA官方网站有一篇
“
web服务元数据简介
”
,对理解JSR 181规范很有帮助。
这一节的例子和上一节的例子很相似,或者通过使用java注释,比上一节的POJO稍微复杂了一点。不是说JSR 181节省了很多的配置信息吗?鄙人认为可以从这个方面来理解,正常情况下,POJO如果配置到其他webservices框架下,比如axis2、Celtix、weblogic等容器中,必然需要编写适合这些容器的配置文件,以便这些容器能够识别这个POJO类是wenservices,并根据配置文件中的比如命名空间、参数类型、web服务的方法等信息提供web服务。而通过jsr 181规范中的定义可以自动识别这些信息,这样这些信息不必在每个容器中所配置,这些容器通过java注释就可以得到这些信息,所以说jsr181在这方面进行了简化。XFire通过services.xml文件得到哪个类被定义为web服务, XFire可以通过java注释来获取web服务的相关信息。
-------------------------------------------------------------------------------------
修改 Hello.java 文件,内容如下:
-------------------------------------------------------------------------------------
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 文件,内容如下:
-------------------------------------------------------------------------------------
<
beans
xmlns
=
"http://xfire.codehaus.org/config/1.0"
>
<
service
>
<
serviceClass
>
com.test.Hello
</
serviceClass
>
<
serviceFactory
>
jsr181
</
serviceFactory
>
</
service
>
</
beans
>
-------------------------------------------------------------------------------------
启动服务,现次测试,没什么变化,服务正常
三、对 xfire 进行单元测试
---------------------
介绍 摘抄自 XFire 实战 ------------------------
你不必发布到 tomcat 等容器中就可以进行测试,常用的测试类常继承 AbstractXFireTest 抽像类。
AbstractXFireSpringTest 类又实现了 AbstractXFireTest 类,AbstractXFireTest 类是 TestCase
的子类,所以你可以使用 junit 进行单元测试。
------------------------------------------------------------------------------
新建一个 JUnit case ,这是为了让 IDE 自动增加 JUnit 相关的类库
新建一个 java 文件,名称为 HelloTest.java,此类继承 AbstractXFireSpringTest,
实现一个 createContest 方法,内容如下:
------------------------------------------------------------------------------
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
目录下
不用启动 tomcat 直接在 HelloTest.java 文件上点击鼠标右键 Run as --> Junit ... 进行测试,结果显示绿色条,通过测试!
关于其它的测试方法请查看《XFire实战.pdf》
四、和 Spring 集成
新建一个 service 层接口 IHelloService,内容如下:
------------------------------------------------------------------------------
package
com.test.services;
public
interface
IHelloService {
public
String getName(String name);
}
------------------------------------------------------------------------------
创建接口的实现 HelloService,内容如下:
------------------------------------------------------------------------------
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
框架,设置将
applicationContext.xml
文件创建到 WEB-INF 目录下
修改
applicationContext.xml
文件,内容如下:
------------------------------------------------------------------------------
<?
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
文件,文件内容如下:
------------------------------------------------------------------------------
<?
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
>
------------------------------------------------------------------------------
注:红色字体部份为新重点关注部份
重启服务,进行测试!!!
一切正常,现在用一个web service测试工具进行一下测试
本集就到这里了!!!
为了制作更多更好的录像教程,希望大家多多提供相关资料!!!
联系方法:
http://www.oksonic.cn
Email: oksonic@tom.com
QQ: 71279650