分分钟带你玩转 Web Services【1】JAX-WS

简介:

  当大型需求被数个公司分割开来,各公司系统相互交换数据的问题就会接踵而来。

  毕竟是多家不同的公司的产品,研发开发语言、采用技术框架基本上是百花齐放。

  怎样让自家系统提供的服务具有跨平台、跨语言、跨各种防火墙,让其他公司的研发使用起来没障碍并且爽呢?

  进过前期的技术调研和实践,最终将目光放在了轻量级 Web Services 服务上面。

 

 

 

回到顶部

1. Web Services 服务技术的关键点

  • XML:     做为 Web Services 的基本数据表示,特点即容易组织和分析,而且又与开发平台和语言无关。
  • SOAP:   做为 Web Services 的通信协议,基于 XML能运行在任何传输协议(TCP/UDP..)上面,将程序中的对象编码为 XML 的规则,执行远程调用。

   TCP/HTTP/UDP 传输协议可以理解为寄信时信封上的格式怎么写,贴什么邮票;

   SOAP 通信协议可以理解为信里面写什么,相互是怎么交流的。

  • WSDL:  做为描述 Web Services 的语言,你能很清晰的知道提供的服务是什么、入参、返回的数据,机器和人都很容器进行阅读。

  公司自己实现 Web Services 服务框架肯定是不现实的,如果你公司有一群热爱技术的大牛、有一颗想造轮子的匠心,有老总的支持,还是可以放手一战的。

  目前已有的 Web Services 开发框架有:  Axis、Axis2、Xfire、CXF、JAX-WS。

  除了 JAX-WS 为 JDK 1.6 发布的的 Web Services 开发框架以外,其余的都是第三方开源框架。

  其中 Axis 和 XFire 随着技术更新和发展已经慢慢的谈出了人们的视线,并且官方已经有很长时间没有更新,这里暂且不表。

  CXF是Apache旗下一个重磅的SOA简易框架,它实现了ESB(企业服务总线)。

  CXF 原型来源与 XFire + Client, 就像 Struts2 来自 WebWork 一样,当然你也能预言到 XFire 的命运会和 WebWork 一样,会淡出开发者的视线。

  Axis2 是 Apache 下的一个重量级 Web Services框架,准确说它是一个Web Services / SOAP / WSDL 的引擎,是 Web Services 框架的集大成者。

  Axis2 不但能制作和发布WebService,而且可以生成Java和其他语言版WebService客户端和服务端代码。这是它的优势所在。

  丰满意味着臃肿和庞大,这样的优势也不可避免的导致了Axis2的复杂性,听使用过她的人,它所依赖的包数量和大小都是很惊人的,打包部署发布很麻烦。

  源于对第三方开源框架的恐惧和颤抖,结合自身公司的业务复杂度,技术团队一致选定 JDK JAX-WS 作为公司的 Web Services 框架。

  上述参考出处:


  http://baike.baidu.com/link?url=OHYozkeWQkpZDmnKeDk9Ja

回到顶部

2. JAX-WS 服务端无 MVC 框架开发实践

  我这里的说的无 MVC 框架指的是没有使用任何像 Struts/Spring MVC/WebWork....这些东西,Java EE 项目最纯真的 Servlet 时代。

  在 main 函数中静态方式发布这里就不提了,确实有点 low,咱需要 Web Services 服务和 web 项目一起启动起来,同呼吸共命运。

  main 静态发布方式参考:http://www.xuebuyuan.com/1955910.html

  • a.maven 依赖

        <dependency>
            <groupId>com.sun.xml.wsgroupId>
            <artifactId>jaxws-rtartifactId>
            <version>2.2.10version>
        dependency>

  如果是非 mavn的传统项目, 需要的 jar (大概 5M)

  • b.服务类和实现类

  项目包结构

复制代码

@WebService
@SOAPBinding(style = SOAPBinding.Style.RPC)
public interface MyFirstWebService {

    /**
     * 执行测试的WebService方法(有参)
     */
    @WebMethod
    String sayHi(@WebParam(name = "name") String name);

}

复制代码

复制代码

@WebService(endpointInterface = "com.rambo.cwe.jws.inter.MyFirstWebService")
@SOAPBinding(style = SOAPBinding.Style.RPC)
public class MyFirstWebServiceImpl implements MyFirstWebService {

    public String sayHi(String name) {
        return "Hi, " + name + "! ";
    }
}

复制代码

  • c.web 项目的起点,web.xml 的配置

复制代码

    <listener>
        <listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListenerlistener-class>
    listener>

    <servlet>
        <servlet-name>MyFirstWebServiceservlet-name>
        <servlet-class>com.sun.xml.ws.transport.http.servlet.WSServletservlet-class>
        <load-on-startup>1load-on-startup>    servlet>    <servlet-mapping>        <servlet-name>MyFirstWebServiceservlet-name>        <url-pattern>/services/sayHiurl-pattern>    servlet-mapping>

复制代码

  • d.服务配置文件 sun-jaxws.xml,放置到 WEB-INF

xml version="1.0" encoding="UTF-8"?>
<endpoints xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime" version="2.0">
    <endpoint name="myFirstWebService" implementation="com.rambo.cwe.jws.impl.MyFirstWebServiceImpl"
              url-pattern="/services/sayHi"/>
endpoints>

  注意服务配置文件中的 url-pattern 和 servlet 中的 url-pattern 是一致的。

  通过上面的4步的操作,启动 web 项目吧,不出什么意外的话,启动 web 容器打印日志是这样。

  浏览器访问 http://localhost:5050/cwe/services/sayHi

  示例项目: https://github.com/OrsonEx/cwe

回到顶部

3. JAX-WS 服务端与 Spring 集成开发实践

  在 Spring 中集成相当简单,分分钟配置集成。

  • a.mavn 依赖需要添加的支持 jar(500K)

        <dependency>
            <groupId>org.springframework.wsgroupId>
            <artifactId>spring-ws-coreartifactId>
            <version>2.3.0.RELEASEversion>
        dependency>
  • b.Spring Bean 添加 Web Services 服务支持

     <bean class="org.springframework.remoting.jaxws.SimpleJaxWsServiceExporter">
        <property name="baseAddress" value="http://localhost:8089/services/"/>
    bean>

  地址你随意,配置为和 web 项目一致也没问题。

  • c.服务实现类 Bean 配置

  大体的意思是你得让 Spring 知道有这样一个服务实现类。

  如果你比较传统,可以配置在 Spring-***.xml 中,像这样

    <bean id="myFirstWebServiceImpl" class="com.rambo.cwe.jws.impl.MyFirstWebServiceImpl">
        ...
    bean>

  当然你也可以,使用注解,像这样

  简单的三步之后,把你的 web 容器启动起来吧,Web Services 服务就发布成功了。

  实例工程:https://github.com/OrsonEx/sme-jws

回到顶部

4. 客户端  JAX-WS 服务的调用

 服务端编写好之后,使用 JDk 自带的 wsimport 工具生成客户端代理类。

 wsimport 只需要指定 url 就能生成 java 调用的客户端,你完全不用去了解这个 WebServer 服务是用什么语言编写的。

wsimport -s f:  http://localhost:5050/cwe/services/sayHi?wsdl

 wsimport 常用参数参考:

参数 说明
-p 定义客户端生成类的包名称
-s 指定客户端执行类的源文件存放目录
-d 指定客户端执行类的class文件的存放目录
-keep                                                     表示生成客户端执行类的源代码
-b 指定jaxws/jaxb绑定文件或额外的schemas
-extension 使用扩展来支持SOAP1.2

 补充: 关于 wsimport 生成代理类:http://blog.csdn.net/aqsunkai/article/details/51711087

 生成的代理类(生成姿势多种多样,自行参考上面常用参数,没有标准只有最适合):

  将代理类放入客户端项目,只需要两行代码就能实现 Web Services 服务的调用,如下

            MyFirstWebServiceImplService service = MyFirstWebServiceImplService();
            MyFirstWebService implPort = service.getMyFirstWebServiceImplPort();
            System.out.println(implPort.sayHi("Orson"));

  其实我一直想尝试,不往客户端添加任何代码,调用 Web Services 服务,很遗憾没能成功。

  最接近的的是,在客户端放入服务端的接口类,代码可以这样写。

复制代码

            URL url = new URL("http://localhost:5050/cwe/services/sayHi?wsdl");
            QName serviceName = new QName("http://impl.jws.cwe.rambo.com/", "MyFirstWebServiceImplService");
            QName portName = new QName("http://impl.jws.cwe.rambo.com/", "MyFirstWebServiceImplPort");

            Service service = Service.create(url,serviceName);
            MyFirstWebService servicePort = service.getPort(portName,MyFirstWebService.class);
            System.out.println(servicePort.sayHi("Orson"));

复制代码

  自行定义连接地址、服务名称、、端口名称,生成服务实例进行访问,代码完全没有使用代理类那样清晰。

本文转自Orson博客园博客,原文链接:http://www.cnblogs.com/java-class/p/5851170.html,如需转载请自行联系原作者

相关文章
|
10月前
|
前端开发 JavaScript API
阿里云智能媒体服务IMS(Intelligent Media Services)的视频剪辑Web SDK
【1月更文挑战第15天】【1月更文挑战第72篇】阿里云智能媒体服务IMS(Intelligent Media Services)的视频剪辑Web SDK
227 6
|
XML Java 数据格式
大多数人忽略了的Spring官方项目,Spring Web Services
大多数人忽略了的Spring官方项目,Spring Web Services
1457 0
|
3天前
|
XML JSON API
Understanding RESTful API and Web Services: Key Differences and Use Cases
在现代软件开发中,RESTful API和Web服务均用于实现系统间通信,但各有特点。RESTful API遵循REST原则,主要使用HTTP/HTTPS协议,数据格式多为JSON或XML,适用于无状态通信;而Web服务包括SOAP和REST,常用于基于网络的API,采用标准化方法如WSDL或OpenAPI。理解两者区别有助于选择适合应用需求的解决方案,构建高效、可扩展的应用程序。
|
5月前
|
XML 关系型数据库 MySQL
Web Services 服务 是不是过时了?创建 Web Services 服务实例
本文讨论了WebServices(基于SOAP协议)与WebAPI(基于RESTful)在开发中的应用,回顾了WebServices的历史特点,比较了两者在技术栈、轻量化和适用场景的差异,并分享了使用VB.net开发WebServices的具体配置步骤和疑问。
157 0
|
9月前
|
XML 前端开发 JavaScript
RESTful Web Services
RESTful Web Services
65 2
|
10月前
|
Ubuntu Linux 网络安全
在Amazon Web Services中使用R语言运行模拟
在Amazon Web Services中使用R语言运行模拟
|
弹性计算 安全 数据安全/隐私保护
Internet Information Services(IIS)部署Web项目
本文为您介绍如何快速使用IIS搭建简单网站并发布项目。
|
Java Linux API
Java:ews-java-api获取Exchange Web Services (EWS)会议日程
Java:ews-java-api获取Exchange Web Services (EWS)会议日程
762 0
|
XML 网络协议 JavaScript
Web Services:重整山河待后生
Web Services:重整山河待后生
208 0
|
弹性计算 安全 Windows
Internet Information Services(IIS)部署Web项目
Window Server2016服务器,mstsc远程桌面连接,IIS安装与配置
875 0
Internet Information Services(IIS)部署Web项目

热门文章

最新文章