Web-Service-第一个例子

在Java项目中发布第一个WS服务:

那么如何才可以发布一个WebService呢?

  在JDK1.6中JAX-WS规范定义了如何发布一个webService服务。

    JAX-WS是指Java Api for XML – WebService.

1. Jdk1.6.0_21以后的版本发布一个WebService服务.
2.与Web服务相关的类,都位于javax.jws.*包中。
1.主要类有:
1. @ WebService - 它是一个注解,用在类上指定将此类发布成一个 ws .
2. Endpoint – 此类为端点服务类,它的方法 publish 用于将一个已经添加了 @ WebService 注解对象绑定到一个地址的端口上。


JAX(JavaApifor Xml)-WS规范是一组XMLweb servicesJAVAAPIJAX-WS允许开发者可以选择RPC-oriented


message-oriented来实现自己的webservices


  在 JAX-WS中,一个远程调用可以转换为一个基于XML的协议例如SOAP。在使用JAX-WS过程中,开发者不需


要编写任何生成和处理SOAP消息的代码。JAX-WS的运行时实现会将这些API的调用转换成为对应的SOAP消息。


  在服务器端,用户只需要通过Java语言定义远程调用所需要实现的接口SEIserviceendpoint interface),并提供相


关的实现,通过调用JAX-WS的服务发布接口就可以将其发布为WebService接口


  在客户端,用户可以通过JAX-WSAPI创建一个代理(用本地对象来替代远程的服务)来实现对于远程服务器端

的调用。


  当然 JAX-WS也提供了一组针对底层消息进行操作的API调用,你可以通过Dispatch直接使用SOAP消息或XML


息发送请求或者使用Provider处理SOAPXML消息。


  通过webservice所提供的互操作环境,我们可以用JAX-WS轻松实现JAVA平台与其他编程环境(.net等)的互操


作。

  JAX-WSJAX-RPC之间的关系


  Sun最开始的webservices的实现是JAX-RPC1.1 (JSR 101)。这个实现是基于JavaRPC,并不完全支持schema规范,


同时没有对BindingParsing定义标准的实现。



  JAX-WS2.0(JSR 224)Sun新的webservices协议栈,是一个完全基于标准的实现。在binding层,使用的是theJava


 Architecture for XML Binding (JAXB, JSR 222),在parsing层,使用的是theStreaming API for XML (StAX,JSR 173),同


时它还完全支持schema规范。

1:需要注意的是,jdk1.6._07以后jdk版本发布WebService时必须要完整的对代码进行注解,如果使用的是jdk1.6.0_21以后


版本,因为它已经内含了ws2.1所以,可以只对类添加@WebService的注解.


以下是两段不同的代码:


jdk1.6.0_13的版本上发布的ws:




import javax.jws.WebMethod;


import javax.jws.WebService;


import javax.jws.soap.SOAPBinding;


import javax.jws.soap.SOAPBinding.Style;


import javax.xml.ws.Endpoint;


@WebService(targetNamespace="http://loalhost:9999/helloworld")


@SOAPBinding(style=Style.RPC)//只支持RPC的消息风格


public class HelloWorld{


//以下通过@WebMethod注解,对外公开方法


@WebMethod

publicString sayHello(){


return"HelloWorld";


}

public static voidmain(String[] args){


Endpoint.publish("http://localhost:9999/helloworld",new HelloWorld());


}

}

2:以下是在jdk1.6.0_24上发布的WebService代码:



import javax.jws.WebService;


import javax.xml.ws.Endpoint;


@WebService//注意只有此一个注解,此注解也是必须的,默认的SOAP消息风格为:DOCUMENT


public class HelloWorld{

publicString sayHello(){


return"HelloWorld";


}

public static voidmain(String[] args){


Endpoint.publish("http://localhost:9999/helloworld",new HelloWorld());


}

}

如何发布一个web服务:

1、在类上添加@WebService注解。
这是jdk1.6提供的一个注解。它位于:javax.jws.*包中。
2、通过EndPoint(端点服务)发布一个webService。
Endpoint也是jdk提供的一个专门用于发布服务的类,它的publish方法接收两个参数,一个是本地的服务地址,二是提供服务的类。它位于javax.xml.ws.*包中。
static Endpoint.publish(String address,Object implementor)
          在给定地址处针对指定的实现者对象创建并发布端点。
stop方法用于停止服务。
EndPoint发布完成服务以后,将会独立的线程运行。所以,publish之后的代码,可以正常执行。
其他注意事项:
给类添加上@WebService注解后,类中所有的非静态方法都将会对外公布。
不支持静态方法,final方法。-
如果希望某个方法(static,final)不对外公开,可以在方法上添加@WebMethod(exclude=true),阻止对外公开。
如果一个类上,被添加了@WebService注解,则必须此类至少有一个可以公开的方法,否则将会启动失败。


/**
 * 发布第一个web服务
 * @author 
 */
@WebService
public class OneService{
	//以下方法由于是final的,所以不会对外公开
	public final String sayHi(String name){
		return name+",你好,现在时间是:"+new Date();
	}
	//通过exclude=true,设置在发布时不包含此方法
	@WebMethod(exclude=true)
	public String sayHi1(String name){
		return name+",你好,现在时间是:"+new Date();
	}
	public String sayHi2(String name){
		return name+",你好,现在时间是:"+new Date();
	}
	public static void main(String[] args)  throws Exception{
		//发布服务
		Endpoint end = Endpoint.publish("http://127.0.0.1:9999/one",new OneService());
		System.out.println(“服务发布成功”);
                  Thread.sleep(2000);
                  end.stop();
	}
}

第一个WebService服务




/**
 * 
 * 
 * @author 姜沂
 * 
 *         WebService 将 Java 类标记为实现 Web Service,或者将 Java 接口标记为定义 Web Service 接口
 * 
 */
@WebService
public class HelloService {
	public static void main(String[] args) {
		/**
		 * 静态的和final的方法 不能被发布 参数1:服务的发布地址 参数2:服务的实现者
		 */
		Endpoint.publish("http://127.0.0.1:9999/hello", new HelloService());
		System.out.println("Server ready...");
	}

	public String sayHello(String name) {
		System.err.println("----------------");
		return "hello" + name;
	}
	@WebMethod(exclude=true)//不暴露
	public String sayHello2(String name) {
		return "hello " + name;
	}
}

服务发布成功了,如何调用呢?请看说明书-WSDL:

在地址栏输入(注意后面的参数?wsdl)
http://127.0.0.1:9999/hello?wsdl
目前不是访问webService,只是获取一个用于描述WebService的说明文件,即:wsdl文件.
wsdl- WebService Description Language,是以XML文件形式来描述WebService的”说明书”,有了说明书,我们才可以知道如何使用或是调用这个服务.


1:MyEclipse中新建立一个项目.在此项目中,将调用另一个项目中发布的WebService

2:步骤如下:

  1:首先要根据http://127.0.0.1:9999/hello?wsdl获取WebService的使用说明书.

         2:Jdk的当前版本下,Jdk1.6.0_24,通过wsimport这个工具来生成远程调用的源代码.(建议生成扩展名为.java的文件)

         3:在本项目中,通过调用生成代码的形式调用远程服务.成功返回helloWorld.


使用wsimport生成本地调用代码:

说明书看不懂怎么办?别急JDK能看懂:
wsimport是jdk自带的,可以根据wsdl文档生成客户端调用代码的工具.当然,无论服务器端的WebService是用什么语言写的,都将在客户端生成Java代码.服务器端用什么写的并不重要.
wsimport.exe位于JAVA_HOME\bin目录下.
常用参数为:
-d<目录> - 将生成.class文件。默认参数。
-s<目录> - 将生成.java文件。
-p<生成的新包名> -将生成的类,放于指定的包下。
(wsdlurl) - http://server:port/service?wsdl,必须的参数。

示例:

C:/> wsimport –s . http://192.168.0.100/one?wsdl

注意:-s不能分开,-s后面有个小点,用于指定源代码生成的目录。点即当前目录。

如果使用了-s参数则会在目录下生成两份代码,一份为.class代码。一份为.java代码。

.class代码,可以经过打包以后使用。.java代码可以直接Copy到我们的项目中运行。


1:可以通过java –version检查你当前的版本号.如果版本太低可以安装高版本的jdk.
或直接将别人已安装好的jdk目录拷贝到你的机器如D:\jdk1.6.0_24目录下.
因为以前的环境变量已经设置成以前老版本的jdk目录,即JAVA_HOME和PATH两个环境变量.
可以再重新设置一下环境变量为:JAVA_HOME=D:\jdk1.6.0_24,path=%JAVA_HOME%\bin,
重新设置了环境变量后,要重新打开一个doc(命令行)窗口.才生效.

如果不想修改原来已经配置好的环境变量,可以命令行窗口输入以下命令,使jdk1.6.0_24生效:
set path = D:\jdk1.6.0_24\bin;%PATH%(回车即可)
再通过java –version查看jdk的版本号是否已经发生变化.

2:转到一个相对干净的目录下,我在d盘上新建立一个目录名为:ws,并转到此目录下.
3:开启你的webService.
4:输入以下命令:
wsimport –s . http://127.0.0.1:9999/helloworld?wsdl
参数说明:-s是指编译出源代码文件,后面的.(点)指將代碼放到當前目錄下.
最后面的http….是指获取wsdl说明书的地址.
5:此时,将生成.java文件和.class文件.(都包含原始包名).将代码Copy到你的项目中.(只拷贝java文件)
6:在新的项目中,新一个类,(可位于任意包下),对上面生成的代码进行调用,见下一页ppt.


7:wsimport其他参数说明,我们经常使用的参数为-d,-s,-p
-d<目录>将会生成.class文件.
示例:wsimport –d . http://127.0.0.1:9999/helloworld?wsdl
-s<目录>将会生成.java文件.
示例:wsimport –s . http://127.0.0.1:9999/helloworld?wsdl
-p<包名>将生成的文件(.java或是.class修改成指定的包名)
示例:wsimport -s . -p com.beijing.itcast http://127.0.0.1:9999/helloworld?wsdl
对于-p参数,注意包名的修改,它将所生成类,全部置于通过-p指定的包下.(演示)
需要说明的是,当仅使用-p参数时,它也将同时使用-d即编译成.class文件. –d参数写或不写,它都在那里,不离不弃.


RunMain.java的源代码如下:

/**
 * 通过wsimport -s . http://127.0.0.1:8888/hello?wsdl  命令生成代码 调用服务
 * @author 姜沂
 *
 */
public class App {
	public static void main(String[] args) {
		/*
		 * WSDL<service name="HelloServiceService">
		 */
		HelloServiceService hss=new HelloServiceService();
		/**
		 * WSDL <port name="HelloServicePort" binding="tns:HelloServicePortBinding">
		 */
		HelloService hs=hss.getHelloServicePort();
		hs.sayHello("hello ");
	}
}



执行客户端代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值