一、CXF的介绍
Apache CXF是一个开源的WebService框架,CXF大大简化了Webservice的创建,同时它继承了XFire的传统,一样可以和spring天然的进行无缝的集成。CXF框架是一种基于servlet技术的SOA应用开发框架,要正常运用基于CXF应用框架开发的企业应用,除了CXF应用本身之外,还需要JDK和servlet容器的支持。
webservice框架有很多,比如axis、axis2、cxf、xFire等等,做服务端和做客户端都可行,个人感觉使用这些框架的好处是减少了对于接口信息的解析,最主要的是减少了对于传递于网络中XML的解析,代价是你不得不在你的框架中添加对于这些框架的依赖。个人观点是:服务端使用这些框架还行,如果做客户端,没必要使用这些框架,只需使用httpclient即可。
二、CXF的准备条件
所需要的jar包:
xmlbeans-2.4.0.jar
wss4j-1.5.9.jar
jetty-server-7.1.6.v20100715.jar
jetty-util-7.1.6.v20100715.jar
geronimo-ws-metadata_2.0_spec-1.1.3.jar
geronimo-activation_1.1_spec-1.1.jar
geronimo-servlet_3.0_spec-1.0.jar
velocity-1.6.4.jar
jaxb-xjc-2.2.1.1.jar
xml-resolver-1.2.jar
wsdl4j-1.6.2.jar
cxf-2.3.0.jar
XmlSchema-1.4.7.jar
jaxb-api-2.2.1.jar
jaxb-impl-2.2.1.1.jar
neethi-2.0.4.jar
geronimo-annotation_1.0_spec-1.1.1.jar
geronimo-stax-api_1.0_spec-1.0.1.jar
下载地址:http://download.csdn.net/detail/ch656409110/5748183 (取自己需要的jar包)
三、创建webservice服务端
1、先将jar包放入lib目录
2、在web.xml中配置CXF框架的核心servlet
1 <!-- CXF --> 2 <servlet> 3 <servlet-name>CXFServlet</servlet-name> 4 <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class> 5 <load-on-startup>1</load-on-startup> 6 </servlet> 7 <servlet-mapping> 8 <servlet-name>CXFServlet</servlet-name> 9 <url-pattern>/services/*</url-pattern> 10 </servlet-mapping>
3、在applicationContext.xml中导入xml,并且发布webservice服务。
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans 3 xmlns="http://www.springframework.org/schema/beans" 4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 xmlns:p="http://www.springframework.org/schema/p" 6 xmlns:tx="http://www.springframework.org/schema/tx" 7 xmlns:aop="http://www.springframework.org/schema/aop" 8 xmlns:jaxws="http://cxf.apache.org/jaxws" 9 xmlns:jaxrs="http://cxf.apache.org/jaxrs" 10 xsi:schemaLocation="http://www.springframework.org/schema/beans 11 http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 12 http://www.springframework.org/schema/tx 13 http://www.springframework.org/schema/tx/spring-tx-2.5.xsd 14 http://www.springframework.org/schema/aop 15 http://www.springframework.org/schema/aop/spring-aop-2.5.xsd 16 http://cxf.apache.org/jaxws 17 http://cxf.apache.org/schemas/jaxws.xsd 18 http://cxf.apache.org/jaxrs 19 http://cxf.apache.org/schemas/jaxrs.xsd 20 " 21 default-autowire="byName" 22 > 23 <import resource="classpath:META-INF/cxf/cxf.xml" /> 24 <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" /> 25 <import resource="classpath:META-INF/cxf/cxf-servlet.xml" /> 26 27 <!-- <jaxws:endpoint id="facelookWebService" address="/facelookWebService" implementor="com.facelook.webservice.server.FacelookWebServiceImpl"></jaxws:endpoint> --> 28 <!-- 不知道为什么,这里的webservice配置,只能用bean来实现,否则 注入的service为空。但是之前有个项目却可以,百思不得其解。。 --> 29 <bean id="facelookWebService" class="com.facelook.webservice.server.FacelookWebServiceImpl"/> 30 <jaxws:endpoint id="facelookWebService1" address="/facelookWebService" implementorClass="com.facelook.webservice.server.FacelookWebServiceImpl"> 31 <jaxws:implementor ref="facelookWebService"/> 32 </jaxws:endpoint> 33 </beans>
4、定义webservice接口FacelookWebService 和 实现类FacelookWebServiceImpl。
1 @WebService 2 public interface FacelookWebService { 3 4 /** 5 * 根据传递的条件获取相册信息 6 * xml的格式规范 7 * <?xml version="1.0" encoding="UTF-8"?> 8 * <facelook> 9 * <condition> 10 * <name></name> 11 * <description></description> 12 * <pageno></pageno> 13 * <pagesize></pagesize> 14 * </condition> 15 * </facelook> 16 * 这里的WebParam必须指定,否则调用的时候返回null 17 * @return 18 */ 19 public String getAlbumList(@WebParam(name="xmlStr") String xmlStr); 20 } 21 22 23 @WebService 24 //这后面的可以不写注释后面的配置,在applicationContext配置也一样(serviceName="facelookWebService",endpointInterface="com.facelook.webservice.server.FacelookWebService") 25 public class FacelookWebServiceImpl implements FacelookWebService{ 26 27 @Autowired 28 private AlbumService albumService; 29 30 @Override 31 public String getAlbumList(String xmlStr) { 32 try { 33 List<Album> albumList = getAlbumPage(xmlStr); 34 JSONArray jsonArray = JSONArray.fromObject(albumList); 35 return jsonArray.toString(); 36 } catch (Exception e) { 37 e.printStackTrace(); 38 } 39 return null; 40 } 41 }
这样子,基本上就可以了。
5、保存代码,发布项目,启动tomact。
在地址栏输入:http://localhost:8080/house/services/houseWebService?wsdl 即可看到发布的服务端的明细。
显示如下:
这就表示CXF发布的webservice服务端成功了。
通过客户端调用服务端webservice。
axis的客户端访问:
1 public static void main(String[] args) throws ServiceException, RemoteException, MalformedURLException { 2 String xmlStr = "<?xml version="1.0" encoding="UTF-8"?>" 3 + " <facelook>" 4 + " <condition>" 5 + " <name>家</name>" 6 + " <description></description>" 7 + " <pageno></pageno>" 8 + " <pagesize></pagesize>" 9 + " </condition>" 10 + " </facelook>"; 11 12 Service service = new Service(); 13 Call call = (Call) service.createCall(); 14 call.setTargetEndpointAddress("http://localhost:8080/facelook/services/facelookWebService?wsdl"); 15 QName qName = new QName("http://server.webservice.facelook.com/", "getAlbumList"); 16 call.setOperationName(qName); 17 call.setUseSOAPAction(true); 18 //这下面两行一定要加上,否则接收在服务器端收不到。 19 call.addParameter("xmlStr", XMLType.XSD_STRING, ParameterMode.IN); 20 call.setReturnType(XMLType.XSD_STRING); 21 String result = (String) call.invoke(new Object[] { xmlStr }); 22 System.out.println(result); 23 24 //将返回的字符串转换成list集合 25 //JSONArray array = JSONArray.fromObject(result); 26 //List<Album> list = JSONArray.toList(array,Album.class); 27 28 }
CXF客户端访问:
1 public static void main(String[] args) throws Exception { 2 //这个是用cxf 客户端访问cxf部署的webservice服务 3 //千万记住,访问cxf的webservice必须加上namespace ,否则通不过 4 //现在又另外一个问题,传递过去的参数服务端接收不到 5 JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance(); 6 org.apache.cxf.endpoint.Client client = dcf.createClient("http://localhost:8080/facelook/services/facelookWebService?wsdl"); 7 //url为调用webService的wsdl地址 8 QName name=new QName("http://server.webservice.facelook.com/","getAlbumList"); 9 //namespace是命名空间,methodName是方法名 10 String xmlStr = "<?xml version="1.0" encoding="UTF-8"?>" 11 + " <facelook>" 12 + " <condition>" 13 + " <name>家</name>" 14 + " <description></description>" 15 + " <pageno></pageno>" 16 + " <pagesize></pagesize>" 17 + " </condition>" 18 + " </facelook>"; 19 //paramvalue为参数值 20 Object[] objects=client.invoke(name,xmlStr); 21 //调用web Service//输出调用结果 22 System.out.println(objects[0].toString()); 23 }
在这里面传递的xml规范由 服务端自己规范好了,然后去解析、获取参数,执行相应的操作,返回想要的结果给调用的客户端。。