目录:
- 前言概述
- 环境配置
- 构建项目
- 服务端的实现
- 客户端的实现
[一]、前言概述
在2010年3月曾经写过一篇 xfire webservices图文介绍详细步骤,当时只是写了一个XFire中最基本功能的演示,本次打算对XFire一系列应用配合实际的代码演示逐步做下介绍。
[二]、环境配置
- Eclipse 3.7
- Maven 3.0.4
- JDK 1.6.0_18
[三]、构建项目
创建项目 xfire-base-demo:
mvn archetype:create -DgroupId=com.micmiu.xfire.demo -DartifactId=xfire-base-demo -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false
转为Eclipse项目并导入到Eclipse 中:
mvn eclipse:eclipse
创建和配置相关的源目录和编译目录,.classpath 文件内容如下:
<?xml version="1.0" encoding="UTF-8"?> <classpath> <classpathentry kind="src" output="target/classes" path="src/main/java"/> <classpathentry kind="src" output="target/classes" path="src/main/resources"/> <classpathentry kind="src" output="target/test-classes" path="src/test"/> <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/> <classpathentry kind="con" path="org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER"/> <classpathentry kind="output" path="target/classes"/> </classpath>
添加相关的依赖,修改POM.xml 添加如下内容:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.3</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.codehaus.xfire</groupId>
<artifactId>xfire-all</artifactId>
<version>1.2.6</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
[四]、服务端的实现
创建基础的package:com.micmiu.xfire.demo.base
1.服务端接口:HelloWorldService.java
package com.micmiu.xfire.demo.base;
/**
*
* @blog http://www.micmiu.com
* @author Michael
*/
public interface HelloWorldService {
/**
* return welcome
* @param username
* @return
*/
String sayHello(String username);
}
2.服务端接口的实现:HelloWorldServiceImpl.java
package com.micmiu.xfire.demo.base;
/**
* @blog http://www.micmiu.com
* @author Michael
*/
public class HelloWorldServiceImpl implements HelloWorldService {
public String sayHello(String username) {
return "Hi," + username + " welcome,see more http://www.micmiu.com";
}
}
3.XFire相关配置
在源目录 src/main/java 下创建两级目录:META-INF/xfire ,然后在该目录下创建文件:services.xml ,具体内容如下:
<!-- START SNIPPET: services --> <beans xmlns="http://xfire.codehaus.org/config/1.0"> <service> <name>HelloWorldService</name> <namespace>http://demo.xfire.micmiu.com/HelloWoldService</namespace> <serviceClass>com.micmiu.xfire.demo.base.HelloWorldService </serviceClass> <implementationClass>com.micmiu.xfire.demo.base.HelloWorldServiceImpl </implementationClass> </service> </beans> <!-- END SNIPPET: services -->
修改文件: src\main\webapp\WEB-INF\web.xml ,内容如下:
<web-app> <display-name>Michael's demo www.micmiu.com</display-name> <servlet> <servlet-name>XFireServlet</servlet-name> <display-name>XFire Servlet</display-name> <servlet-class> org.codehaus.xfire.transport.http.XFireConfigurableServlet </servlet-class> </servlet> <servlet-mapping> <servlet-name>XFireServlet</servlet-name> <url-pattern>/servlet/XFireServlet/*</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>XFireServlet</servlet-name> <url-pattern>/services/*</url-pattern> </servlet-mapping> </web-app>
4.发布webservice
方法一:运用eclipse 中Jetty插件,直接运行该项目,日志如下:
Running Jetty 6.1.26 2012-07-27 14:33:49.020:INFO::Logging to STDERR via org.mortbay.log.StdErrLog ParentLoaderPriority enabled Context path:/xfire-base-demo ProjectClassLoader: entry=... ...... ProjectClassLoader: entry=... Excluded entry=D:\workspace_dev\xfire-examples\xfire-base-demo\target\test-classes 2012-07-27 14:33:49.112:INFO::jetty-6.1.26 2012-07-27 14:33:49.666:INFO::Started [email protected]:8080
方法二:如果没有安装jetty插件,在POM.xml 文件的节点<build><plugins>…</plugins></build>中增加:
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty-plugin</artifactId>
<version>6.1.26</version>
<configuration>
<webAppSourceDirectory>${basedir}/src/main/webapp</webAppSourceDirectory>
</configuration>
</plugin>
再配置goals相关参数:jetty:run 即可运行
不管用哪种方法运行后,浏览器中打开webservice的URL如下:
看到上图中的信息,服务已经发布成功。
ps: 本机已经把 demo.micmiu.com 映射到localhost
[五]、客户端的实现
编写客户端代码:HelloWorldClient.java
package com.micmiu.xfire.demo.base;
import org.codehaus.xfire.client.XFireProxyFactory;
import org.codehaus.xfire.service.Service;
import org.codehaus.xfire.service.binding.ObjectServiceFactory;
/**
*
* @blog http://www.micmiu.com
* @author Michael
*/
public class HelloWorldClient {
/**
* @param args
*/
public static void main(String[] args) {
String url = "http://demo.micmiu.com:8080/xfire-base-demo/services/HelloWorldService";
try {
Service serviceModel = new ObjectServiceFactory()
.create(HelloWorldService.class);
System.out.println(" ----> 初始客户端 <---- ");
HelloWorldService client = (HelloWorldService) new XFireProxyFactory()
.create(serviceModel, url);
System.out.println(client.sayHello("Michael"));
System.out.println(" ----> 客户端调用结束 <---- ");
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行日志:
----> 初始客户端 <---- Hi,Michael welcome,see more http://www.micmiu.com ----> 客户端调用结束 <----
从上面的日志信息可以看出调用成功了。
附录:完整实现后项目的基本目录结构如下:
D:\workspace_dev\xfire-examples\xfire-base-demo>
│ .classpath
│ .project
│ pom.xml
│
├─.settings
│ org.eclipse.jdt.core.prefs
│ org.maven.ide.eclipse.prefs
│
├─src
│ ├─main
│ │ ├─java
│ │ │ ├─com
│ │ │ │ └─micmiu
│ │ │ │ └─xfire
│ │ │ │ └─demo
│ │ │ │ └─base
│ │ │ │ HelloWorldClient.java
│ │ │ │ HelloWorldService.java
│ │ │ │ HelloWorldServiceImpl.java
│ │ │ │
│ │ │ └─META-INF
│ │ │ └─xfire
│ │ │ services.xml
│ │ │
│ │ ├─resources
│ │ └─webapp
│ │ │ index.jsp
│ │ │
│ │ └─WEB-INF
│ │ web.xml
│ │
│ └─test
└─target
│ xfire-base-demo.war
│
├─classes
│ ├─com
│ │ └─micmiu
│ │ └─xfire
│ │ └─demo
│ │ └─base
│ │ HelloWorldClient.class
│ │ HelloWorldService.class
│ │ HelloWorldServiceImpl.class
│ │
│ └─META-INF
│ └─xfire
│ services.xml
│
├─maven-archiver
│ pom.properties
│
├─surefire
├─test-classes
└─xfire-base-demo