《JWS操作手册.doc》由会员分享,可在线阅读,更多相关《JWS操作手册.doc(9页珍藏版)》请在三一办公上搜索。
1、Java6原生JWS应用作者:徐骏Java6自带了javax.jws包,通过annotation提供了对webservice原生支持,即在java6下如无特殊要求,一般不需要axis之类的框架就可以进行webserivce开发。同时java6提供了webserivce运行宿主,实现了一个内置的轻量级SOAP服务器,我们可以把Webservice部署到Java平台中,并进行简单的测试,不需要web服务器(如tomcat)就能提供webservice服务测试。webservice传输的自定义对象的属性必须是public的。 必须有默认构造函数。webservice也必须要有默认构造函数。第一个例子
2、下面我们全手工用记事本写一个简单的webservice例子。实体类StudentStudent.javapackage com.xujun.entity;public class Student private String studentName; private int studentId ; private int age ; public String getStudentName() return studentName; public void setStudentName(String studentName) this.studentName = studentName; pu
3、blic int getStudentId() return studentId; public void setStudentId(int studentId) this.studentId = studentId; public int getAge() return age; public void setAge(int age) this.age = age; WebService类StudentManager.javapackage com.xujun.service;import com.xujun.entity.Student;import javax.jws.WebMethod
4、;import javax.jws.WebService;import javax.jws.soap.SOAPBinding;/*通过annotation方式实现webservicetargetNamespace属性定义了自己的命名空间,serviceName则定义了标签和标签的name属性*/WebService(name=StudentService,targetNamespace= , serviceName = StudentManager)/*SOAP绑定方式,默认是document wrapped方式*/SOAPBinding(style=SOAPBinding.Style.RPC
5、)public class StudentManager WebMethod public Student getStudent(int studentId) Student student = new Student(); student.setStudentId(1001); student.setStudentName(张威); student.setAge(17); return student; 服务发布类通过JDK6发布webservice。Main.javapackage jaxws;import com.xujun.service.StudentManager;import j
6、avax.xml.ws.Endpoint;public class Main public static void main(String args) /* Endpoint是发布提供类*/ Endpoint endpoint = Endpoint.publish(http:/10.144.84.5:1010/MyService, new StudentManager(); System.out.println(服务已经启动 http:/10.144.84.5:1010/MyService); 编译java文件我在D盘下建了一个aa的目录,然后将这三个java文件都放入,然后通过命令行集体编译
7、。集体编译命令是:javac d . *.java编译之后的目录结构如下图启动webservice服务直接运行Main.class就可以了。查看WSDL文件使用浏览器(如IE),输入以下URL:http:/10.144.84.5:1010/MyService?wsdl应该可以看到StudentManager的WSDL文件了。生成客户端stub注意,上面启动的web服务不要停止。使用JDK6自带的wsimport工具(在JDK6安装目录的bin目录下可以找到)为发布的WSDL生成客户端的存根及框架文件。我们先在aa目录下创建一个client目录,这个目录用来存放wsimport生成的stud类,
8、在client目录下建一个src,用来存放生成stud的java文件。wsimport命令参数主要有:-d 生成客户端执行类的class文件的存放目录 -s 生成客户端执行类的源文件的存放目录 -p 定义生成类的包名。如果不定义package,默认使用namespace的信息生成package。我的命令如下:wsimport -d client -s clientsrc -p com.xujun.client http:/10.144.84.5:1010/MyService?wsdl注意自己手工写,不要copy到DOS窗口,符合会不正确的编写客户端import com.xujun.client
9、.*;public class Client public static void main(String args)/WebService中的serviceName StudentManager manager = new StudentManager();/WebService中的nameStudentService service = manager.getStudentServicePort(); Student student = service.getStudent(1); System.out.println(student.getStudentName(); 异步调用首先编写一
10、个xml文件,名字随便起。我起的名字是:custom-client.xml.bindings xmlns:xsd=http:/www.w3.org/2001/XMLSchema xmlns:wsdl=http:/schemas.xmlsoap.org/wsdl/ wsdlLocation=http:/localhost:8080/KSDataUploadWebService/dataUpload?wsdl xmlns= true 注意wsdlLocation要修改成你真实的路径。然后控制台命令如下:wsimport -d client -s clientsrc -p cn.simlink.we
11、bservice.ks.client http:/localhost:8080/KSDataUploadWebService/dataUpload?wsdl -b clientcustom-client.xml通过“-b clientcustom-client.xml”指明生成异步调用的stub。服务端是不用作任何改变的。在Tomcat下部署JAX-WS首先需要下载JAX-WS的jar包,放置到lib下,然后编写sun-jaxws.xml 然后在web.xml中增加 com.sun.xml.ws.transport.http.servlet.WSServletContextListener W
12、SServletcom.sun.xml.ws.transport.http.servlet.WSServlet1 WSServlet/dataUpload 调用方式(RPC,Document)与wsgen工具我们在StudentManager中有这样的注解。SOAPBinding(style=SOAPBinding.Style.RPC)这表明StudentManager中使用的是RPC方式的SOAP绑定我们通过http:/10.144.84.5:1010/MyService?xsd=1查看该WSDL的XSD 发现XSD中只包含Student的定义,RPC绑定的XSD中只定义了复杂类型元素,对基
13、本类型元素没有定义,这样就导致了无法验证交换消息的XML文档是否符合XSD规范。下面我们看两种Document方式的SOAP绑定:bare和wrappedbareWebService(name = StudentService, targetNamespace = , serviceName = StudentManager)SOAPBinding(style=SOAPBinding.Style.DOCUMENT,parameterStyle=SOAPBinding.ParameterStyle.BARE)public class StudentManager WebMethod public
14、 Student getStudent(int studentId) /模拟代码 Student student = new Student(); student.setStudentId(1001); student.setStudentName(张威); student.setAge(17); return student; 编译:javac d . StudentManager.java运行之后看WSDL,style从rpc变成了document: 需要注意的是,document绑定方式只能有一个参数,因为document形式的服务要求的输入是“一个文档”,而不是一个带方法名和相应参数的
15、请求。这就意味着在document风格中,我们应该传入一个对象,这个对象将是web服务的唯一输入。Document中会包含服务调用的所有有用信息,但不是方法名及其相应参数值的组合,这就是WS-I为什么只允许Document只能包含一个根元素的原因。如果使用bare方式的document。那么就将多个参数包装成一个对象。wrappedwrapped也是document方式的一种,同时它是jaxws的默认方式,它允许服务端编程的时候有多个参数,实际上,它是对方法名和参数进行wrapped封装,产生一个新对象,该对象的名称正好和方法名一致。这个封装过程是通过wsgen工具实现的。注意wrapped一
16、定要用wsgen工具生成SEI,否则无法启动服务。wsgen cp . s . com.xujun.service.StudentManager这样就为StudentManager生成带source源码的SEI。然后还是运行Main类。PS:RPC和bare如果有Exception或者自定义的Exception,那么也是要用wsgen生成SEI的。命令工具wsgen wsgen 是在JDK的bin目录下的一个exe文件(Windows版),该命令的主要功能是用来生成合适的JAX-WS。它读取Web Service的终端类文件,同时生成所有用于发布Web Service所依赖的源代码文件和经过编
17、译过的二进制类文件。这里要特别说明的是,通常在Web Service Bean中用到的异常类会另外生成一个描述Bean,如果Web Service Bean中的方法有申明抛出异常,这一步是必需的,否则服务器无法绑定该对像。此外,wsgen 还能辅助生成WSDL和相关的xsd文件。wsgen 从资源文件生成一个完整的操作列表并验证web service是否合法,可以完整发布。 命令参数说明:u -cp 定义classpath u -r 生成 bean的wsdl文件的存放目录 u -s 生成发布Web Service的源代码文件的存放目录(如果方法有抛出异常,则会生成该异常的描述类源文件) u -
18、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的客户端实现。 命令参数说明:u -d 生成客户端执行类的class文件的存放目录 u -s 生成客户端执行类的源文件的存放目录 u -p 定义生成类的包名 命令范例: wsimport -d ./bin -s ./src -p org.jsoso.jws.client.ref http:/localhost:8080/hello?wsdl