- 浏览: 285665 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
jim8757:
能提供下完整的代码吗?
实例解析java + jQuery + json工作过程(登录) -
befairy:
收藏,谢谢LZ
基于Java、jQuery应用的账务管理系统开源了(09.3.19更新) -
Gilbert_Sam:
我看过这本书,很好,看到二十几章的地方,结果网站就登陆不上,写 ...
Linux C编程一站式学习 http://learn.akae.cn/ -
ljy520zhiyong:
这个网址进入不了呀
Linux C编程一站式学习 http://learn.akae.cn/ -
蜀山红日:
如果后台要向前台返回复杂数据该怎么办呢
实例解析java + jQuery + json工作过程(登录)
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类代码
- package org.jsoso.jws.server;
- import java.util.ArrayList;
- import javax.jws.WebMethod;
- import javax.jws.WebParam;
- import javax.jws.WebResult;
- import javax.jws.WebService;
- import javax.jws.WebParam.Mode;
- import javax.jws.soap.SOAPBinding;
- /
- * 提供WebService服务的类
- */
- @WebService(name="Example", targetNamespace="http://www.jsoso.com/wstest", serviceName="Example")
- @SOAPBinding(style=SOAPBinding.Style.RPC)
- public class Example {
- private ArrayList<Person> persons = new ArrayList<Person>();;
- /**
- *
- * 返回一个字符串
- * @param userName
- * @return
- */
- @WebMethod(operationName="toSayHello",action="sayHello",exclude=false)
- @WebResult(name="returnWord")//自定义该方法返回值在WSDL中相关的描述
- public String sayHello(@WebParam(name="userName")String userName) {
- return "Hello:" + userName;
- }
- /**
- * web services 方法的返回值与参数的类型不能为接口
- * @param person
- * @return
- * @throws HelloException
- */
- @WebMethod(operationName="sayHello", action="sayHello")
- @WebResult(partName="personList")
- public Person[] sayHello(@WebParam(partName="person", mode=Mode.IN)Person person,
- String userName) throws HelloException {
- if (person == null || person.getName() == null) {
- throw new HelloException("说hello出错,对像为空。。");
- }
- System.out.println(person.getName() + " 对 " + userName + " 说:Hello,我今年" + person.getAge() + "岁");
- persons.add(person);
- return persons.toArray(new Person[0]);
- }
- }
package org.jsoso.jws.server; import java.util.ArrayList; import javax.jws.WebMethod; import javax.jws.WebParam; import javax.jws.WebResult; import javax.jws.WebService; import javax.jws.WebParam.Mode; import javax.jws.soap.SOAPBinding; / * 提供WebService服务的类 */ @WebService(name="Example", targetNamespace="http://www.jsoso.com/wstest", serviceName="Example") @SOAPBinding(style=SOAPBinding.Style.RPC) public class Example { private ArrayList<Person> persons = new ArrayList<Person>();; /** * * 返回一个字符串 * @param userName * @return */ @WebMethod(operationName="toSayHello",action="sayHello",exclude=false) @WebResult(name="returnWord")//自定义该方法返回值在WSDL中相关的描述 public String sayHello(@WebParam(name="userName")String userName) { return "Hello:" + userName; } /** * web services 方法的返回值与参数的类型不能为接口 * @param person * @return * @throws HelloException */ @WebMethod(operationName="sayHello", action="sayHello") @WebResult(partName="personList") public Person[] sayHello(@WebParam(partName="person", mode=Mode.IN)Person person, String userName) throws HelloException { if (person == null || person.getName() == null) { throw new HelloException("说hello出错,对像为空。。"); } System.out.println(person.getName() + " 对 " + userName + " 说:Hello,我今年" + person.getAge() + "岁"); persons.add(person); return persons.toArray(new Person[0]); } }
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 服务:
- package org.jsoso.jws.server;
- import java.util.LinkedList;
- import java.util.List;
- import javax.xml.ws.Binding;
- import javax.xml.ws.Endpoint;
- import javax.xml.ws.handler.Handler;
- /**
- * @author zsy 启动web services服务
- */
- public class StartServer {
- /**
- * @param args
- */
- public static void main(String[] args) {
- /*
- * 生成Example 服务实例
- */
- Example serverBean = new Example();
- /*
- * 发布Web Service到http://localhost:8080/hello地址
- */
- Endpoint endpoint =
- Endpoint.publish("http://localhost:8080/hello", serverBean);
- Binding binding = endpoint.getBinding();
- /*
- * 设置一个SOAP协议处理栈
- * 这里就简单得打印SOAP的消息文本
- */
- List<Handler> handlerChain = new LinkedList<Handler>();
- handlerChain.add(new TraceHandler());
- binding.setHandlerChain(handlerChain);
- System.out.println("服务已启动 http://localhost:8080/hello");
- }
- }
package org.jsoso.jws.server; import java.util.LinkedList; import java.util.List; import javax.xml.ws.Binding; import javax.xml.ws.Endpoint; import javax.xml.ws.handler.Handler; /** * @author zsy 启动web services服务 */ public class StartServer { /** * @param args */ public static void main(String[] args) { /* * 生成Example 服务实例 */ Example serverBean = new Example(); /* * 发布Web Service到http://localhost:8080/hello地址 */ Endpoint endpoint = Endpoint.publish("http://localhost:8080/hello", serverBean); Binding binding = endpoint.getBinding(); /* * 设置一个SOAP协议处理栈 * 这里就简单得打印SOAP的消息文本 */ List<Handler> handlerChain = new LinkedList<Handler>(); handlerChain.add(new TraceHandler()); binding.setHandlerChain(handlerChain); System.out.println("服务已启动 http://localhost:8080/hello"); } }
在控制台运行这个类,就可以使用URL :http://localhost:8080/hello?wsdl 浏览到上文所描述的WSDL的全文了。这说明您的第一个Web Service应用发布成功!
构建Web Service客户端
使用JavaSE6.0构建Web Service的客户端是一件相当简单的事。这里我们要使用到JDK中的另一个命令行工具wsimport。在控制台下输入以下命令:
即可在包org.jsoso.jws.client.ref中生成客户端的存根及框架文件。其中我们要使用的类只有两个:服务类Example_Service和本地接口Example。编写如下客户端,即可调用Web Service服务:
- package org.jsoso.jws.client;
- import org.jsoso.jws.client.ref.*;
- public class RunClient {
- /**
- * @param args
- */
- public static void main(String[] args) {
- //初始化服务框架类
- Example_Service service = new Example_Service();
- //或者本地服务借口的实例
- Example server = (Example) service.getExamplePort();
- try {
- //调用web service的toSayHello方法
- System.out.println("输入toSayHello的返回值——" + server.toSayHello("阿土"));
- Person person = new Person();
- person.setName("阿土");
- person.setAge(25);
- //调用web service的sayHello方法
- server.sayHello(person, "机器人");
- person = new Person();
- person.setName("aten");
- person.setAge(30);
- //调用web service的sayHello方法
- PersonArray list = server.sayHello(person, "机器人");
- //输出返回值
- System.out.println("\n以下输入sayHello的返回值——");
- for (Person p : list.getItem()) {
- System.out.println(p.getName() + ":" + p.getAge());
- }
- } catch (HelloException_Exception e) {
- e.printStackTrace();
- }
- }
- }
package org.jsoso.jws.client; import org.jsoso.jws.client.ref.*; public class RunClient { /** * @param args */ public static void main(String[] args) { //初始化服务框架类 Example_Service service = new Example_Service(); //或者本地服务借口的实例 Example server = (Example) service.getExamplePort(); try { //调用web service的toSayHello方法 System.out.println("输入toSayHello的返回值——" + server.toSayHello("阿土")); Person person = new Person(); person.setName("阿土"); person.setAge(25); //调用web service的sayHello方法 server.sayHello(person, "机器人"); person = new Person(); person.setName("aten"); person.setAge(30); //调用web service的sayHello方法 PersonArray list = server.sayHello(person, "机器人"); //输出返回值 System.out.println("\n以下输入sayHello的返回值——"); for (Person p : list.getItem()) { System.out.println(p.getName() + ":" + p.getAge()); } } catch (HelloException_Exception e) { e.printStackTrace(); } } }
届此,本次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
发表评论
-
自定义js延时函数
2010-03-26 11:38 4547setTimeout不是真正意义上的延时函数,而且在表单提交后 ... -
ssh jar包配置
2009-11-27 11:31 2314本文中ssh指:struts2,srping2.5,hib ... -
每个项目中,你不得不知的11个Java第三方类库
2009-11-02 09:06 1119Java第三方library ecosystem是一个很广阔的 ... -
J2EE学习中一些值得研究的开源项目
2009-08-10 10:07 1175这篇文章写在我研究J2SE、J2EE近三年后。前3年 ... -
对JXL包的研究(java操作excel)
2009-06-25 07:44 1544对JXL包的研究(java操作excel) 在开源世界中,有两 ... -
java类中成员的装载顺序你知道吗
2009-04-03 08:18 1006最近去参加了SCJP培训,相信对于绝大多数的JAVA工作者来说 ... -
java操作word文件
2009-03-31 15:41 1731一个jacob操作Word的例子 import java. ... -
Java操作PDF文件(iText)
2009-03-31 15:32 5902然jacob中也有关于PDF的方法,但是过于复杂。iText是 ... -
java对excel操作
2009-03-31 15:11 1475从Excel文件读取数据表 Java Excel API既可 ... -
JAVA解析XML的四种方法
2009-03-31 08:49 1417XML现在已经成为一种通 ... -
Java:集合类性能分析
2009-03-20 20:41 19651.Java 集合框架图 -集合接口:6个接口(短虚 ... -
在看commons-lang.jar包源码时候的一些发现及实践
2009-03-11 10:55 3631通常,我们在完成一个标准的JavaBean的时候,都需要同时完 ... -
解决大批量数据导出Excel产生内存溢出的方案(二)
2009-03-11 10:42 6333客户要求一次导出20w行数据,这就要求导出的文件必须带shee ... -
解决大批量数据导出Excel产生内存溢出的方案
2009-03-11 10:41 5420POI或者JXL在导出大量数据的时候,由于它们将每一个单元格生 ... -
java语言的反射机制1
2009-03-11 10:23 1128java语言的反射机制为是java语言所提供的一项特别吸引人的 ... -
Java获取各种常用时间方法(二)
2009-03-11 09:43 1070//获得本年最后一天的日期 * ... -
Java获取各种常用时间方法
2009-03-11 09:40 1218本人之前做的项目中积累常用的时间方法,贴出来与大家共享,如果哪 ... -
JavaSE6.0 Web Service学习笔记(一)
2009-03-11 09:24 1441Web Service概述 Web Service ... -
JDK5.0 Annotation学习笔记(一)
2009-03-11 09:22 971背景知识: 从JDK5开始提供名为Annotat ... -
JasperReport报表设计总结(三)(已完毕)
2009-03-11 09:20 1400由于在一个里面不能贴太多的代码,故放置代码在此处。上接:htt ...
相关推荐
javaSE6.0基础知识集合 什麼是Java 最早是Sun公司Green Project中撰寫Star7 應用程式的一個程式語言 – James Gosling的窗外有顆橡樹(Oak) 全球資訊網興起,Java Applet成為網頁互 動技術的代表 1995/5/23,Java ...
Java SE 6.0 API是Java开发的重要参考资料,它包含了Java Standard Edition 6.0的所有公共类、接口和方法的详细文档。这个API文档是英文版的,为开发者提供了全面的指南,帮助他们理解和使用Java 6平台的核心库。...
采用CHM格式的JavaSE APi 汉化版全集。
Java SE 6.0 API(应用程序接口)是Java开发的关键组成部分,它包含了丰富的类库,为程序员提供了构建桌面、Web和服务端应用所需的各种工具和功能。API文档是开发者的重要参考资料,帮助他们理解和使用Java语言的...
javase6.0 api javadoc 文档以网页方式打开查看
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和javaee学习笔记, 下载绝对没错, 这是自己在学习的时候写的笔记包括javase和javaee
javaSE基础数据类型学习笔记
采用CHM格式的JavaSE APi 汉化版 全集。
总的来说,JavaSE6.0-API_CN是学习和开发Java应用的必备资料,它详尽地介绍了各个方面的API,无论是对于新手还是经验丰富的开发者,都能从中获益。通过阅读和查阅这个文档,开发者可以快速掌握JavaSE6.0的特性和功能...
这份“非常详细JavaSE学习笔记.rar”压缩包显然是一份全面的Java SE学习资源,包含了从基础知识到高级特性的全方位讲解。下面,我们将详细探讨这份笔记可能涵盖的关键知识点。 1. **Java起源与环境搭建**:笔记可能...
NULL 博文链接:https://ypf3027.iteye.com/blog/257798
java李兴华学习笔记之JAVASE基础部分.pdf
中文Java 6.0 API(JAVA_6.0_API.part2.rar),是学习、使用JAVA的必备资料 中文,java,api,6.0
这份"javase学习笔记(全)"涵盖了刘意版传智播客课程的主要内容,是学习Java编程语言的重要参考资料。以下将对Java SE的一些关键知识点进行详细解释: 1. **Java基础**:Java的基础语法包括数据类型(如整型、浮点型...