在Java项目中发布第一个WS服务:
那么如何才可以发布一个WebService呢?
在JDK1.6中JAX-WS规范定义了如何发布一个webService服务。
JAX-WS是指Java Api for XML – WebService.
JAX(JavaApifor Xml)-WS规范是一组XMLweb services的JAVAAPI。JAX-WS允许开发者可以选择RPC-oriented或
者message-oriented来实现自己的webservices。
在 JAX-WS中,一个远程调用可以转换为一个基于XML的协议例如SOAP。在使用JAX-WS过程中,开发者不需
要编写任何生成和处理SOAP消息的代码。JAX-WS的运行时实现会将这些API的调用转换成为对应的SOAP消息。
在服务器端,用户只需要通过Java语言定义远程调用所需要实现的接口SEI(serviceendpoint interface),并提供相
关的实现,通过调用JAX-WS的服务发布接口就可以将其发布为WebService接口。
在客户端,用户可以通过JAX-WS的API创建一个代理(用本地对象来替代远程的服务)来实现对于远程服务器端
的调用。
当然 JAX-WS也提供了一组针对底层消息进行操作的API调用,你可以通过Dispatch直接使用SOAP消息或XML消
息发送请求或者使用Provider处理SOAP或XML消息。
通过webservice所提供的互操作环境,我们可以用JAX-WS轻松实现JAVA平台与其他编程环境(.net等)的互操
作。
JAX-WS与JAX-RPC之间的关系
Sun最开始的webservices的实现是JAX-RPC1.1 (JSR 101)。这个实现是基于Java的RPC,并不完全支持schema规范,
同时没有对Binding和Parsing定义标准的实现。
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服务:
在给定地址处针对指定的实现者对象创建并发布端点。
/**
* 发布第一个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:
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生成本地调用代码:
示例:
C:/> wsimport –s . http://192.168.0.100/one?wsdl
注意:-s不能分开,-s后面有个小点,用于指定源代码生成的目录。点即当前目录。
如果使用了-s参数则会在目录下生成两份代码,一份为.class代码。一份为.java代码。
.class代码,可以经过打包以后使用。.java代码可以直接Copy到我们的项目中运行。
或直接将别人已安装好的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 ");
}
}