网路冷眼@BlogJava

熙熙攘攘一闲人 以冷静的眼光观察技术
posts - 88, comments - 193, trackbacks - 0, articles - 28
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

版本历史:
2006.12.17 发布
2006.12.18 更正不加标准输入流读取字符,程序将立即退出,将不能提供服务。将程序列表的行号去掉,方便代码粘贴。


在前一篇文章中,讲述了Java SE 6.0新特征的概观。本文将介绍Web服务。


当然,在进行本文之前,请首先下载Java SE 6.0,详情请浏览野马奔腾而出,Java SE 6 正式版发布

Java Web 涉及到的JSR有 105,173,181,222,224,250。

由于Web服务日趋流行,利用Web服务的功能性的API特征正从最新的Java EE版本中向Java SE 6平台迁移。换言之,针对Web服务不需另外加入额外的工具,在Java EE和Java SE平台拥有相同的API。野马将大把不同的Web服务相关的API加到标准的工具柜中:以JSR 181针对Java 平台的Web服务元数据,通过JSR 224的基于XML 的Web服务Java API(JAX-WS);针对Java的带有附件的SOAP API(SAAJ)作为JSR 67

与三个Web服务API相关的包新增到Java SE 6.0里JAX-WS API 放置到javax.xml.ws包; SAAJ类在javax.xml.soap 包; Web服务的元数据类放置在javax.jws包里。

javax.jws

JSR 181 及其针对Java 平台Web服务元数据的规范提供一个在类中利用标注设计和开发Web服务的机制。标注从J2SE 5.0引入,在Java SE 6.0得到了进一步扩展。在第10章将会完整描述。但是,标注基本上允许将@tag加入到类,方法和特性来描述相关的元数据。一个解析器然后能定位标记并采取适当的行动;尽管行动什么时候发生完全依赖于标记自身。

JAX-WS 2.0 很容易使用. 本文将介绍如何使用Java SE 6。以JAX-WS如何建立一个简单的Web服务。首先建立一个建立一个将要作为Web服务发布的类,如表1所示:

Java 代码 列表1

package  hello;

public   class  CircleFunctions  {

   
public   double  getArea( double  radius)  {
       
return  java.lang.Math.PI  *  (r  *  r);
    }


   
public   double  getCircumference( double  radius)  {
       
return   2   *  java.lang.Math.PI  *  r;
   }

}


为了输出这些方法,必需做两件事情:引入javax.jws.WebService  包;在类的前面增加@WebService  标注以告诉Java编译器将发布此类为Web服务。下面的代码显示了这种变化(以黑体显示增加的代码)。

Java 代码 列表2
package hello;

import javax.jws.WebService;

@WebService

public class CircleFunctions {
   
public double getArea(double r) {
       
return java.lang.Math.PI * (r * r);
    }


   
public double getCircumference(double r) {
        
return 2 * java.lang.Math.PI * r;
    }


}



在此,有两个基本的标注@WebService@WebMethod。@WebService标注指明HelloService 类作为Web服务。如果没有制定,标注的名称就是类的名称。也能制定命名空间,服务名,WSDL 位置和endpoint 接口等。在指定的上下文环境中,可以使用javax.xml.ws.Endpoint类publish()静态方法发布上面的类作为Web服务代码见列表3:

Java 代码 列表3

import javax.xml.ws.Endpoint;

public static void main(String[] args) {

      Endpoint.publish(
         
"http://localhost:8080/WebServiceExample/circlefunctions",
         
new CircleFunctions());
        
try {
            System.in.read();
        }
 catch (IOException ex) {
            ex.printStackTrace();
        }

}



现在,用javac编译源代码。但是源文件能做什么呢?通过对源文件运行 javac编译器进行编译只是产生了class文件。并没有产生特殊的东西。但是在编译类之后,也需要运行wsgen 命令行工具(wsgen 是Web service generator的缩写)。编译源代码后还必需完成更多的步骤:像下面一样调用wsgen工具。

>  wsgen –cp . hello.CircleFunctions

Wsgen工具将在一个叫做wsgen子目录下产生大量的源代码,然后将这些源代码编译成class文件。尽管从未编辑这些文件,但是可以浏览这些文件。注意在使用Wsgen工具时,原始的源代码必需在相应的包里。否则将产生错误。

就这么简单。当运行应用程序时,Java SE 6平台拥有一个小的Web应用服务器,它将在地址为http://localhost:8080/WebServiceExample/circlefunctions 发布Web服务。通过显示CircleFunction的WSDL 来验证Web服务。当JVM仍然运行时,在浏览器输入:


如果在浏览器里看见大量描述Web服务的功能的XML代码,那么Web服务就成功发布了。

评论

# re: 感受野马(Mustang)性情,体会Java SE 6.0的新特性之二--Web服务  回复  更多评论   

2006-12-18 08:22 by 坏男孩
真的方便多了,不用webservice的框架也可以写webservices的程序真爽!

楼主辛苦了

# re: 感受野马(Mustang)性情,体会Java SE 6.0的新特性之二--Web服务  回复  更多评论   

2006-12-18 09:37 by 网路冷眼[匿名]
要不说是新特性哪!

# re: 感受野马(Mustang)性情,体会Java SE 6.0的新特性之二--Web服务  回复  更多评论   

2006-12-18 10:50 by 绯心
楼主,我照你的方法做了。wsgen –cp . hello.CircleFunctions之后也产生的大量的代码。但是http://localhost:8080/WebServiceExample/circlefunctions?WSDL却出不来,why?

# re: 感受野马(Mustang)性情,体会Java SE 6.0的新特性之二--Web服务  回复  更多评论   

2006-12-18 21:18 by 网路冷眼
@绯心
对不起,原来未加标准输入流输入等待字符输入,程序执行完后立即退出。文章已更正。谢谢提出问题。

# re: 感受野马(Mustang)性情,体会Java SE 6.0的新特性之二--Web服务  回复  更多评论   

2006-12-19 21:25 by 网路冷眼
@坏男孩
谢谢!其实还是有框架的,只不过Java SE 6.0里带了个小的Web服务器,就不需要笨重的Web Service的容器。有道是“简约不简单,杀鸡焉用牛刀!”

# re: 感受野马(Mustang)性情,体会Java SE 6.0的新特性之二--Web服务  回复  更多评论   

2006-12-25 22:10 by ws
楼主,我的程序如下:
package hello;


import java.io.IOException;

import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.xml.ws.Endpoint;

@WebService
public class CircleFunctions {
@WebMethod
public double getArea(double r){
return java.lang.Math.PI*(r*r);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Endpoint.publish("http://localhost:8080/WebServiceExample/circlefunctions", new CircleFunctions());
try{
System.in.read();
}catch(IOException ex){
ex.printStackTrace();
}
}
}


wsgen –cp . hello.CircleFunctions之后也产生的大量的代码。但是http://localhost:8080/WebServiceExample/circlefunctions?WSDL却出不来,why?
谢谢。

# re: 感受野马(Mustang)性情,体会Java SE 6.0的新特性之二--Web服务  回复  更多评论   

2006-12-25 22:18 by 网路冷眼@BlogJava
然后要执行:
>java hello.CircleFunctions
由于有标准输入流等待输入,程序不会退出。在后台WS 会一直提供服务。然后在浏览器里面在输入相应的地址就OK!

# re: 感受野马(Mustang)性情,体会Java SE 6.0的新特性之二--Web服务  回复  更多评论   

2007-01-03 11:50 by 交口称赞
客户端的写法
请看偶的主页
http://www.blogjava.net/vip01/

只有注册用户登录后才能发表评论。


网站导航: