转载请注明出处:http://www.cnblogs.com/Starshot/p/7050084.html

Soap即简单对象访问协议,也可理解为一种用于程序之间通讯的规范,它主要基于XML和http,也正因为基于XML和http,所以这个协议具有很强的通用性,能够很好地实现不同语言平台之间的交流通讯。缺点是相对比较重量级。

Java的Soap框架有很多,例如xfire,CXF。说到soap不得不提一下rest,因为这些概念很容易弄混。

rest是一种结构风格,而实现了rest风格的程序设计就叫做restful。它提倡更加轻量级、无状态、自描述,更充分地利用http本身的特性,例如get,post,put,delete,以获得更加高效的性能,使交互更加简洁易懂。例如要获取图书集合中的某本书AAA,可以直接通过uri:/books/AAA来表示。

而soap则都是通过post来请求的,没有充分利用http的其它方法,仅将http作为传输协议来使用,而具体需要获取的资源信息则包含在post的xml报文中。

需要注意的是,rest是一种风格,它不限制于某个程序某个框架。例如CXF框架,它既可以实现rest风格的webService,也可以实现SOAP规范的webService。例如在我另一篇博文中的CXF简单例子(http://www.cnblogs.com/Starshot/p/6889751.html),就可以看做是rest风格的webService。

现在就先以JAX-WS这个轻量级的框架 (后面再和Spring合在一起) 来实现一个soap规范的超简单的webService。

首先建一个WebService的web工程,这个作为服务的提供方。然后建一个HelloService类,如下所示:

然后类的代码如下:

package com.webService;

import javax.jws.WebService;
import javax.xml.ws.Endpoint; @WebService
public class HelloService { public String sayIt(String str){
return "say it:"+str;
} public static void main(String[] args) {
Endpoint.publish("http://localhost:9009/hello/HelloService", new HelloService());
System.out.println("publish done!");
}
}

是不是很简单,是不是很惊喜,然后直接执行,出现publish done!然后打开浏览器,输入http://localhost:9009/hello/HelloService?wsdl,出现wsdl文件信息的话,就算是成功了。

接下来再建一个客户端工程,如下所示:

这个时候需要生成wsdl的客户端,对这工程点击右键,然后新建WebService client:

点下一步,输入刚刚在浏览器输入的地址:

然后再点击下一步设置了代码的路径之后按确定就可以了,成功之后如下图所示:

其中com.webService里面的就是客户端程序了。然后再如上图新建一个测试类test1,内容如下:

package com.test;

import java.rmi.RemoteException;

import javax.xml.rpc.ServiceException;

import com.webService.HelloService;
import com.webService.HelloServiceProxy;
import com.webService.HelloServiceServiceLocator; public class test1 { public static void main(String[] args) throws ServiceException, RemoteException {
HelloService hs=new HelloServiceProxy();
System.out.println(hs.sayIt("Yohoo!!"));
}
}

执行,该程序,控制台输出:Yohoo!!,这就表示成功了。

通过查看客户端代码可以知道,HelloServiceProxy,HelloServiceServiceLocator,HelloServicePortBindingStub三个类其实都可以用来调用服务。而所有类最终都是通过HelloServicePortBindingStub类中的sayIt方法来实现的,HelloServiceProxy和HelloServiceServiceLocator其实是对HelloServicePortBindingStub进行了进一步的加工,这也是代理模式的一种体现。

再然后,上面这种方式发布服务虽然简单,但在实际应用中肯定不是这样子发布服务的,实际肯定是要发布在web中的。JAX-WS和Spring结合起来发布一个WebService服务:

首先在原来的WebServiec工程加入以下jar包:

commons-logging-1.0.4.jar
gmbal-api-only.jar
ha-api.jar
jaxb-impl.jar
jaxws-api.jar
jaxws-rt.jar
jaxws-spring-1.8.jar
management-api.jar
policy.jar
spring-beans-3.2.14.RELEASE.jar
spring-context-3.2.14.RELEASE.jar
spring-core-3.2.14.RELEASE.jar
spring-expression-3.2.14.RELEASE.jar
spring-web-3.2.14.RELEASE.jar
stax-ex.jar
streambuffer.jar
xbean-spring-3.0.jar

因为涉及jar包比较多,如果有需要的话,可以留下邮箱,我发过去。

然后建一个SpeakingService类,Component注解是表示这个类将被spring容器管理,如下所示,

package com.webService;

import javax.jws.WebService;

import org.springframework.stereotype.Component;

@Component
@WebService
public class SpeakingService { public String speak(String content) {
return "speaking:"+content;
} }

然后在WEB-INF下建web.xml文件,内容如下:

<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener> <servlet>
<servlet-name>jwsService</servlet-name>
<servlet-class>
com.sun.xml.ws.transport.http.servlet.WSSpringServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet> <servlet-mapping>
<servlet-name>jwsService</servlet-name>
<url-pattern>/SpeakingService</url-pattern>
</servlet-mapping>
</web-app>

然后在src路径下建立applicationContext.xml文件,内容如下:

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ws="http://jax-ws.dev.java.net/spring/core"
xmlns:wss="http://jax-ws.dev.java.net/spring/servlet" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://jax-ws.dev.java.net/spring/core
http://jax-ws.dev.java.net/spring/core.xsd
http://jax-ws.dev.java.net/spring/servlet
http://jax-ws.dev.java.net/spring/servlet.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
"> <context:component-scan base-package="*"/> <wss:binding url="/SpeakingService">
<wss:service>
<ws:service bean="#speakingService" />
</wss:service>
</wss:binding> </beans>

这里有个细节要注意的是<ws:service bean="#speakingService" />这里的speakingService首字母记得要小写,虽然原来的类名是大写开头,但是默认加载进spring容器之后,bean的id就是一小写开头了。

最后就是用tomcat将这个工程启动就可以了,访问的ip和端口以及资源名称就以tomcat容器的设定为准了。生成客户端的方法和刚开始说的一样。

如果有问题,欢迎指出交流。

转载请注明出处:http://www.cnblogs.com/Starshot/p/7050084.html

(原创)用JAX-WS+Spring实现简单soap规范的webservice的更多相关文章

  1. Spring cache简单使用guava cache

    Spring cache简单使用 前言 spring有一套和各种缓存的集成方式.类似于sl4j,你可以选择log框架实现,也一样可以实现缓存实现,比如ehcache,guava cache. [TOC ...

  2. Spring的简单demo

    ---------------------------------------- 开发一个Spring的简单Demo,具体的步骤如下: 1.构造一个maven项目 2.在maven项目的pom.xml ...

  3. 1.Spring IoC简单例子

    Spring IoC简单例子 1.IHelloMessage.java package com.tony.spring.chapter01; public interface IHelloMessag ...

  4. Spring mvc系列一之 Spring mvc简单配置

    Spring mvc系列一之 Spring mvc简单配置-引用 Spring MVC做为SpringFrameWork的后续产品,Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块 ...

  5. 玩转spring boot——简单登录认证

    前言 在一个web项目中,某些页面是可以匿名访问的,但有些页面则不能.spring mvc提供了HandlerInterceptor接口来应对,只需要重写preHandle方法便可以实现此功能.那么使 ...

  6. Spring.Net 简单实例-02(属性注入)

    说明:接续Spring.Net 简单实例-01(IOC) 话不多说看操作 1:为UserInfo添加属性 2: 修改App.config中代码 <?xml version="1.0&q ...

  7. DI spring.net简单使用

    IOC或DI  spring.net简单使用 一.spring.net是什么? Spring 框架本是 Java 平台上一个应用非常多的.开源的框架.虽然语言是固定的,但是好的方法应该是通用的,于是 ...

  8. Spring的简单应用与基本原理

    一:重要概念理解 Spring很简单,一定不要想得太复杂,只是有些东西很拗口而已 1:IOC(控制反转) 概念:利用反射的原理将对象创建的权利交给了Spring,Spring在运行的时候根据配置文件( ...

  9. Spring Framework简单介绍

    Spring Framework        学习java编程不知不觉已经三年时间了,開始的时候,总是喜欢看着视频,然后按部就班的敲打着键盘,每当系统正常执行后.心里乐开了花.最開始的时候,所有的代 ...

随机推荐

  1. cmd 命令行模式操作数据库 添加查询 修改 删除 ( 表 字段 数据)

    一 查看数据库.表.数据字段.数据 1 首先配置环境变量 进入mysql  或者通过一键集成工具 打开mysql命令行  或者mysql 可视化工具 打开命令行 进入这样的界面   不同的机器操作不同 ...

  2. windows下配置mysql数据库主从

    所用到工具: Mysql.Navicat Premium: 主库设置: 一.设置my.ini 文件: 1.在安装目录下找到my.ini 文件: 默认路径:C:\Program Files\MySQL\ ...

  3. pygame开发滑雪者游戏

    pygame开发滑雪者游戏 一.实验说明 下述介绍为实验楼默认环境,如果您使用的是定制环境,请修改成您自己的环境介绍. 1. 环境登录 无需密码自动登录,系统用户名 shiyanlou,该用户具备 s ...

  4. 智能指针剖析(下)boost::shared_ptr&其他

    1. boost::shared_ptr 前面我已经讲解了两个比较简单的智能指针,它们都有各自的优缺点.由于 boost::scoped_ptr 独享所有权,当我们真真需要复制智能指针时,需求便满足不 ...

  5. Java学习笔记——排序算法之进阶排序(堆排序与分治并归排序)

    春蚕到死丝方尽,蜡炬成灰泪始干 --无题 这里介绍两个比较难的算法: 1.堆排序 2.分治并归排序 先说堆. 这里请大家先自行了解完全二叉树的数据结构. 堆是完全二叉树.大顶堆是在堆中,任意双亲值都大 ...

  6. 【SoDiaoEditor电子病历编辑器】阶段性更新--新增复选框、日期控件、表格排版支持等

    转眼距离上一次v2正式发布已经过去一个半月了.github期间不定期push了二十几次,同时感谢分布在广州.福建.上海.北京的一众小伙伴,正是你们给出的建议,才让SoDiaoEditor不断完善. 我 ...

  7. 仿中关村win8频道(win8.zol.com.cn)下的tab效果

    最近觉得中关村win8频道下的那个Tab效果很好看. 一时兴起就自己做了一个.觉得还蛮不错的,特地来给大家分享一下.以下是相关的HTML页面写法: <div class="popula ...

  8. 我对Stub和Mock的理解

    介绍 使用测试驱动开发大半年了,我还是对Stub和Mock的认识比较模糊,没有进行系统整理. 今天查阅了相关资料,觉得写得很不错,所以我试图在博文中对资料进行整理一下,再加上一些自己的观点. 本文是目 ...

  9. Python—课时ONE

    说实话第一次接触Python还是在我刚上班的时候,听说很多人这个开发语言很吊,应用的领域很多.but这些东西还不能够吸引我,真正的原因是因为这个开发语言很是简单,比较适合我这种2B学的.但是越往后越觉 ...

  10. SimpleDateFormat使用和线程安全问题

    SimpleDateFormat 是一个以国别敏感的方式格式化和分析数据的具体类. 它允许格式化 (date -> text).语法分析 (text -> date)和标准化. Simpl ...