当前位置: 代码迷 >> Web前端 >> gsoap CXF2.7.5 ssh vc++ webservice应用范例(一)
  详细解决方案

gsoap CXF2.7.5 ssh vc++ webservice应用范例(一)

热度:454   发布时间:2013-10-08 17:02:59.0
gsoap CXF2.7.5 ssh vc++ webservice应用实例(一)

webservice的一个大亮点就是跨平台。项目中要求c++和jee相结合的系统。我想采用webservice来交互信息。

c++做webservice应用,我选择了gsoap;这套系统是B/S模式的应用系统,我选择了ssh三大框架来做。

有一项技术一直没有应用过,经过一天的尝试,终于走通了流程。c++和jee之间实现了相互调用。

在这过程中,我网上查了许多资料,用了很多的关键词搜索,一直没有找到我想要的答案。特别是CXF做客户端的,几乎都是官网文档的部分翻译。都简单的写了一下怎么做,让人摸不着头脑。最后,从一个简单的源码受到启示。尝试成功。

C++的webservice服务端、客户端;jee的服务端、客户端。共有4个项目,为了测试相互调用。所以分了四篇博文。

源码在完成博文后传到csdn资源中供下载。

给自己留个记录,也希望能帮到跟我一样迷茫中的初学者。

首先是WSDL,4个项目使用同一个WSDL。我是初学者,不会编辑WSDL文档,所以就先用CXF代码优先做个服务器端,成功后产生WSDL,再给其它3个项目使用。

我之前的一篇博文中有使用描述(struts2+spring3+hibernate4+cxf2.7搭建webservice实例

在这里不说引入包之类的了。就写开发过程。

建立Dynamic Web Project

project name:CXFServerDemo

开始配置web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
	metadata-complete="true" version="3.0">
	<display-name>webservicetest</display-name>
	<description>webservicetest</description>
	<welcome-file-list>
		<welcome-file>index.jsp</welcome-file>
	</welcome-file-list>
	<!-- CXF -->
	<servlet>
		<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>/webServices/*</url-pattern>
	</servlet-mapping>
	<session-config>
		<session-timeout>60</session-timeout>
	</session-config>
	<!-- struts2 -->
	<filter>
		<filter-name>struts2</filter-name>
		<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>struts2</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	<!-- spring -->
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath*:applicationContext-*.xml</param-value>
	</context-param>
	<!-- log4j -->
	<context-param>
		<param-name>log4jConfigLocation</param-name>
		<param-value>classpath:log4j.properties</param-value>
	</context-param>
	<context-param>
		<param-name>log4jRefreshInterval</param-name>
		<param-value>60000</param-value>
	</context-param>
	<listener>
		<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
	</listener>
</web-app>

各项配置的所属框架都有注释了。

建立SSH基本项目的框架,SSH项目结构不是这里要描述的。完成后如下图

在图中还没有开始webservice的情况。

建立org.biboheart.webservice包,类名:HelloWorld

建立接口后实现

HelloWorld.java中的内容:

package org.biboheart.webservice;

import javax.jws.WebParam;
import javax.jws.WebService;

@WebService
public interface HelloWorld {
	public String sayHello(@WebParam(name = "name") String name);
}

HelloWorldImpl.java中的内容:

package org.biboheart.webservice;

import javax.jws.WebParam;
import javax.jws.WebService;

@WebService(endpointInterface = "org.biboheart.webservice.HelloWorld",serviceName = "HelloWorld")
public class HelloWorldImpl implements HelloWorld {
	@Override
	public String sayHello(@WebParam(name = "name") String name) {
		String hello = "hello " + name;
		System.out.println(hello);
		return hello;
	}
}

用一个方法做测试。

配置spring:只写了片段,后面的hibernate、其它的bean的装配太多,不全放出了

<?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:context="http://www.springframework.org/schema/context"
	xmlns:jaxws="http://cxf.apache.org/jaxws" xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://cxf.apache.org/jaxws
http://cxf.apache.org/schemas/jaxws.xsd">
	<context:annotation-config />
	<context:component-scan base-package="org.biboheart" />
	<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="webServiceHelloWorld"
	    address="/HelloWorld"
	    implementorClass="org.biboheart.webservice.HelloWorldImpl"/>

还有一个关键配置在struts.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">
	
<struts>
    <package name="vcs-base" extends="struts-default">
        <!-- 配置全局结果 -->
        <global-results>
   			<result name="index">/index.jsp</result>
		</global-results>
    </package>
    <package name="webServices" extends="vcs-base" namespace="/webServices">
	    <action name="*">
	        <result>{1}</result>
	    </action>
	</package>
</struts>

要加入package:webServices,加入之后,webServices的请求都交给了CXF管理,不然的话,struts会把webService的请求当作action的请求。

将项目加入tomcat中启动项目。

在浏览器中输入:http://localhost:8080/CXFServerDemo/webServices/HelloWorld?wsdl

<?xml version="1.0" encoding='UTF-8'?><wsdl:definitions xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://webservice.biboheart.org/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:ns1="http://schemas.xmlsoap.org/soap/http" name="HelloWorld" targetNamespace="http://webservice.biboheart.org/">
  <wsdl:types>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://webservice.biboheart.org/" elementFormDefault="unqualified" targetNamespace="http://webservice.biboheart.org/" version="1.0">
<xs:element name="sayHello" type="tns:sayHello"></xs:element>
<xs:element name="sayHelloResponse" type="tns:sayHelloResponse"></xs:element>
<xs:complexType name="sayHello">
    <xs:sequence>
      <xs:element minOccurs="0" name="name" type="xs:string"></xs:element>
    </xs:sequence>
  </xs:complexType>
<xs:complexType name="sayHelloResponse">
    <xs:sequence>
      <xs:element minOccurs="0" name="return" type="xs:string"></xs:element>
    </xs:sequence>
  </xs:complexType>
</xs:schema>
  </wsdl:types>
  <wsdl:message name="sayHelloResponse">
    <wsdl:part element="tns:sayHelloResponse" name="parameters">
    </wsdl:part>
  </wsdl:message>
  <wsdl:message name="sayHello">
    <wsdl:part element="tns:sayHello" name="parameters">
    </wsdl:part>
  </wsdl:message>
  <wsdl:portType name="HelloWorld">
    <wsdl:operation name="sayHello">
      <wsdl:input message="tns:sayHello" name="sayHello">
    </wsdl:input>
      <wsdl:output message="tns:sayHelloResponse" name="sayHelloResponse">
    </wsdl:output>
    </wsdl:operation>
  </wsdl:portType>
  <wsdl:binding name="HelloWorldSoapBinding" type="tns:HelloWorld">
    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"></soap:binding>
    <wsdl:operation name="sayHello">
      <soap:operation soapAction="" style="document"></soap:operation>
      <wsdl:input name="sayHello">
        <soap:body use="literal"></soap:body>
      </wsdl:input>
      <wsdl:output name="sayHelloResponse">
        <soap:body use="literal"></soap:body>
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:service name="HelloWorld">
    <wsdl:port binding="tns:HelloWorldSoapBinding" name="HelloWorldImplPort">
      <soap:address location="http://localhost:8080/CXFServerDemo/webServices/HelloWorld"></soap:address>
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>

如果页面中显示出如上XML代码表示webservice服务端已经成功

浏览器中选择保存,把资源保存为.wsdl文件。也可以直接复制上面的代码保存为.wsdl文件进行开发使用。

CXF 服务已经发布完成,下面的用这个WSDL文件在C++方用GSOAP做webservice服务。

该上班了…… 晚上再续


  相关解决方案