如何在Java中快速发布WebService服务
1,在Java项目中发布一个WebService服务:
如何发布?
——JDK16中JAX-WS规范定义了如何发布一个WebService服务;
(1)用jdk160_21以后的版本发布;
(2)与Web服务相关的类,都位于Javaxjws包中
@WebService——此注解用在类上指定将此类发布成一个WebService;
EndPoint——此类为端点服务类,其中publish()方法用于将一个已经添加了@WebService注解对象绑定到一个地址的端口上,用于发布。
2,例子:
(1)发布WebService服务
HelloWebServicejava:
[java] view plain copy
<span style="font-family:KaiTi_GB2312;font-size:18px;">package cntgbws;
importjavaxjwsWebMethod;
importjavaxjwsWebService;
importjavaxxmlwsEndpoint;
/
@WebService - 它是一个注解,用在类上指定将此类发布成一个ws
Endpoint – 此类为端点服务类,它的方法publish用于将一个已经添加了@WebService注解对象绑定到一个地址的端口上。
@author xuemin
/
@WebService
public classHelloWebService {
publicString HelloWord(String name){
return"Hello: "+name;
}
/
添加exclude=true后,HelloWord2()方法不会被发布
@param name
@return
/
@WebMethod(exclude=true)
publicString HelloWord2(String name){
return"Hello: "+name;
}
publicstatic void main(String[] args) {
/
参数1:服务的发布地址
参数2:服务的实现者
/
Endpointpublish("http://19216824138:456/helloWord",new HelloWebService());
}
}</span>
注:
@WebService- 它是一个注解,用在类上指定将此类发布成一个ws
Endpoint –此类为端点服务类,它的方法publish用于将一个已经添加了@WebService注解对象绑定到一个地址的端口上。
运行以上程序进行发布。
(2)查看wsdl
地址:http://19216824138:456/helloWordwsdl
只要在客户端浏览器能看到此WSDL文档,说明服务发布成功
以上服务发布成功;
总结:
如何发布一个Web服务:
a,在类上添加@WebService注解
(注:此注解是jdk16提供的,位于javaxjwsWebService包中)
b,通过EndPoint(端点服务)发布一个WebService
(注:EndPoint是jdk提供的一个专门用于发布服务的类,该类的publish方法接收两个参数,一个是本地的服务地址,二是提供服务的类。位于 javaxxmlwsEndpoint包中)
c,注:
类上添加注解@WebService,类中所有非静态方法都会被发布;
静态方法和final方法不能被发布;
方法上加@WebMentod(exclude=true)后,此方法不被发布;
(3)客户端访问发布的服务
根据WSDL文档来在客户端编写代码,访问发布的服务;
但是,WSDL文档看不懂怎么办?代码该如何编写?
——你看不懂,JDK看得懂,wsimport是JDK自带的,可以根据WSDL文档生成客户端调用代码的工具。无论服务器端WebService使用什么语言编写的,豆浆在客户端生成Java代码。所以服务器用什么语言编写的并不重要。
wsimportexe命令参数熟知:
-d:生成class文件。默认参数。
-s:生成Java文件
-p:自定义包结构
解析地址生成源码到E盘:
执行以上命令后,即可在E盘下生成如下包及类
注:还可以自定义包结构:
自定义包结构的命令:
将生成的包及java文件复制到客户端:如下图
创建访问服务的类:MyClientjava:
MyClientjava:
[java] view plain copy<span style="font-family:KaiTi_GB2312;font-size:18px;">package cntgbws;
public classMyClient {
publicstatic void main(String[] args) {
HelloWebServiceServicehwss = new HelloWebServiceService();
HelloWebServicehws = hwssgetHelloWebServicePort();
Stringresult=hwshelloWord("hanxuemin");
Systemoutprintln(result);
}
}</span>
(4)运行结果:
web service介绍
WebService是一种跨编程语言和跨操作系统平台的远程调用技术。
跨编程语言和跨操作平台定义
就是说服务端程序采用java编写,客户端程序则可以采用其他编程语言编写,反之亦然。
跨操作系统平台则是指服务端程序和客户端程序可以在不同的操作系统上运行。
远程调用理解
就是一台计算机a上的一个程序可以调用到另外一台计算机b上的一个对象的方法。
理解WebService的作用
从表面上看,WebService就是一个应用程序向外界暴露出一个能通过Web进行调用的API,也就是说能用编程的方法通过Web来调用这个应用程序。
把调用这个WebService的应用程序叫做客户端,而把提供这个WebService的应用程序叫做服务端。
WebService是建立可互操作的分布式应用程序的新平台,是一个平台,是一套标准。
定义了应用程序如何在Web上实现互操作性,可以用任何的语言,在任何的平台上写Web service ,只可以通过Web service标准对这些服务进行查询和访问。
web service开发创建
需要一套协议来实现分布式应用程序的创建。
任何平台都有它的数据表示方法和类型系统。要实现互操作性,WebService平台必须提供一套标准的类型系统,用于沟通不同平台、编程语言和组件模型中的不同类型系统。
必须提供一种标准来描述Web service,让客户可以得到足够的信息来调用这个Web service。
必须有一种方法来对这个Web service进行远程调用,这种方法实际是一种远程过程调用协议(RPC)。为了达到互操作性,这种RPC协议还必须与平台和编程语言无关。
WebService平台技术
XML+XSD,SOAP和WSDL就是构成WebService平台的三大技术。
2在 PortType 类 域中,指定了这个特定服务的类中包含的可用操作(方法和函数)。通俗的说它就是 Web 服务代码中带有用户可访问的 public 方法的类。如果在没有设置这个域之前试图保存 Web 服务,那么 Domino Designer 7 客户机将产生一个警告。
2安全性标签
21使用调试信息编译java代码的选项,使在控制台上查看哪一行代码产生了运行时错误成为可能。为web服务创建简要表 选项允许为概要分析收集运行时的统计信息。
22 允许公共访问用户使用此web服务:该选项使得仅拥有数据库 ACL 中 “Read Public Documents” 访问权的用户可以使用该 Web 服务,当不想为大量用户授予完全的 Reader 访问权限(或更高级别)时,这点很有用。
3高级标签
31可以在两个编程模型选项中进行选择:RPC 和 消息。RPC 支持常规方法参数和返回类型;消息限制方法接口为一个 “消息” 参数和返回类型(有关更多信息,请参阅联机文档)。对于 RPC 编程模型,RPC/编码 SOAP 消息格式是默认的,但是如果有使用其他格式的特殊要求,那么可以修改它。对于 消息 编程模型,SOAP 消息格式是在 Doc/literal 中固定的。(大多数情况下使用 RPC)。
32 端口类型名称、服务元素名称 和 服务端口名称 域是在您保存 Web 服务时自动填充。在端口类型名称域中,指定访问服务的端口类型名称。这个指定对应于 WSDL 文档中 <wsdl:portType> 的 name 属性。对于每个服务,Lotus Domino 7 识别一个端口类型。在服务元素名称域中,指定服务的名称。默认情况下,该字段值是 PortType 名称加上单词 Service(尽管您可以使用任何想用的名称)。这个指定对应于 WSDL 文档中 <wsdl:service> 的 name 属性。在服务端口名称域中,指定访问服务的端口。默认情况下,该字段值是 Domino(尽管您可以使用任何想用的名称)。这个指定对应于 WSDL 文档中 <wsdl:service> 下面 <wsdl:port> 的 name 属性。对于每个服务,Lotus Domino 7 识别一个端口。
4注意:解释 LotusScript 的 Web 服务引擎把所有公开的函数和变量名更改为大写字母。例如,当 Lotus Domino 7 自动生成 WSDL 时, GetEmailAddress 更改为 GETEMAILADDRESS。当您为这样一个 Web 服务创建消费客户机时,知道这一更改是重要的。不过java写的web service不会转为大写的。还是java的好,都是大写的看着不舒服。
5举例说明,我们新建一个WebService设计元素并按上面设置,代码如下:
public class DbInfo
{
public String dbName;
public String dbSO;
}
import lotusdomino;
import lotusdominotypes;
public class DbInfoManager
{
public DbInfo[] getAllDbInfo()
{
DbInfo[] di = new DbInfo[2];
try
{……… }
catch(Exception e)
{
eprintStackTrace();
}
return di;
}
}
然后在Vs2005中添加web Service的wsdl描述,就可以使用该web Service提供的类和方法了,很简单吧。
1、web service分客户端和服务端。
2、新建服务端:在这里我教你用MyEclipse自带的工具生成web service服务端。
(1) 新建一个类,写些方法实现自己想要的功能,就一半的java 类。
(2)在这个项目上鼠标右键新建一个web service
继续下一步,但是下面的Strategy选择下面那个
选择你刚写的类,下面红色框的复选框选中,最后finish,服务端就建好了。
3、新建客户端
(1) 因为刚刚生成了Web Service的服务端,所以会生成对应的一些配置文件,在WEB-INF下,看下我的那个对比下,拉到最下,找到那个location,复制那个url地址
(2) 新建一个新的Web项目,新建一个包,等会用来放客户端代码。然后鼠标项目上鼠标右键new,选择下面那个Web Service Client
(3) 下一步,最后finily
4、调用web service接口
JobServerDelegate jsd = new JobServerService()getJobServerPort();
new一个web service接口对象,JobServerDelegate 换成你刚生成的对应的那个,结尾都一样的那个类。JobServerService这个也是一样的,换成你的,最后都要调用一个getPort()方法。
5、最后jsd这个对象就可以调用Web Service这个接口的方法了。记住,调用的时候,两个项目都要启动。
Web Service是基于网络的、分布式的模块化组件,它执行特定的任务,遵守具体的技术规范,这些规范使得Web Service能与其他兼容的组件进行互操作。Internet Inter-Orb Protocol(IIOP)都已经发布了很长时间了,但是这些模型都依赖于特殊对象模型协议,而 Web Services 利用 SOAP 和 XML对这些模型在通讯方面作了进一步的扩展以消除特殊对象模型的障碍。Web Services 主要利用 HTTP 和 SOAP 协议使业务数据在 Web 上传输,SOAP通过 HTTP 调用业务对象执行远程功能调用,Web 用户能够使用 SOAP 和 HTTP通过 Web 调用的方法来调用远程对象的。
实现方式:
第一种:xfire
Client client = new Client(new URL(url));
Object[] results = clientinvoke(operationName, new Object[]{ifuser,ifevent,input});
ret = (String)results[0] ;
第二种:axis
Service service = new Service();
Call call = (Call)servicecreateCall();
callsetTargetEndpointAddress(new javanetURL(url));// 设置webservice服务的url地址
callsetOperationName( operationName);// 调用的后台webservice服务的方法为exchange
ret = (String)callinvoke(new Object[] {input});// 调用后台webservice服务
以上两种实现方式,在项目中已经使用了,运行正常。但是项目初期开始用的还是碰到一些问题,如果服务器端是java开发的,用axis掉用服务端的时候,没有问题。如果服务器端是net开发的,会碰到莫名奇妙的问题,我估计net服务器端参数配置修改一下应该可以调得通,由于时间紧张,我就没有深究了。换了xfire掉服务器端,结果是两种不同语言实现的系统,都可以调通了。
0条评论