使用cxf做webService完整的项目实例-从头到尾
Apache CXF 是一个开放源代码框架,提供了用于方便地构建和开发 Web 服务的可靠基础架构。它允许创建高性能和可扩展的服务,您可以将这样的服务部署在 Tomcat 和基于 Spring 的轻量级容器中,以及部署在更高级的服务器上,例如 Jboss、IBM® WebSphere® 或 BEAWebLogic。 该框架提供了以下功能:Web 服务标准支持:CXF 支持
·
Apache CXF 是一个开放源代码框架,提供了用于方便地构建和开发 Web 服务的可靠基础架构。它允许创建高性能和可扩展的服务,您可以将这样的服务部署在 Tomcat 和基于 Spring 的轻量级容器中,以及部署在更高级的服务器上,例如 Jboss、IBM® WebSphere® 或 BEA WebLogic。
该框架提供了以下功能:
- Web 服务标准支持:CXF 支持以下 Web 服务标准:
- Java API for XML Web Services (JAX-WS)
- SOAP
- Web 服务描述语言(Web Services Description Language ,WSDL)
- 消息传输优化机制(Message Transmission Optimization Mechanism,MTOM)
- WS-Basic Profile
- WS-Addressing
- WS-Policy
- WS-ReliableMessaging
- WS-Security
- 前端建模:CXF 提供了前端建模的概念,允许您使用不同的前端 API 来创建 Web 服务。API 允许您使用简单的工厂 Bean 并通过 JAX-WAS 实现来创建 Web 服务。它还允许您创建动态 Web 服务客户端。
- 工具支持:CXF 提供了用于在 Java Bean、Web 服务和 WSDL 之间进行转换的不同工具。它提供了对 Maven 和 Ant 集成的支持,并无缝地支持 Spring 集成。
- RESTful 服务支持:CXF 支持代表性状态传输(Representational State Transfer,RESTful )服务的概念,并支持 Java 平台的 JAX-RS 实现。
- 对不同传输和绑定的支持:CXF 支持不同种类的传输,从 XML 到逗号分隔值 (CSV)。除了支持 SOAP 和 HTTP 协议绑定之外,它还支持 Java Architecture for XML Binding (JAXB) 和 AEGIS 数据绑定。
- 对非 XML 绑定的支持:CXF 支持非 XML 绑定,例如 JavaScript Object Notation (JSON) 和 Common Object Request Broker Architecture (CORBA)。它还支持 Java 业务集成(Java Business Integration,JBI)体系架构和服务组件体系架构(Service Component Architecture,SCA)。
- code first 或者 xml first : 支持使用code first 或者 xml first 的方式来创建web服务。
一 借助 annotation 创建独立启动的web 服务。
准备:<1>
新建工程 导入需要的jar 包,
可从apache官方网站下载 apache-cxf-2.7.18, 然后从apache-cxf-2.7.18/lib 目录中可获得所有必需的jar包。=====》》也可通过maven来引入所需的jar包(修改配置文件pom.xml增加依赖)
<2> .新建Web Service Project工程:"File->New->web service project";增加jar包:右击工程名->build path->configure build path->add external jars
1. 首先写服务接口
package com.qsp.demo.service;
import javax.jws.WebParam;
import javax.jws.WebService;
@WebService<span style="white-space:pre"> </span>//这个(<span style="font-family: Arial, Helvetica, sans-serif;">@WebService</span><span style="font-family: Arial, Helvetica, sans-serif;">)annotation必需写,客户端从这里entry;</span>
public interface HelloWorld {
public String sayHi(@WebParam(name="CiNo") String ciNo);<span style="white-space:pre"> </span>//(@WebParam)取ciNo的别名,默认名:arg0
}
2 实现服务接口
package com.qsp.demo.service;
import javax.jws.WebService;
@WebService(serviceName="HelloWorld",endpointInterface="com.qsp.demo.service.HelloWorld")
public class HelloWorldImpl implements HelloWorld{
public String sayHi(String ciNo) {
return "Hello " + ciNo;
}
}
3 编写ServicePublish.java 公布web服务供客户端调用
package com.qsp.demo.cxf.demo;
import javax.xml.ws.Endpoint;
public class Server {
protected Server() throws Exception {
System.out.println("Starting Server");
HelloWorldImpl implementor = new HelloWorldImpl();
String address = "http://localhost:8080/HelloWorld";
Endpoint.publish(address, implementor);
}
public static void main(String args[]) throws Exception {
new Server();
System.out.println("Server ready...");
Thread.sleep(5 * 60 * 1000);
System.out.println("Server exiting");
System.exit(0);
}
}
4 run ServicePublish.java 类来启动服务。 访问 http://localhost:8080/HelloWorld?wsdl查看是否显示
wsdl。
5 编写客户端访问服务(有二种方法)
第一种:
package com.qsp.demo.client;
import java.net.MalformedURLException;
import java.net.URL;
import javax.xml.ws.soap.SOAPBinding;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import com.qsp.demo.service.HelloWorld;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class HelloWorldClient {
private static final QName SERVICE_NAME
= new QName("http://service.demo.qsp.com/", "HelloWorld"); //服务接口名
private static final QName PORT_NAME
= new QName("http://service.demo.qsp.com/", "HelloWorldPort"); //端口名是固定的,接口名+Port(区分大小写)
public static void main(String[] args) {
Service service = Service.create(SERVICE_NAME);
String endpointAddress = "http://localhost:8080/HelloWorld";
service.addPort(PORT_NAME, SOAPBinding.SOAP11HTTP_BINDING, endpointAddress);
HelloWorld hw = service.getPort(HelloWorld.class);
System.out.println(hw.sayHi("World"));
}
}
第二种:
package com.qsp.demo.client;
import java.net.MalformedURLException;
import java.net.URL;
import javax.xml.ws.soap.SOAPBinding;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import com.qsp.demo.service.HelloWorld;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class HelloWorldClient {
public static void main(String[] args) {
JaxWsProxyFactoryBean svr = new JaxWsProxyFactoryBean();
svr.setServiceClass(HelloWorld.class);
svr.setAddress("http://localhost:8080/HelloWorld");
HelloWorld hw = (HelloWorld) svr.create();
System.out.println(hw.sayHi("World"));
}
}
6 测试: run ServicePublish.java 类来启动服务,然后 run HelloWorldClient.java 来访问服务。
二 集成到spring 中
1 在 applicationContext.xml 中加入:
<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-extension-soap.xml"/>
<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
<jaxws:endpoint id="HelloWorld"
implementor="com.qsp.demo.service.HelloWorldImpl"
address="HelloWorld" />
<bean id="client" class="com.qsp.demo.service.HelloWorld"
factory-bean="clientFactory" factory-method="create"/>
<bean id="clientFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
<property name="serviceClass" value="com.qsp.demo.service.HelloWorld"/>
<property name="address" value="http://localhost:8080/CXFSimpDemo/webService/HelloWorld"/> //<pre name="code" class="html" style="color: rgb(73, 73, 73); font-size: 14px; line-height: 22.4px;">CXFSimpDemo为工程名 webService为<servlet-mapping>里配置的<url-pattern>
</bean> </beans>
2 在 web.xml 中加入 :
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance "
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name></display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<servlet>
<servlet-name>CXFServlet</servlet-name>
<display-name>CXFServlet</display-name>
<servlet-class>
org.apache.cxf.transport.servlet.CXFServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>CXFServlet</servlet-name>
<url-pattern>/webService/*</url-pattern>
</servlet-mapping>
</web-app>
3 修改客户端HelloWorldClient.java 为:
package com.qsp.demo.client;
import java.net.MalformedURLException;
import java.net.URL;
import javax.xml.ws.soap.SOAPBinding;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import com.qsp.demo.service.HelloWorld;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class HelloWorldClient {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("classpath*:applicationContext.xml");
HelloWorld client = (HelloWorld)context.getBean("client");
System.out.println(client.sayHi("world"));
}
}
4 发布工程,启动web服务器
5 访问http://localhost:8080/CXFSimpDemo/webService/HelloWorld?wsdl 查看是否显示 wsdl 。
6 run HelloWorldClient.java 访问web服务。
注:在apache-cxf-2.7.18/samples/目录下有大量的实例,可去参考参考
更多推荐
已为社区贡献1条内容
所有评论(0)