一、 软件准备
Eclipse 4.2.1
Maven 2.2.1
Spring 3.2.6
CXF 3.0.2
软件下载和Eclipse 安装 maven插件等请參考其它文章。
二、 步骤
1. 新建webproject,利用maven管理。例如以下:
project名为test,完毕以后。项目结构例如以下图:
src/main/java 准备放 java 程序。
src/main/resources准备放各类资源文件。
2. 加入代码
1) 定义服务接口
package com.test;
import javax.jws.WebService;
@WebService
public interface HelloWorld {
public String sayHello();
}
由于仅仅是一个webservice的实验程序,所以很easy。仅仅有一个服务方法: sayHello(),利用 @WebService注解来声明这是一个webservice的接口。
2) 实现服务类
package com.test;
import javax.jws.WebService;
@WebService
public class HelloWorldImpl implements HelloWorld{
public String sayHello(){
return "Hello world!";
}
}
完毕java代码加入后的项目结构例如以下:
3. 加入Spring-CXF 配置
在项目 src/main/webapp/WEB-INF 文件夹下新建XML定义:cxf-servlet.xml例如以下:
<?
xml version="1.0" encoding="UTF-8"?
> <!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> <!-- START SNIPPET: beans --> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"> <import resource="classpath:META-INF/cxf/cxf.xml"/> <import resource="classpath:META-INF/cxf/cxf-servlet.xml"/> <jaxws:endpoint id="helloWorld" implementor="com.test.HelloWorldImpl" address="/HelloWorld"/> </beans> <!-- END SNIPPET: beans -->
该定义文件利用spring和CXF的功能,公布一个ID为helloWorld,实现类为com.test.HelloWorldImpl,公布相对路径为 /HelloWorld(相应绝对文件夹为: http://host:port/{WebAPPName}/HelloWorld)的 webservice。
由于我们须要用到CXF来做webservice。右键点击项目中的POM.XML。加入apache-cxf依赖。例如以下图:
4. Web应用配置
改动 src/main/webapp/WEB-INF 文件夹下的web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.5" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name>cxf</display-name>
<servlet>
<description>Apache CXF Endpoint</description>
<display-name>cxf</display-name>
<servlet-name>cxf</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>cxf</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>60</session-timeout>
</session-config>
</web-app>
该文件实际上是定义了处理webservice的CXF Servlet的映射关系。
完毕步骤3和4以后的project文件夹例如以下:
5. 编译打包
利用maven(package -X)编译打包成test.war
(在Eclipse上右击project名 Run as -> Maven build)
6. 将步骤5生成的test.war部署到tomcatserver上
7. 訪问測试:
在浏览器上输入:http://localhost:8080/test/。出现例如以下画面就成功了:
点击WSDL链接:
8. 编写webservice client端代码
1) 首先通过 Spring 与 CXF 的配置来定义 Web Service 的客户端 Bean,在 src\main\resources 文件夹下创建client-beans.xml 配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
<!-- START SNIPPET: beans -->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/jaxws
http://cxf.apache.org/schema/jaxws.xsd">
<bean id="client" class="com.test.HelloWorld"
factory-bean="clientFactory" factory-method="create"/>
<bean id="clientFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
<property name="serviceClass" value="com.test.HelloWorld"/>
<property name="address" value="http://localhost:8080/test/HelloWorld"/>
</bean>
</beans>
<!-- END SNIPPET: beans -->
须要注意的是。该配置文件里的 address须要写成公布服务的绝对路径。
2) 编写clientjava代码: HelloWorldClient.java
package com.test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public final class HelloWorldClient {
private HelloWorldClient() {
}
public static void main(String args[]) throws Exception {
// START SNIPPET: client
ClassPathXmlApplicationContext context
= new ClassPathXmlApplicationContext(new String[] {"client-beans.xml"});
HelloWorld client = (HelloWorld)context.getBean("client");
String response = client.sayHello();
System.out.println("Response: " + response);
System.exit(0);
// END SNIPPET: client
}
}
注意。代码中HelloWorldclient = (HelloWorld)context.getBean("client"); 的client须要与"client-beans.xml"中的 bean id一致才干找到这个服务。
如今的项目结构例如以下:
3) 连接測试
在eclipse中直接按HelloWorldClient执行 Run as -> Java Application:
输出的Hello world! 即是我们公布的HelloWorld的方法 sayHello()的输出!这说明从服务公布到client连接都成功了。