`
pharaohsprince
  • 浏览: 296828 次
  • 性别: Icon_minigender_1
  • 来自: 南京
文章分类
社区版块
存档分类
最新评论

webservice学习笔记——理解篇

阅读更多

 /*title: web service入门学习笔记(七)
**date: 2007/01/19
**author:laomai
**url: http://blog.csdn.net/laomai/
*/

七、命令行开发过程
   通过以上的学习,我们知道如何在ant脚本和ide环境中开发一个简单的webservice.
但是作为搞技术的人特别是搞c的人来看,上面的过程隐藏了太多的东西,
对我们有钻研精神的人,自然就想搞清楚脚本背后的过程。
假设我们的机器上没有ide环境和ant工具,
我们如何“手工”编译出自己的webservice呢?
这就是本节要讲述的内容--只用命令行工具开发webservice.

再次声明:

本部分主要参考了

http://blog.csdn.net/lin_bei/archive/2006/11/07/1371131.aspx

的内容,由于这位兄弟翻译的不是很通顺,我就按照自己的理解来改编成了
hellowrold的例子:-)。
其他部分为我原创,转载时请注明出处。

0、设置环境变量
 把jdk和javaee的路径如
 D:\Java\jdk1.6.0
 D:\Sun\SDK\bin加到系统的path变量中去

1、建立项目目录
 首先建立一个项目的目录,名为WebTest,项目目录下又包含三个子目录
  src\      本目录用于存放源代码,
  build\    本目录用于存放输出的文件
  deploy\   本目录用于对服务器打包
  
2、编写服务器类实现文件
  在项目的src目录下建立一个个子目录endpoint,
  在这个endpoint子目录下新建一个Hello.java文件,内容如下
 
 /*src\endpoint\Hello.java文件  
  提供webservice的服务器端实现类
 */
 package endpoint;
 
 import javax.jws.WebService;
 import javax.jws.WebMethod;
 
 @WebService
 public class Hello
 {
  @WebMethod
     public String getHello(String name)
     {
        return "Hello " + name + "!";
     }
  }
3、编译服务器类
 ①在build目录下建立一个子目录classes
   ②在命令行执行如下命令
    cd WebTest  ;进入项目目录
    javac -classpath d:/Sun/SDK/lib/javaee.jar -d ./build/classes src/endpoint/Hello.java  ;编译服务器类
   执行完后会产生一个build\classes\endpoint\Hello.class文件
 
4、生成wsdl文件
 ①在build目录下建立一个子目录generated
 ②生成wsdl文件,执行
  wsgen -cp ./build/classes -keep -d ./build/classes -r ./build/generated -wsdl  endpoint.Hello
 
 执行完成会在./build/generated产生两个文件
 HelloService.wsdl
 HelloService_schema1.xsd
 并且在\build\class\endpoint下建立一个jaxws目录,下面有4个文件
 GetHello.java                       
 GetHello.class
 GetHelloResponse.java
 GetHelloResponse.class
 
 这些文件与与前面所说的ant脚本中生成的
 D:\Sun\SDK\domains\domain1\generated\ejb\j2ee-modules\endpoint_Hello\endpoint\jaxws
 下的文件相同
 
5、将服务器打包,做成war文件
 ①建立打包所需要的目录
    在项目的deploy目录下建立一个子目录/WEB-INF,
   WEB-INF子目录下再建立两个子目录
    classes/  用于存放服务器端类
    wsdl/     用于存放wsdl文件

 ②将各输出文件或目录拷贝到相应的目录下
  (1)把build\classes\endpoint整个目录拷贝到deploy/WEB-INF/class目录下
  (2)把build\generated目录下的两个文件
   HelloService.wsdl、HelloService_schema1.xsd拷贝到
      deploy/WEB-INF/wsdl目录下
 ③在deploy/WEB-INF/ 目录下新建一个web.xml文件,内容为
  <?xml version="1.0" encoding="UTF-8"?>
  <web-app xmlns="http://java.sun.com/xml/ns/javaee"
   xmlns:j2ee="http://java.sun.com/xml/ns/javaee"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.5"
   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
   http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <description>WebTier for the Hello Service</description>
  <display-name>HelloWAR</display-name>
  <servlet>
   <description>Endpoint for Hello Web Service</description>
   <display-name>HelloWebService</display-name>
   <servlet-name>Hello</servlet-name>
   <servlet-class>endpoint.Hello</servlet-class>
   <load-on-startup>0</load-on-startup>
  </servlet>
  <servlet-mapping>
   <servlet-name>Hello</servlet-name>
   <url-pattern>/HelloService</url-pattern>
  </servlet-mapping>
  <session-config>
   <session-timeout>54</session-timeout>
  </session-config>
  </web-app>
 ④将service打包,执行
  (1)cd WebTest\deploy   ;进入打包目录
  (2)jar cvf hello.war *  ;将当前目录下的所有内容打包到hello.war文件中
  
  
6、将service 类发布到网络服务器上
 ①启动sun 服务器
   方法为
  开始->程序->Sun Microsystems->Application Server PE 9->Start  Default Server
 ②在项目目录下建立一个passwd文件,内容是sun服务器admin用户的密码,例如
  AS_ADMIN_PASSWORD=testtesttest
 ③将hello.war发布到服务器上,执行
  (1)cd WebTest  ;进入项目目录
  (2)发布服务器包,注意这个命令是在一行执行的,
  我为了书写方便而断行。分号后面是注释
  asadmin deploy
    --user admin             ;管理员用户名
    --passwordfile passwd    ;密码文件名,就是我们刚才写的passwd文件
    --host localhost        
    --port 4848     ;管理端口号
    --contextroot myhello   ;上下文根名称
    --upload=true    
    --target server    
    deploy/hello.war
 
 ④在浏览器中输入地址
  http://localhost:8080/myhello/HelloService?WSDL
  如果浏览器能显示出正确的内容,就说明成功。

7、生成客户端的stub类
 ①在项目的build\classes目录下建立一个stub子目录
 ②执行
  (1)cd WebTest   ;进入项目子目录
  (2)wsimport -keep -d ./build/classes/stub http://localhost:8080/myhello/HelloService?WSDL
 
 执行完成后会在build/classes/stub下建立一个endpoint目录,下面有这些文件
  GetHello.java
  GetHelloResponse.java
  Hello.java
  HelloService.java
  GetHello.class
  GetHelloResponse.class
  Hello.class
  HelloService.class
  ObjectFactory.class
  ObjectFactory.java
  package-info.java
  package-info.class
 这些文件和ant脚本中import执行的结果一样
 
8、编写客户端测试程序
 在项目的src目录下建立一个子目录client,在这个目录下面建立一个
 Client.java文件,内容为
 
 // src\client\Client.java文件 调用服务器提供的webservice的测试类
 package client;

 import javax.xml.ws.WebServiceRef;
 import endpoint.HelloService;
 import endpoint.Hello;

 public class Client
 {
     @WebServiceRef(wsdlLocation="http://localhost:8080/myhello/HelloService?WSDL")
     static HelloService service;
  public static void main(String[] args)
     { 
         Client client = new Client();
         client.doHello();
     }
        public void doHello()
     {
         try
         {
             Hello port = service.getHelloPort();
             String ret = port.getHello(System.getProperty("user.name"));
             System.out.println("Hello result = " + ret);
         }
         catch(Exception e)
         {
             e.printStackTrace();
         }
     }
 }
 
9、编译客户端程序
 执行
 (1)cd WebTest  ;进入项目目录
 (2)javac -classpath ./build/classes/stub;d:/Sun/SDK/lib/javaee.jar;d:/Sun/SDK/lib/appserv-ws.jar -d ./build/classes/stub src/client/Client.java 
 执行成功后会在F:\exercise\java\WebTest\build\classes目录下建立一个
 client目录,下面有一个Client.class文件
 
10、运行客户端程序
 (1)cd WebTest\build\classes\stub  ;进入client的上级目录
 (2)set  APPCPATH=.     ;设置环境变量APPCPATH,不然运行appclient程序时会出一堆莫名奇妙的错误
 (3)>appclient client.Client运行测试程序,结果为
  Hello result = Hello Administrator!
 执行成功


/*title: web service入门学习笔记(八)
**date: 2007/01/19
**author:laomai
**url: http://blog.csdn.net/laomai/
*/

八、小结
开发webservice的基本步骤为
1、编写服务器端,要点有
 ①导入WebService包和WebMethod包
   import javax.jws.WebService;
   import javax.jws.WebMethod;
 ②实现的服务类前加@WebService符号 
 ③为了代码清晰,类提供的公开方法前加@WebMethod符号,这个不写对编译也没影响,
  
2、编译服务器端,要点为
 ①javac命令的classpath选项中要有javaee.jar的路径,如
  javac -classpath d:/Sun/SDK/lib/javaee.jar -d ./build src/endpoint/Hello.java
 ②用wsgen命令生成wsdl文件.
 ③将服务器端打包
 注意如果是sun的服务器,那么把service类直接编译到
 javaee5安装目录\domains\domain1\autodeploy下,可以自动完成②和③的工作。
 我们介绍的sun自带的入门脚本就是这么做的。
3、在客户端机器上自动生成stub类,要点为
 ①客户机上必须也装有jdk和javaee5
 ②用wsimport工具将服务器传过来的wsdl文件转换成本地的stub类
4、编写客户端调用代码,要点:
 ①导入WebServiceRef包
  import javax.xml.ws.WebServiceRef;
 ②导入本地生成的stub类,如
  import endpoint.HelloService;
  import endpoint.Hello;
 ③指明服务器的wsdl路径
  @WebServiceRef(wsdlLocation="http://localhost:8080/myhello/HelloService?WSDL")
 ④声明一个静态的service对象
  static HelloService service;
 ⑤对要调用的远程方法声明一个代理对象,通过代理来调用真正的远程方法
  Hello port = service.getHelloPort();
     String ret = port.getHello(System.getProperty("user.name"));
5、编译客户端调用程序,注意classpath参数中要有
 ①stub类的路径
 ②javaee.jar的路径
 ③appserv-ws.jar的路径
 
6、用appclient执行客户端程序,要点为
 ①进入到客户端程序的上级目录
 ②把APPCPATH的值设置为当前目录" . "
 ③appclient的第一个参数为客户端程序名,
   后面的参数是传给客户端程序本身的命令行参数。

/*title: web service入门学习笔记(九)
**date: 2007/01/19
**author:laomai
**url: http://blog.csdn.net/laomai/
*/ 
 
九、本文中用到的文件
1、WebTest项目文件列表 
WebTest\passwd 保存密码的文件,手工建立
WebTest\src 子目录 手工建立,内容为
 endpoint\Hello.java  服务器类的实现文件
 client\Client.java   客户类的实现文件
WebTest\build
 generated 子目录,手工建立,内容为
  HelloService.wsdl   由wsgen命令生成
  HelloService_schema1.xsd  由wsgen命令生成
 classes 子目录,手工建立,内容为
  endpoint\Hello.class  由javac命令生成
  endpoint\jaxws子目录,由wsgen命令自动生成,内容为
    GetHello.java
    GetHelloResponse.java
    GetHello.class
    GetHelloResponse.class
  stub 子目录,手工建立,内容为:
   client\Client.class 由javac命令生成
   endpoint 子目录 由wsimport命令自动生成,内容为:
    GetHello.java
    GetHelloResponse.java
    Hello.java
    HelloService.java
    ObjectFactory.java
    package-info.java
    package-info.class
    GetHello.class
    GetHelloResponse.class
    Hello.class
    HelloService.class
    ObjectFactory.class
WebTest\deploy子目录 手工建立,内容为
 hello.war 将WEB-INF子目录打包后生成的文件,由jar命令生成
 WEB-INF   打包的输入目录,手工建立。内容包括:
  web.xml   手工建立
  classes\endpoint子目录 为build\classes\endpoint的拷贝
  wsdl子目录,由build\generated拷贝而来

2、生成的HelloService.wsdl文件的内容
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<definitions targetNamespace="http://endpoint/" name="HelloService" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://endpoint/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
  <types>
    <xsd:schema>
      <xsd:import namespace="http://endpoint/" schemaLocation="HelloService_schema1.xsd"/>
    </xsd:schema>
  </types>
  <message name="getHello">
    <part name="parameters" element="tns:getHello"/>
  </message>
  <message name="getHelloResponse">
    <part name="parameters" element="tns:getHelloResponse"/>
  </message>
  <portType name="Hello">
    <operation name="getHello">
      <input message="tns:getHello"/>
      <output message="tns:getHelloResponse"/>
    </operation>
  </portType>
  <binding name="HelloPortBinding" type="tns:Hello">
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
    <operation name="getHello">
      <soap:operation soapAction=""/>
      <input>
        <soap:body use="literal"/>
      </input>
      <output>
        <soap:body use="literal"/>
      </output>
    </operation>
  </binding>
  <service name="HelloService">
    <port name="HelloPort" binding="tns:HelloPortBinding">
      <soap:address location="REPLACE_WITH_ACTUAL_URL"/>
    </port>
  </service>
</definitions>

十、致谢
 在学习WebService的过程中,我得到了csdn java版的叶锋城朋友的许多指点,
饼子堂的兄弟们也给了很多有用的资料,这里一并表示谢意。本文也算是我给这些
朋友们的一个汇报和总结,呵呵。

(--end
/*title: web service入门学习笔记
**date: 2007/01/23
**author:laomai
**url: http://blog.csdn.net/laomai/*/

 

分享到:
评论

相关推荐

    WebService的实现——CXF学习笔记

    【WebService的实现——CXF学习笔记】 在Java世界中,WebService是一种通过标准协议(如SOAP)进行跨平台、跨语言通信的技术。CXF是Apache软件基金会的一个开源项目,它提供了构建和消费Web服务的工具和库。CXF支持...

    Spring.NET学习笔记21——整合WebService的例子

    刘冬编写的Spring.NET学习笔记21——整合WebService的例子。 原文:http://www.cnblogs.com/GoodHelper/archive/2009/11/19/SpringNet_WebService.html

    WebService CXF学习文档

    WebService CXF学习——入门篇 1.CXF由来 2.HelloWorld 3.WSDL描述 WebService CXF学习——进阶篇 1.SOAP讲解 2.JAX-WS讲解 3.对象传递 WebService CXF学习——高级篇(一)(二) 1.整合Spring框架 2.CXF...

    WebService学习笔记

    【WebService学习笔记】 WebService是一种基于互联网的、标准化的、跨平台的、跨语言的通信机制,使得不同系统间的应用程序可以互相交互数据和服务。它的核心理念是服务导向架构(SOA),即通过服务的方式实现应用...

    webService学习笔记

    在本篇WebService学习笔记中,我们将探讨几个关键的概念和技术,包括SOAP协议、JAX-WS、WSDL文档以及一些常用的Web服务框架。 首先,SOAP(Simple Object Access Protocol)是一种基于XML的协议,用于在分布式环境...

    webservice学习笔记doc文档

    在本学习笔记中,主要介绍了使用Apache Axis2框架来开发和测试Web Service的过程。Apache Axis2是Apache SOAP栈的一个实现,提供了简单且高效的Web Service开发工具。 首先,开发者需要在Eclipse集成开发环境中搭建...

    尚硅谷Webservice学习笔记

    在本篇尚硅谷的学习笔记中,主要涉及了Web Service的基础概念、Schema约束、HTTP协议以及相关面试问题。 1. Schema约束: - Schema是XML Schema Document的缩写,它是一种XML格式,用于定义其他XML文档的结构和...

    java 私塾课堂笔记——WebService.doc

    Java 私塾课堂笔记——WebService WebService 是一种技术,使应用程序可以以与平台和编程语言无关的方式进行相互通信。它是一个软件接口,描述了一组可以在网络上通过标准化的 XML 消息传递访问的操作。WebService ...

    WebService学习笔记0001

    【WebService学习笔记0001】 在IT领域,WebService是一种基于开放标准(如XML、SOAP、WSDL和UDDI)的互操作性技术,它允许不同系统间的应用程序通过网络进行通信。本学习笔记将围绕WebService的核心概念、工作原理...

    WebService一——使用JDK开发WebService

    【WebService一——使用JDK开发WebService】 WebService是一种基于XML(Extensible Markup Language)的网络服务标准,它允许不同系统间的应用程序进行交互,不受操作系统、编程语言的限制。本篇文章将探讨如何使用...

    webservice学习笔记 -- XFrie

    【Web Service学习笔记——XFrie框架详解】 Web Service是一种通过网络进行通信的服务,它允许不同的应用程序之间进行数据交换,跨越了操作系统和编程语言的障碍。XFrie是一个轻量级、高性能的Java Web Service框架...

    WebService二——使用Eclipse开发WebService及各种调用方式

    【WebService二——使用Eclipse开发WebService及各种调用方式】 在IT行业中,WebService是一种基于标准协议(如SOAP、WSDL...通过不断学习和实践,我们可以更好地理解和利用WebService在跨平台、跨语言环境下的优势。

    webservice学习笔记

    ### WebService 学习笔记详解 #### 一、实验环境搭建与配置 在开始Web Service的学习之前,首先需要搭建一个适合开发的环境。本实验基于以下配置: - 操作系统:Windows 2000 (Win2k) - JDK版本:1.6 - Java EE...

    JAVA6开发WebService (四)——SAAJ调用WebService

    在本篇主题“JAVA6开发WebService(四)——SAAJ调用WebService”中,我们将探讨如何使用Java API for XML Messaging (SAAJ)来与WebService进行交互。SAAJ是Java平台中用于处理SOAP消息的API,它提供了创建、解析和...

    WebService客户端调用WebService服务示例代码——java

    WebService客户端调用WebService服务示例代码,java代码,纯手工,包括直接httpClient直接发送Saop报文调用和利用wsimport -keep 生成客户端代码后调用两种方式的示例。因涉及商务账户密码隐私,因此代码中的有些账号...

Global site tag (gtag.js) - Google Analytics