您的位置:首页 > 其它

CXF创建webservice客户端和服务端

2015-11-30 19:40 381 查看
目录(?)[+]

一、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
plaincopy

<!-- 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>

[html] view
plaincopy





<!-- 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
plaincopy

<?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>

[html] view
plaincopy





<?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
plaincopy

@WebService

public 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;

}

}

[java] view
plaincopy





@WebService

public 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
plaincopy

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
plaincopy

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规范由 服务端自己规范好了,然后去解析、获取参数,执行相应的操作,返回想要的结果给调用的客户端。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: