首页 > 代码库 > Web服务cxf框架发布

Web服务cxf框架发布

CXF创建webservice客户端和服务端              

        分类:             【Webservice】             
Web服务cxf框架发布
 

目录(?)[+]

  1. 一CXF的介绍
  2. 二CXF的准备条件
  3. 三创建webservice服务端
    1. 先将jar包放入lib目录
    2. 在webxml中配置CXF框架的核心servlet
    3. 在applicationContextxml中导入xml并且发布webservice服务
    4. 定义webservice接口FacelookWebService 和 实现类FacelookWebServiceImpl
    5. 保存代码发布项目启动tomact
    6. 通过客户端调用服务端webservice
 
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本人声明。否则将追究法律责任。 作者:永恒の_☆ 地址:http://blog.csdn.net/chenghui0317/article/details/9320053

一、CXF的介绍

Apache CXF是一个开源的WebService框架,CXF大大简化了Webservice的创建,同时它继承了XFire的传统,一样可以和spring天然的进行无缝的集成。CXF框架是一种基于servlet技术的SOA应用开发框架,要正常运用基于CXF应用框架开发的企业应用,除了CXF应用本身之外,还需要JDK和servlet容器的支持。

二、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

 

[html] view plaincopyprint?
  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>  
	<!-- CXF -->	<servlet>  	    <servlet-name>CXFServlet</servlet-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>/services/*</url-pattern>  	</servlet-mapping>

3、在applicationContext.xml中导入xml,并且发布webservice服务。

 

 

[html] view plaincopyprint?
  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>  
<?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:p="http://www.springframework.org/schema/p"	xmlns:tx="http://www.springframework.org/schema/tx"	xmlns:aop="http://www.springframework.org/schema/aop"	xmlns:jaxws="http://cxf.apache.org/jaxws"      xmlns:jaxrs="http://cxf.apache.org/jaxrs"  	xsi:schemaLocation="http://www.springframework.org/schema/beans 						http://www.springframework.org/schema/beans/spring-beans-2.5.xsd						http://www.springframework.org/schema/tx						http://www.springframework.org/schema/tx/spring-tx-2.5.xsd						http://www.springframework.org/schema/aop						http://www.springframework.org/schema/aop/spring-aop-2.5.xsd						http://cxf.apache.org/jaxws  					    http://cxf.apache.org/schemas/jaxws.xsd  					    http://cxf.apache.org/jaxrs  					    http://cxf.apache.org/schemas/jaxrs.xsd					    "						default-autowire="byName"						>    <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="facelookWebService" address="/facelookWebService" implementor="com.facelook.webservice.server.FacelookWebServiceImpl"></jaxws:endpoint> -->    <!-- 不知道为什么,这里的webservice配置,只能用bean来实现,否则 注入的service为空。但是之前有个项目却可以,百思不得其解。。 -->    <bean id="facelookWebService" class="com.facelook.webservice.server.FacelookWebServiceImpl"/>     <jaxws:endpoint id="facelookWebService1" address="/facelookWebService" implementorClass="com.facelook.webservice.server.FacelookWebServiceImpl">    	<jaxws:implementor ref="facelookWebService"/>      </jaxws:endpoint></beans>

4、定义webservice接口FacelookWebService 和 实现类FacelookWebServiceImpl。

 

 

[java] view plaincopyprint?
  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. }   
@WebServicepublic interface FacelookWebService {		/**	 * 根据传递的条件获取相册信息	 * xml的格式规范	 * <?xml version=\"1.0\" encoding=\"UTF-8\"?>	 * <facelook>	 * 	<condition>	 * 		<name></name>	 * 		<description></description>	 * 		<pageno></pageno>	 * 		<pagesize></pagesize>	 * 	</condition>	 * </facelook>	 * 这里的WebParam必须指定,否则调用的时候返回null	 * @return	 */	public String getAlbumList(@WebParam(name="xmlStr") String xmlStr);}@WebService//这后面的可以不写注释后面的配置,在applicationContext配置也一样(serviceName="facelookWebService",endpointInterface="com.facelook.webservice.server.FacelookWebService")public class FacelookWebServiceImpl implements FacelookWebService{    @Autowired    private AlbumService albumService;        @Override    public String getAlbumList(String xmlStr) {        try {            List<Album> albumList = getAlbumPage(xmlStr);            JSONArray jsonArray = JSONArray.fromObject(albumList);            return jsonArray.toString();        } catch (Exception e) {            e.printStackTrace();        }        return null;    }} 
这样子,基本上就可以了。

 

5、保存代码,发布项目,启动tomact。

在地址栏输入:http://localhost:8080/house/services/houseWebService?wsdl  即可看到发布的服务端的明细。

显示如下:

这就表示CXF发布的webservice服务端成功了。

6、通过客户端调用服务端webservice。

axis的客户端访问:

 

[java] view plaincopyprint?
  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. }  
	public static void main(String[] args) throws ServiceException, RemoteException, MalformedURLException {		String xmlStr = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"				 + " 	 <facelook>"				 + "	 	<condition>"				 + " 	 		<name>家</name>"				 + "			<description></description>"				 + "			<pageno></pageno>"				 + "			<pagesize></pagesize>"				 + "  		</condition>"				 + "	 </facelook>";				  Service service = new Service();		  Call call = (Call) service.createCall();		  call.setTargetEndpointAddress("http://localhost:8080/facelook/services/facelookWebService?wsdl");		  QName qName = new QName("http://server.webservice.facelook.com/", "getAlbumList");		  call.setOperationName(qName);		  call.setUseSOAPAction(true);		  //这下面两行一定要加上,否则接收在服务器端收不到。		  call.addParameter("xmlStr", XMLType.XSD_STRING, ParameterMode.IN);		  call.setReturnType(XMLType.XSD_STRING);		  String result = (String) call.invoke(new Object[] { xmlStr });		  System.out.println(result);				//将返回的字符串转换成list集合		//JSONArray array = JSONArray.fromObject(result);		//List<Album> list = JSONArray.toList(array,Album.class);			}

 

CXF客户端访问:

 

[java] view plaincopyprint?
  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. }  
public static void main(String[] args) throws Exception {		//这个是用cxf 客户端访问cxf部署的webservice服务		//千万记住,访问cxf的webservice必须加上namespace ,否则通不过		//现在又另外一个问题,传递过去的参数服务端接收不到		JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();		org.apache.cxf.endpoint.Client client = dcf.createClient("http://localhost:8080/facelook/services/facelookWebService?wsdl");		//url为调用webService的wsdl地址		QName name=new QName("http://server.webservice.facelook.com/","getAlbumList");		//namespace是命名空间,methodName是方法名		String xmlStr = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"				 + " 	 <facelook>"				 + "	 	<condition>"				 + " 	 		<name>家</name>"				 + "			<description></description>"				 + "			<pageno></pageno>"				 + "			<pagesize></pagesize>"				 + "  		</condition>"				 + "	 </facelook>";		//paramvalue为参数值		Object[] objects=client.invoke(name,xmlStr); 		//调用web Service//输出调用结果		System.out.println(objects[0].toString());}
在这里面传递的xml规范由 服务端自己规范好了,然后去解析、获取参数,执行相应的操作,返回想要的结果给调用的客户端。。

Web服务cxf框架发布