谈谈EJB是如何发布Web Service的(一)

2014-11-23 20:27:34 · 作者: · 浏览: 8

定义


我们经常会听到,xx项目中用到了Web Service。那么,什么是Web Service呢?
首先让我们来了解一下Web Service。Web Service技术,就是能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件, 就可相互交换数据或集成。依据Web Service规范实施的应用之间,无论它们所使用的语言、平台或内部协议是什么,都可以相互交换数据。Web Service是自描述、自包含的可用网络模块,可以执行具体的业务功能。
Web service是一个平台独立的,低耦合的,自包含的、基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述、发布、发现、协调和配置这些应用程序,用于开发分布式的互操作的应用程序。

准备


将EJB发布成Web服务,在EJB容器中不是困难的事情,只要容器实现了JavaEE的JAX-WS标准就行了,开发人员要做的就是增加一点点有关WebService的注解,打包发布到应用容器即可。

步骤


创建Web Service

  • 建立一个POJO endpoint 服务端不用再强制规定WebService必须实现一个接口了,而一个普通的POJO+EJB注解的类就可以当做WebService服务器类。
    HelloWorld服务端代码
    package com.foshanshop.ws;
    
    import javax.jws.WebMethod;
    import javax.jws.WebService;
    import javax.jws.soap.SOAPBinding;
    
    @WebService(name="HelloWorld",
    		targetNamespace="http://com.foshanshop.ws",
    		serviceName="HelloWorldService")
    @SOAPBinding(style=SOAPBinding.Style.RPC)
    public class HelloWorldService {
    	
    	@WebMethod
    	public String sayHello(String name) {
    		System.out.println("客户端调用了服务器端的代码");
    		return name + "说:这是一个简单的Web测试服务!";
    	}
    }

    @WebService 这个注释放置在 Java 类的前面,声明这个类的部分方法可以被发布为 Web 服务。 @WebService 的属性用于设置 Web 服务被发布时的一些配置信息,常用的属性说明如下 1. name Web 服务的名字,WSDL中 wsdl:portType 元素的 name 属性和它保持一致,默认是 Java 类或者接口的名字。 2. serviceName Web 服务的服务名,WSDL 中 wsdl:service 元素的 name 属性和它保持一致,默认是Java 类的名字+”Service” 。
    3. targetNamespace WSDL文件所使用的 namespace,该 Web 服务中所产生的其他 XML文档同样采用这个作为 namespace 。 @SOAPBinding()表示这个服务可以映射到一个 SOAP 消息中。 Style 用于指定SOAP 消息请求和回应的编码方式。 @WebMethod 这个注释放在需要被发布成 Web 服务的方法前面。
    • 把endpoint定义成Servlet Web.xml配置
            
         
             
              HelloWorldService
             
         
             
              com.foshanshop.ws.HelloWorldService
             
      
            
      
            
         
             
              HelloWorldService
             
         
             
              /HelloWorldService/*
             
      
            

      • 把endpoint打包成war包 定义好Servlet之后,将服务端的类打成war包,部署到JBoss容器中。
        注意:POJO endpoint 文件及 web.xml都是必须的。
        经过上面的步骤,完成了一个Web Service 的开发,下面我们通过Jboss管理平台查看刚才发布的 Web Service,打开链接 http://localhost:8080/jbossws,看到如下界面
        \

        点击“View a list of deployed services”后,就可以看到已经发布的Web Services了,如下图

        \

        在上图中你可以点击 ServiceEndpointAddress 下的路径 http://127.0.0.1:8080/ws_01/HelloWorldService wsdl 访问他的 wsdl描述,wsdl描述文件在应用发布时由容器自动生成,输出如下
        \

        创建客户端


        首先新建一个名为ws_01_client 的 java 项目,然后新建一个Web Service Client,然后在WSDL URL中输入:http://127.0.0.1:8080/ws_01/HelloWorldService wsdl,一路下一步即可。
        创建好客户端之后,写了一个测试类,代码如下
        package com.foshanshop.ws;
        
        import ws.foshanshop.com.HelloWorld;
        import ws.foshanshop.com.HelloWorldService;
        
        public class TestHelloWorld {
        
        	/**
        	 * @param args
        	 */
        	public static void main(String[] args) {
        		HelloWorldService helloWorldService = new HelloWorldService();
        		HelloWorld helloWorld = helloWorldService.getHelloWorldPort();
        		System.out.println(helloWorld.sayHello("小星星"));
        	}
        }


        输出

        • 客户端输出 小星星说:这是一个简单的Web测试服务!
          • 服务端输出 16:46:26,474 INFO [STDOUT] 客户端调用了服务器端的代码

            小结


            其实,EJB发布Web Service还是比较简单的,我这里只是列出了一个用java语言调用Web Service的方法,其他也都是很类似的。
            实际上,WebService的主要目标是跨平台的可互操作性。为了达到这一目标,WebService完全基于XML(可扩展标记语言)、XSD (XMLSchema)等独立于平台、独立于软件供应商的标准,是创建可互操作的、分布式应用程序的新平台。由此可以看出,在以下三种情况下,使用 WebService会带来极大的好处。
            • 跨防火墙的通信 在一个用户界面和中间层有较多交互的应用程序中,使用 WebService这种结构,可以节省花在用户界面编程上20%的开发时间。另外,这样一个由WebService组成的中间层,完全可以在应用程序集 成或其它场合下重用。最后,通过WebService把应用程序的逻辑和数据“暴露”出来,还可以让其它平台上的客户重用这些应用程序。
              • 应用程序集成 企业级的应用程序开发者都知道,企业里经常都要把用不同语言写成的、在不同平台上运行的各种程序集成起来,而这种集成将花费很大的开发力量。通过WebService,应用程序可以用标准的方法把功能和数据“暴露