1.服务端和客户端增加Maven依赖包,如下
<!-- cxf方式webservice服务 -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>3.1.14</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxrs</artifactId>
<version>3.1.14</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>3.1.14</version>
</dependency>
2、服务端示例
1)编写HelloWorld 接口类 代码如下:
package net.cc.service;
import javax.jws.WebParam;
import javax.jws.WebService;
/**
* @author test
* @create 2013-11-26下午10:21:13
*/
@WebService
public interface HelloWorld {
@WebMethod(operationName="sayHello")
public String sayHello(@WebParam(name = "userName") String userName);
}
2)编写HelloWorldImpl实现类 如下:
package net.cc.service;
import javax.jws.WebParam;
import javax.jws.WebService;
/**
* @author test
* @create 2013-11-26下午10:22:53
*/
@WebService(serviceName = "HelloWorld", endpointInterface="net.cc.service.HelloWorld")
public class HelloWorldImpl implements HelloWorld {
@Override
public String sayHello(@WebParam(name = "userName") String userName) {
// TODO Auto-generated method stub
System.out.println("客户端提交信息: " + userName);
return "say Hello " + userName;
}
}
3)服务端web.xml添加CXFServlet
<!--cxf的Servlet-->
<servlet>
<servlet-name>CXFServlet</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CXFServlet</servlet-name>
<url-pattern>/ws/*</url-pattern>
</servlet-mapping>
4)服务端发布接口
xml方式,新增Spring-webservice.xml,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<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">
<!--
***注意***
手动添加的内容:
xmlns:jaxws="http://cxf.apache.org/jaxws"
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-extension-soap.xml" />
<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
<jaxws:endpoint id="ProjectManager" implementor="net.cc.service.HelloWorldImpl"
address="/HelloWorld" />
</beans>
web项目,可在web.xml在加载Spring-webservice.xml,或者编写监听器加载,如下:
package net.cc.servlet;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* @author test
* @create 2013-11-26下午10:41:53
*/
public class myListener implements ServletContextListener {
@Override
public void contextDestroyed(ServletContextEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void contextInitialized(ServletContextEvent arg0) {
// TODO Auto-generated method stub
System.out.println("启动Tomcat...");
ClassPathXmlApplicationContext act = new ClassPathXmlApplicationContext(
"/net/cc/service/spring-beans.xml");
}
}
实现 ServletContextListener 目的是为了在Tomcat启动时自动加载
使用 ClassPathXmlApplicationContext 去加载刚才写的Spring-webservice.xml文件
在当前项目中web.xml文件 增加如下代码:
<listener>
<listener-class>net.cc.servlet.myListener</listener-class>
</listener>
5)tomcat 启动截图:
通过访问:http://{IP}:{port}/ws/HelloWorld?wsdl 查看接口是否发布成功。
3、客户端调用示例:
1)编写相同的HelloWord接口:
package net.cc.service;
import javax.jws.WebParam;
import javax.jws.WebService;
/**
* @author test
* @create 2013-11-26下午10:21:13
*/
@WebService(name="HelloWorld", targetNamespace="http://service.cc.net")
public interface HelloWorld {
@WebMethod(operationName="sayHello")
@WebResult(name="return", targetNamespace="http://service.cc.net")
public String sayHello(@WebParam(name = "userName") String userName);
}
注:targetNamespace可通过http://{IP}:{port}/ws/HelloWorld?wsdl找到,需与发布接口中的targetNamespace一致。
2)调用服务端接口(通过代理工厂方式调用):
// 创建代理工厂
JaxWsProxyFactoryBean factoryBean = new JaxWsProxyFactoryBean();
// 设置代理工厂属性(服务类以及地址)
factoryBean.setServiceClass(HelloWorld.class);
factoryBean.setAddress("http://192.168.1.105:7890/HelloWorld");
// 调用
HelloWorld helloWorld = (HelloWorld) factoryBean.create();
// 可配置请求超时设置
configTimeout(helloWorld);
String result = helloWorld.sayHello("测试");
System.out.println(result);
/**
* 客户端调用请求时超时设置
* @param service
*/
public static void configTimeout(Object service) {
Client proxy = ClientProxy.getClient(service);
HTTPConduit conduit = (HTTPConduit) proxy.getConduit();
HTTPClientPolicy policy = new HTTPClientPolicy();
policy.setConnectionTimeout(8*1000);//8S 请求时间
policy.setReceiveTimeout(10*1000);//10S 连接时间
conduit.setClient(policy);
}