`

JavaSE6.0下的Web Service

阅读更多

从JavaSE6.0开始,Java引入了对Web Service的原生支持。我们只需要简单的使用Java的Annotation标签即可将标准的Java方法发布成Web Service。(PS:Java Annotation资料请参考 JDK5.0 Annotation学习笔记(一)

但不是所有的Java类都可以发布成Web Service。Java类若要成为一个实现了Web Service的bean,它需要遵循下边这些原则:

  •  这个类必须是public类
  •  这些类不能是final的或者abstract
  •  这个类必须有一个公共的默认构造函数
  •  这个类绝对不能有finalize()方法

下面我们将通过一个具体的Java Web Service代码例子,配合上述的WSDL文件,讲述如何编写JavaSE6.0的原生Web Service应用。

完整的Java Web Service类代码

  1. package org.jsoso.jws.server;   
  2.   
  3. import java.util.ArrayList;   
  4. import javax.jws.WebMethod;   
  5. import javax.jws.WebParam;   
  6. import javax.jws.WebResult;   
  7. import javax.jws.WebService;   
  8. import javax.jws.WebParam.Mode;   
  9. import javax.jws.soap.SOAPBinding;   
  10. /   
  11.  * 提供WebService服务的类   
  12.  */   
  13. @WebService(name="Example", targetNamespace="http://www.jsoso.com/wstest", serviceName="Example")   
  14. @SOAPBinding(style=SOAPBinding.Style.RPC)   
  15. public class Example {   
  16.     private ArrayList<Person> persons = new ArrayList<Person>();;   
  17.     /**  
  18.      *   
  19.      * 返回一个字符串  
  20.      * @param userName  
  21.      * @return  
  22.      */  
  23.     @WebMethod(operationName="toSayHello",action="sayHello",exclude=false)   
  24.     @WebResult(name="returnWord")//自定义该方法返回值在WSDL中相关的描述   
  25.     public String sayHello(@WebParam(name="userName")String userName) {   
  26.         return "Hello:" + userName;   
  27.     }   
  28.   
  29.     /**  
  30.      * web services 方法的返回值与参数的类型不能为接口  
  31.      * @param person  
  32.      * @return  
  33.      * @throws HelloException  
  34.      */  
  35.     @WebMethod(operationName="sayHello", action="sayHello")   
  36.     @WebResult(partName="personList")   
  37.     public Person[] sayHello(@WebParam(partName="person", mode=Mode.IN)Person person,    
  38.             String userName) throws HelloException {   
  39.         if (person == null || person.getName() == null) {   
  40.             throw new HelloException("说hello出错,对像为空。。");   
  41.         }   
  42.         System.out.println(person.getName() + " 对 " + userName + " 说:Hello,我今年" + person.getAge() + "岁");   
  43.         persons.add(person);   
  44.         return persons.toArray(new Person[0]);   
  45.     }   
  46. }

  1. package org.jsoso.jws.server;   
  2.   
  3. import java.util.ArrayList;   
  4. import javax.jws.WebMethod;   
  5. import javax.jws.WebParam;   
  6. import javax.jws.WebResult;   
  7. import javax.jws.WebService;   
  8. import javax.jws.WebParam.Mode;   
  9. import javax.jws.soap.SOAPBinding;   
  10. /   
  11.  * 提供WebService服务的类   
  12.  */   
  13. @WebService(name="Example", targetNamespace="http://www.jsoso.com/wstest", serviceName="Example")   
  14. @SOAPBinding(style=SOAPBinding.Style.RPC)   
  15. public class Example {   
  16.     private ArrayList<Person> persons = new ArrayList<Person>();;   
  17.     /**  
  18.      *   
  19.      * 返回一个字符串  
  20.      * @param userName  
  21.      * @return  
  22.      */  
  23.     @WebMethod(operationName="toSayHello",action="sayHello",exclude=false)   
  24.     @WebResult(name="returnWord")//自定义该方法返回值在WSDL中相关的描述   
  25.     public String sayHello(@WebParam(name="userName")String userName) {   
  26.         return "Hello:" + userName;   
  27.     }   
  28.   
  29.     /**  
  30.      * web services 方法的返回值与参数的类型不能为接口  
  31.      * @param person  
  32.      * @return  
  33.      * @throws HelloException  
  34.      */  
  35.     @WebMethod(operationName="sayHello", action="sayHello")   
  36.     @WebResult(partName="personList")   
  37.     public Person[] sayHello(@WebParam(partName="person", mode=Mode.IN)Person person,    
  38.             String userName) throws HelloException {   
  39.         if (person == null || person.getName() == null) {   
  40.             throw new HelloException("说hello出错,对像为空。。");   
  41.         }   
  42.         System.out.println(person.getName() + " 对 " + userName + " 说:Hello,我今年" + person.getAge() + "岁");   
  43.         persons.add(person);   
  44.         return persons.toArray(new Person[0]);   
  45.     }   
  46. }  

Annotation 1@WebService(name="Example", targetNamespace="http://www.jsoso.com/wstest", serviceName="Example")
@WebService标签主要将类暴露为WebService,其中targetNamespace属性定义了自己的命名空间,serviceName则定义了< definitions >标签和<service>标签的name属性。

Annotation 2:@SOAPBinding(style=SOAPBinding.Style.RPC)
@SOAPBinding标签定义了WSDL文档中SOAP的消息协议,其中style属性对应SOAP的文档类型,可选的有RPC和DOCUMENT

Annotation 3:@WebMethod(operationName="toSayHello",action="sayHello",exclude=false)
@WebMethod定义Web Service运作的方法,
属性action 对应操作的活动 ,如<soap:operation soapAction="sayHello" />
属性operationName匹配的wsdl:operation 的名称,如<operation name="toSayHello" parameterOrder="userName">
属性exclude 用于阻止将某一继承方法公开为web服务,默认为false

Annotation 4:@WebResult(name="returnWord")
@ WebResult定义方法返回值得名称,如<part name="returnWord" type="xsd:string" />

Annotation 5:@WebParam(partName="person", mode=Mode.IN
@WebParam定义方法的参数名称,如<part name="person" type="tns:person" />,其中mode属性表示参数的流向,可选值有IN / OUT / INOUT

这里要着重说明的是,上述Web Service类的sayHello方法中,带有HelloException这个异常声明,造成该服务类不能直接发布成Web Service。需要使用wsgen工具为其生存异常Bean。关于wsgen工具的使用,请参考wsgen与wsimport命令说明

发布一个的Java Web Service
在完成了上述的Web Service Annotation注释后,我们使用wsgen工具为其进行服务资源文件的构造(这里主要是生成一个名为org.jsoso.jws.server.jaxws.HelloExceptionBean的异常bean类),最后使用以下的类发布Web 服务:

 

  1. package org.jsoso.jws.server;   
  2.   
  3. import java.util.LinkedList;   
  4. import java.util.List;   
  5. import javax.xml.ws.Binding;   
  6. import javax.xml.ws.Endpoint;   
  7. import javax.xml.ws.handler.Handler;   
  8.   
  9. /**  
  10.  * @author zsy 启动web services服务  
  11.  */  
  12. public class StartServer {   
  13.   
  14.     /**  
  15.      * @param args  
  16.      */  
  17.     public static void main(String[] args) {   
  18.         /*  
  19.          * 生成Example 服务实例  
  20.          */  
  21.         Example serverBean = new Example();   
  22.         /*  
  23.          * 发布Web Service到http://localhost:8080/hello地址  
  24.          */  
  25.         Endpoint endpoint =    
  26.            Endpoint.publish("http://localhost:8080/hello", serverBean);   
  27.         Binding binding = endpoint.getBinding();   
  28.         /*  
  29.          * 设置一个SOAP协议处理栈  
  30.          * 这里就简单得打印SOAP的消息文本  
  31.          */  
  32.         List<Handler> handlerChain = new LinkedList<Handler>();   
  33.         handlerChain.add(new TraceHandler());   
  34.         binding.setHandlerChain(handlerChain);   
  35.         System.out.println("服务已启动 http://localhost:8080/hello");   
  36.     }   
  37. }  
Java代码 复制代码
  1. package org.jsoso.jws.server;   
  2.   
  3. import java.util.LinkedList;   
  4. import java.util.List;   
  5. import javax.xml.ws.Binding;   
  6. import javax.xml.ws.Endpoint;   
  7. import javax.xml.ws.handler.Handler;   
  8.   
  9. /**  
  10.  * @author zsy 启动web services服务  
  11.  */  
  12. public class StartServer {   
  13.   
  14.     /**  
  15.      * @param args  
  16.      */  
  17.     public static void main(String[] args) {   
  18.         /*  
  19.          * 生成Example 服务实例  
  20.          */  
  21.         Example serverBean = new Example();   
  22.         /*  
  23.          * 发布Web Service到http://localhost:8080/hello地址  
  24.          */  
  25.         Endpoint endpoint =    
  26.            Endpoint.publish("http://localhost:8080/hello", serverBean);   
  27.         Binding binding = endpoint.getBinding();   
  28.         /*  
  29.          * 设置一个SOAP协议处理栈  
  30.          * 这里就简单得打印SOAP的消息文本  
  31.          */  
  32.         List<Handler> handlerChain = new LinkedList<Handler>();   
  33.         handlerChain.add(new TraceHandler());   
  34.         binding.setHandlerChain(handlerChain);   
  35.         System.out.println("服务已启动 http://localhost:8080/hello");   
  36.     }   
  37. }  

在控制台运行这个类,就可以使用URL :http://localhost:8080/hello?wsdl 浏览到上文所描述的WSDL的全文了。这说明您的第一个Web Service应用发布成功!

构建Web Service客户端
使用JavaSE6.0构建Web Service的客户端是一件相当简单的事。这里我们要使用到JDK中的另一个命令行工具wsimport。在控制台下输入以下命令:

wsimport -d ./bin -s ./src -p org.jsoso.jws.client.ref  http://localhost:8080/hello?wsdl

即可在包org.jsoso.jws.client.ref中生成客户端的存根及框架文件。其中我们要使用的类只有两个:服务类Example_Service和本地接口Example。编写如下客户端,即可调用Web Service服务:

 

  1. package org.jsoso.jws.client;   
  2.   
  3. import org.jsoso.jws.client.ref.*;   
  4.   
  5. public class RunClient {   
  6.   
  7.     /**  
  8.      * @param args  
  9.      */  
  10.     public static void main(String[] args) {   
  11.         //初始化服务框架类   
  12.         Example_Service service = new Example_Service();   
  13.         //或者本地服务借口的实例   
  14.         Example server = (Example) service.getExamplePort();   
  15.         try {   
  16.             //调用web service的toSayHello方法   
  17.             System.out.println("输入toSayHello的返回值——" + server.toSayHello("阿土"));            
  18.              Person person = new Person();   
  19.              person.setName("阿土");   
  20.              person.setAge(25);   
  21.              //调用web service的sayHello方法   
  22.              server.sayHello(person, "机器人");   
  23.                 
  24.              person = new Person();   
  25.              person.setName("aten");   
  26.              person.setAge(30);   
  27.              //调用web service的sayHello方法   
  28.              PersonArray list = server.sayHello(person, "机器人");   
  29.             //输出返回值   
  30.              System.out.println("\n以下输入sayHello的返回值——");   
  31.             for (Person p : list.getItem()) {   
  32.                 System.out.println(p.getName() + ":" + p.getAge());   
  33.             }              
  34.         } catch (HelloException_Exception e) {   
  35.             e.printStackTrace();   
  36.         }   
  37.     }   
  38. }

  1. package org.jsoso.jws.client;   
  2.   
  3. import org.jsoso.jws.client.ref.*;   
  4.   
  5. public class RunClient {   
  6.   
  7.     /**  
  8.      * @param args  
  9.      */  
  10.     public static void main(String[] args) {   
  11.         //初始化服务框架类   
  12.         Example_Service service = new Example_Service();   
  13.         //或者本地服务借口的实例   
  14.         Example server = (Example) service.getExamplePort();   
  15.         try {   
  16.             //调用web service的toSayHello方法   
  17.             System.out.println("输入toSayHello的返回值——" + server.toSayHello("阿土"));            
  18.              Person person = new Person();   
  19.              person.setName("阿土");   
  20.              person.setAge(25);   
  21.              //调用web service的sayHello方法   
  22.              server.sayHello(person, "机器人");   
  23.                 
  24.              person = new Person();   
  25.              person.setName("aten");   
  26.              person.setAge(30);   
  27.              //调用web service的sayHello方法   
  28.              PersonArray list = server.sayHello(person, "机器人");   
  29.             //输出返回值   
  30.              System.out.println("\n以下输入sayHello的返回值——");   
  31.             for (Person p : list.getItem()) {   
  32.                 System.out.println(p.getName() + ":" + p.getAge());   
  33.             }              
  34.         } catch (HelloException_Exception e) {   
  35.             e.printStackTrace();   
  36.         }   
  37.     }   
  38. }  

 

 

届此,本次Web Service的学习暂告一个段落。Java Web Service是一个相当庞大的知识体系,其中涉及的相关技术较多,这里无法一一道来,我们将会在今后的开发和使用中,同大家做进一步深入的探讨和学习。

附录:wsgen与wsimport命令说明

wsgen
wsgen是在JDK的bin目录下的一个exe文件(Windows版),该命令的主要功能是用来生成合适的JAX-WS。它读取Web Service的终端类文件,同时生成所有用于发布Web Service所依赖的源代码文件和经过编译过的二进制类文件。这里要特别说明的是,通常在Web Service Bean中用到的异常类会另外生成一个描述Bean,如果Web Service Bean中的方法有申明抛出异常,这一步是必需的,否则服务器无法绑定该对像。此外,wsgen还能辅助生成WSDL和相关的xsd文件。wsgen从资源文件生成一个完整的操作列表并验证web service是否合法,可以完整发布。
命令参数说明:

  •  -cp 定义classpath
  •  -r 生成 bean的wsdl文件的存放目录
  •  -s 生成发布Web Service的源代码文件的存放目录(如果方法有抛出异常,则会生成该异常的描述类源文件)
  •  -d 生成发布Web Service的编译过的二进制类文件的存放目录(该异常的描述类的class文件)


命令范例:wsgen -cp ./bin -r ./wsdl -s ./src -d ./bin -wsdl org.jsoso.jws.server.Example

wsimport
wsimport也是在JDK的bin目录下的一个exe文件(Windows版),主要功能是根据服务端发布的wsdl文件生成客户端存根及框架,负责与Web Service 服务器通信,并在将其封装成实例,客户端可以直接使用,就像使用本地实例一样。对Java而言,wsimport帮助程序员生存调用web service所需要的客户端类文件.java和.class。要提醒指出的是,wsimport可以用于非Java的服务器端,如:服务器端也许是C#编写的web service,通过wsimport则生成Java的客户端实现。
命令参数说明:

  •  -d 生成客户端执行类的class文件的存放目录
  •  -s 生成客户端执行类的源文件的存放目录
  •  -p 定义生成类的包名


命令范例:wsimport -d ./bin -s ./src -p org.jsoso.jws.client.ref http://localhost:8080/hello?wsdl

分享到:
评论

相关推荐

    JavaSE6.0的Derby嵌入式数据库

    1. **添加依赖**:将JavaSE6.0安装目录下的“db/lib”子目录中的`derby.jar`文件添加到项目的`CLASSPATH`中。 2. **加载驱动程序**:在Java应用程序中加载Derby的JDBC驱动程序。 3. **编写数据库操作代码**:使用...

    javaSE6.0基础知识集合

    javaSE6.0基础知识集合 什麼是Java 最早是Sun公司Green Project中撰寫Star7 應用程式的一個程式語言 – James Gosling的窗外有顆橡樹(Oak) 全球資訊網興起,Java Applet成為網頁互 動技術的代表 1995/5/23,Java ...

    JavaSE 6.0 API全集(下)

    采用CHM格式的JavaSE APi 汉化版全集。

    JAVASE6.0_Api_en\docs\api

    Java 6中的集合框架是编程中的核心部分,它在`java.util`包下,包括List、Set、Map等接口以及它们的实现类。ArrayList和LinkedList实现了List接口,分别提供基于数组和链表的数据存储方式。HashSet和TreeSet实现了...

    JAVASE6.0_Api_en/docs/

    Java SE 6.0 API(应用程序接口)是Java开发的关键组成部分,它包含了丰富的类库,为程序员提供了构建桌面、Web和服务端应用所需的各种工具和功能。API文档是开发者的重要参考资料,帮助他们理解和使用Java语言的...

    javase api 6.0

    javase6.0 api javadoc 文档以网页方式打开查看

    JavaSE-6.0-英文手册(2008/11/30_FullUpdate)

    Accessibility Drag n Drop Input Methods Image I/O Print Service Sound Java SE API Integration Libraries IDL JDBCTM JNDITM RMI RMI-IIOP Scripting Other Base Libraries Beans Intl Support I/O JMX ...

    JavaSE 6.0 API全集(上)

    采用CHM格式的JavaSE APi 汉化版 全集。

    JavaEE6.0-API_CN

    JavaSE6.0引入了许多新特性,包括增强的并发工具、改进的I/O流、动态语言支持以及新的Swing组件等。API文档详细列出了这些特性的具体实现和用法,涵盖了诸如集合框架、网络编程、多线程、数据库连接(JDBC)、输入/...

    《JavaSE6.0编程指南》光盘源代码

    NULL 博文链接:https://ypf3027.iteye.com/blog/257798

    中文Java 6.0 API(JAVA_6.0_API.part2.rar)

    中文Java 6.0 API(JAVA_6.0_API.part2.rar),是学习、使用JAVA的必备资料 中文,java,api,6.0

    JDK6.0 API

    6.0的其他部分的东西,一共3部分。限制20个字符是哪个猪头想出来的主意?愚蠢透了

    吴亚峰Java SE6.0编程指南案例代码

    《Java SE 6.0 编程指南》是由吴亚峰等专家编著的一本深入讲解Java编程的经典著作。这本书旨在帮助读者掌握Java SE 6.0版本的核心技术和编程实践,通过一系列精心设计的案例,使得学习者能够从理论到实践全面理解...

    Web Service学习

    在JavaSE6.0环境下开发Web Service,开发者可以使用JAX-WS (Java API for XML Web Services)框架,它提供了创建、部署和消费Web Service的全面支持。JAX-WS允许开发者通过注解将Java类映射为Web Service接口,简化了...

    java开发 API文档

    本压缩包包含三份重要的文档:JavaSE6.0中文版、JavaEE5.0中英文对照版以及JavaEE6.0英文版,它们分别对应于Java标准版和企业版的不同版本,涵盖了广泛的Java编程知识。 首先,JavaSE6.0(也称为Java 6)是Java平台...

    Javase-6.0_中文API_HTML(最新更新)

    javase 中文API 最新版 ******************************* JavaTM 2 Platform Standard Ed. 6 所有类软件包 java.applet java.awt java.awt.color java.awt.datatransfer java.awt.dnd java.awt.event ...

Global site tag (gtag.js) - Google Analytics