`
Kenny.Lee
  • 浏览: 514860 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

学习WebService笔记

阅读更多
目前开发WebServic主要使用的技术有以下几个,JAX-WS、Axis、XFire、CXF。因为使用Spring的关系吧,所以偏好于后面两者,XFire和CXF。

WebServic服务端

使用XFire和CXF,和Spring的集成WebServic真的是非常简单。

XFire的使用

XFire发布服务有两种方式,jsr181和直接配置式,个人比较喜欢标注的东西,所以也选择当然选择了jsr181方式发布服务,其实两者都是很快能上手的。

Web.xml

  <servlet>
    <servlet-name>XFireServlet</servlet-name>
    <servlet-class>org.codehaus.xfire.transport.http.XFireConfigurableServlet</servlet-class>
    <load-on-startup>0</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>XFireServlet</servlet-name>
    <url-pattern>/services/*</url-pattern>
  </servlet-mapping>


接口的类编写

public interface IHello {
	public String getName( String name);
}


实现类编写

package net.company.webservic

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;

@WebService(name = "Hello", serviceName = "Hello", targetNamespace = "http://company.net")
public class Hello implements IHello {
	@WebMethod
	@WebResult(name = "resultMsg")
	public String getName(@WebParam(name = "name") String name) {
		return "Hello: " + name;
	}
}


service.xml
	<service>
		<serviceClass>net.company.webservic.Hello
		</serviceClass>
		<serviceFactory>jsr181</serviceFactory>
	</service>


然后就可以部署了WSDL文件会自动生成,访问url如
http://localhost:8080/service/Hello?wsdl

CXF与Spring集成服务端

类包
    * cxf-2.0.4-incubator.jar
    * commons-logging-1.1.jar
    * geronimo-activation_1.1_spec-1.0-M1.jar (or Sun's Activation jar)
    * geronimo-annotation_1.0_spec-1.1.jar (JSR 250)
    * geronimo-javamail_1.4_spec-1.0-M1.jar (or Sun's JavaMail jar)
    * geronimo-servlet_2.5_spec-1.1-M1.jar (or Sun's Servlet jar)
    * geronimo-stax-api_1.0_spec-1.0.jar
    * geronimo-ws-metadata_2.0_spec-1.1.1.jar (JSR 181)
    * jaxb-api-2.0.jar
    * jaxb-impl-2.0.5.jar
    * jaxws-api-2.0.jar
    * neethi-2.0.2.jar
    * saaj-api-1.3.jar
    * saaj-impl-1.3.jar
    * wsdl4j-1.6.1.jar
    * wstx-asl-3.2.1.jar
    * XmlSchema-1.3.2.jar
    * xml-resolver-1.2.jar
    * jdom-1.0.jar


接口类编写

package net.company.springCXF;

import java.util.List;

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

/**
 * @author KennyLee
 *
 */
@WebService
public interface IContactUsService {
	
    List<Message> getMessages();
    
    void postMessage(@WebParam(name = "message") Message message);
    
    String sayHello(@WebParam(name = "name") String name);

}


Message类略过。

实现类编写

package net.company.springCXF;

import java.util.ArrayList;
import java.util.List;

import javax.jws.WebService;

/**
 * @author KennyLee
 * 
 */
@WebService(endpointInterface = "net.company.springCXF.IContactUsService")
public final class ContactUsServiceImpl implements IContactUsService {

	/*
	 * (non-Javadoc)
	 * 
	 * @see net.company.springCXF.IContactUsService#getMessages()
	 */
	public List<Message> getMessages() {
		List<Message> messages = new ArrayList<Message>();
		messages.add(new Message("LiLei");
		messages.add(new Message("HanMeimei");
		return messages;

	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * net.company.springCXF.IContactUsService#postMessage(net.company.springCXF
	 * .Message)
	 */
	public void postMessage(Message message) {
		System.out.println(message);
	}

	public String sayHello(String name) {
		return "Hello: " + name;
	}

}


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>Spring with CXF</display-name>
	<description>CXF demo</description>
	
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>
			/WEB-INF/classes/applicationContext.xml
		</param-value>
	</context-param>
	
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
	
    <servlet>
        <servlet-name>CXFServlet</servlet-name>
        <servlet-class>
            org.apache.cxf.transport.servlet.CXFServlet
        </servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>CXFServlet</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>

    <jsp-config>
		<jsp-property-group>
			<url-pattern>*.jsp</url-pattern>
			<el-ignored>false</el-ignored>
		</jsp-property-group>
	</jsp-config>

 	<welcome-file-list>
   		<welcome-file>index.jsp</welcome-file>
  	</welcome-file-list>
</web-app>


applicationContext.xml配置

<?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:cxf="http://cxf.apache.org/core" xmlns:jaxws="http://cxf.apache.org/jaxws"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-2.5.xsd
        http://cxf.apache.org/core
        http://cxf.apache.org/schemas/core.xsd
        http://cxf.apache.org/jaxws
        http://cxf.apache.org/schemas/jaxws.xsd"
	default-autowire="byName">

	<!-- Load CXF modules from cxf.jar -->
	<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" />

	<!-- Enable message logging using the CXF logging feature -->
	<cxf:bus>
		<cxf:features>
			<cxf:logging />
		</cxf:features>
	</cxf:bus>

	<!-- The service bean -->
	<bean id="contactUsServiceImpl" class="net.company.springCXF.ContactUsServiceImpl" />

	<!-- Aegis data binding -->
	<bean id="aegisBean" class="org.apache.cxf.aegis.databinding.AegisDatabinding"
		scope="prototype" />
	<bean id="jaxws-and-aegis-service-factory" class="org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean"
		scope="prototype">
		<property name="dataBinding" ref="aegisBean" />
		<property name="serviceConfigurations">
			<list>
				<bean class="org.apache.cxf.jaxws.support.JaxWsServiceConfiguration" />
				<bean class="org.apache.cxf.aegis.databinding.AegisServiceConfiguration" />
				<bean class="org.apache.cxf.service.factory.DefaultServiceConfiguration" />
			</list>
		</property>
	</bean>
	
	<!-- Service endpoint -->
	<!--
		See http://incubator.apache.org/cxf/faq.html regarding CXF + Spring
		AOP
	-->
	<jaxws:endpoint id="contactUsService"
		implementorClass="net.company.springCXF.ContactUsServiceImpl"
		implementor="#contactUsServiceImpl" address="/contactus">
		<jaxws:serviceFactory>
			<ref bean="jaxws-and-aegis-service-factory" />
		</jaxws:serviceFactory>
	</jaxws:endpoint>
</beans>


Spring+CXF的WebServic服务端就完成了。

关于WebServic的客户端编写。

关于这点,我也纠结了两天,原因是使用CXF+Spring的服务端环境下,通过WSDL生成的客户端代码调试都有问题。问题仅仅出现在XFire和CXF的客户端之下。

WSDL一种规范的语言,不需要理会对方如何制作客户端来发送SOAP请求进行交互,我一直是这么理解的。但事实上并不是这样,如果使用了特定技术的话,还是需要留意的。

例如,我使用XFire的客户端就出现问题了,仅仅是出现在用CXF编写的服务端之上。搞了一天并且在网上搜索了一下资料,郁闷的人原来不止我一个。并且发现XFire性能上不如前辈们说的好,一个SOAP请求当中可能出现一些冗余的XML字符串。甚至还有时候返回NULL的情况发生。

而如果服务端是使用XFrie的话,则一切正常。

还有一点郁闷的是,使用CXF官方的wsdl2java生成的客户端也出现问题,不能正常使用。但这个问题没深究了,报的是There's no ObjectFactory with an @XmlElementDecl for the element也许是生成代码的时候标记有误之类。总之觉得客户端生成后能直接用就最快捷了,如果有问题直接否决掉使用其他的了。

使用Axis和JAX-WS生成的客户端则一切正常....

而且推荐通过wsdl2java或者一些IDE工具根据WSDL生成客户端而不是手写,因为这样才能敏捷开发,效率十分重要。

总结一点经验

如果你编写WebServic服务端的话,推荐使用CXF、AXIS2,因为都是目前主流的技术,各有千秋。再者如果您是使用Spring的话,就推荐CXF了,集成得很好。

而客户端的话,推荐使用JAX-WS和Axis,因为至少据我所测的两天当中能兼容所有的WebServic服务端。XFire也可以,但先测试吧,因为如果对方使用CXF的话,也许会出现问题。不敢保证一定出问题,也许是我的倒霉吧。而且CXF目前还不是怎么普及,遇到问题也比较难找帮助。

XFire的作者有两年没更新了,BUG之类的可想言之,并且不是这样的话CXF也没必要诞生了。虽然开始很喜欢XFire(Eclipse集成得比较不错),但目前还是只能接受现实了。

注明下Spring+CXF 学习参考的地方:
http://wheelersoftware.com/articles/spring-cxf-web-services.html

期待《Spring in Practice》
2
0
分享到:
评论

相关推荐

    WebService学习笔记

    在学习WebService的过程中,除了理论知识,实践经验同样重要。可以尝试使用Apache CXF、Java JAX-WS等工具创建自己的WebService,并通过SOAPUI等测试工具进行调用和验证。同时,阅读相关书籍、参与在线论坛讨论,...

    webservice学习笔记doc文档

    在本学习笔记中,主要介绍了使用Apache Axis2框架来开发和测试Web Service的过程。Apache Axis2是Apache SOAP栈的一个实现,提供了简单且高效的Web Service开发工具。 首先,开发者需要在Eclipse集成开发环境中搭建...

    webService学习笔记

    在本篇WebService学习笔记中,我们将探讨几个关键的概念和技术,包括SOAP协议、JAX-WS、WSDL文档以及一些常用的Web服务框架。 首先,SOAP(Simple Object Access Protocol)是一种基于XML的协议,用于在分布式环境...

    尚硅谷Webservice学习笔记

    在本篇尚硅谷的学习笔记中,主要涉及了Web Service的基础概念、Schema约束、HTTP协议以及相关面试问题。 1. Schema约束: - Schema是XML Schema Document的缩写,它是一种XML格式,用于定义其他XML文档的结构和...

    WebService学习笔记0001

    【WebService学习笔记0001】 在IT领域,WebService是一种基于开放标准(如XML、SOAP、WSDL和UDDI)的互操作性技术,它允许不同系统间的应用程序通过网络进行通信。本学习笔记将围绕WebService的核心概念、工作原理...

    webService笔记

    webservice学习笔记1DTD是为了校验XML 2语法 3 schema

    webservice学习笔记 -- XFrie

    【Web Service学习笔记——XFrie框架详解】 Web Service是一种通过网络进行通信的服务,它允许不同的应用程序之间进行数据交换,跨越了操作系统和编程语言的障碍。XFrie是一个轻量级、高性能的Java Web Service框架...

    WebService源码和笔记.zip

    本资料包包含了关于WebService的源码和笔记,旨在帮助学习者深入理解并实践WebService的相关技术。 源码部分可能涵盖以下几个关键点: 1. **SOAP消息结构**:源码中可能会展示如何构建一个SOAP请求或响应消息。...

    webservice学习笔记

    ### WebService 学习笔记详解 #### 一、实验环境搭建与配置 在开始Web Service的学习之前,首先需要搭建一个适合开发的环境。本实验基于以下配置: - 操作系统:Windows 2000 (Win2k) - JDK版本:1.6 - Java EE...

    黑马程序员_Webservice公开课源码和笔记

    学习本次公开课你将收获和体会到什么: 学习完本次公开课,你将深入理解Web Service,快速上手企业开发。   主要讲解内容如下: Web Service是什么? Web service的优势和前景 Web Service和Web服务器的区别? 在...

    WebService 学习

    在学习WebService的过程中,你可能会遇到一些关键概念,例如SOAP绑定、端点地址(Endpoint)、服务代理(Proxy Class)等。SOAP绑定定义了如何使用SOAP消息与服务通信,端点地址是服务的实际位置,而服务代理是...

    Spring.NET学习笔记21——整合WebService的例子

    刘冬编写的Spring.NET学习笔记21——整合WebService的例子。 原文:http://www.cnblogs.com/GoodHelper/archive/2009/11/19/SpringNet_WebService.html

    Webservice学习笔记.doc

    Web Service是一种基于开放标准的技术,允许不同的应用程序之间通过互联网交换数据,实现跨平台、跨语言的互操作性。它的核心理念是创建无需用户界面就能与其他应用交互的Web应用程序。例如,在金融行业中,一个股票...

    webservice入门学习代码笔记

    Web服务(WebService)是一种基于网络的、分布式的模块化组件,它允许不同系统之间的应用程序进行交互和通信。这种技术基于开放标准,如XML(可扩展标记语言)、SOAP(简单对象访问协议)、WSDL(Web服务描述语言)...

    燕青webservice笔记

    学习燕青的WebService笔记,将有助于理解Web Service的工作原理、如何设计和实现服务,以及如何在实际项目中应用这些技术。无论是开发人员还是系统架构师,对Web Service的理解都是构建分布式系统和企业级应用的关键...

    Andorid访问WebService的学习笔记

    NULL 博文链接:https://sunwei-07.iteye.com/blog/1139814

Global site tag (gtag.js) - Google Analytics