四、例子源代码剖析
D:\Sun\SDK\samples\javaee5\webservices\hello-jaxws(以后简称为hello-jaxws)
项目里的源文件只有三个 
hello-jaxws\src\endpoint\Hello.java   提供webservice的服务器端实现类
hello-jaxws\src\client\Client.java    调用webservice的客户端测试类
hello-jaxws\build.xml                 自动编译的ant脚本下面我们把这三个文件的内容看一下
1、服务器端的service实现类文件Hello.java,
/* src\endpoint\Hello.java文件的内容 */
package endpoint;
import javax.jws.WebService;@WebService
public class Hello
{
   public String getHello(String name)
    {
        return "Hello " + name + "!";
    }
}有这个文件可以看出,编写一个service的实现类,把编写普通的java类
差不多,只不过又多了三点
①要在该类前一个@WebService说明,
②引入javax.jws.WebService;
③在公开的方法前加@WebMethod说明,如果不加的话,
所有的public方法都会自动变成service的对外接口.
2、客户端测试类的实现文件
/* src\client\Client.java文件的内容 */
package client;
import javax.xml.ws.WebServiceRef;
import endpoint.HelloService;
import endpoint.Hello;public class Client
{
    @WebServiceRef(wsdlLocation="http://localhost:8080/Hello/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();
        }
    }
}
客户端调用代码要点为:
①导入WebServiceRef包
import javax.xml.ws.WebServiceRef;
②导入本地生成的stub类,另外编译时也要指明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"));3、ant 脚本build.xml
<!-- ant 脚本build.xml的内容 -->
<?xml version="1.0" encoding="UTF-8"?>
<project name="hello-jaxws" default="all" basedir=".">
    <!-- include user specific build properties -->

<!-- 导入预先j2ee预先写好的设置文件-->
    <property file="../../../bp-project/build.properties"/>
    <property file="${user.home}/build.properties"/>
    <property file="../../../bp-project/app-server.properties"/>
    
    <!-- 设置发布目录和类的输出目录 -->
    <property name="autodeploydir" value="${javaee.domaindir}/autodeploy"/>
    <property name="classesdir" value="./build"/> <!-- 设置java的类库路径 -->
    <path id="classpath">
        <pathelement location="${javaee.home}/lib/j2ee.jar"/>
        <pathelement location="${classesdir}"/>
    </path>
    
    <!-- 项目的最终任务 -->
    <target name="all" depends="run-client">
        <!--antcall target="restore"/-->
    </target> <!-- 测试操作系统环境-->
    <target name="init">
        <condition property="windows">
            <os family="windows" /> 
        </condition>
        <condition property="unix">
            <os family="unix" /> 
        </condition>
    </target> <!-- 编译服务器端并把它自动发布到sun的服务器上 -->
    <target name="compile-deploy-service" depends="init">
        <mkdir dir="${classesdir}"/>
        <echo message="${javaee.home}"/>
        <javac 
            srcdir="./src" 
            includes="endpoint/**"
            destdir="${autodeploydir}"
            classpath="${javaee.home}/lib/j2ee.jar" 
        />
        <waitfor maxwait="100" maxwaitunit="second">
           <or>
                <available file="${autodeploydir}/endpoint/Hello.class_deployed"/>
                <available file="${autodeploydir}/endpoint/Hello.class_deployFailed"/>
           </or>
        </waitfor>
        <condition property="deploy_succeeded">
                <available file="${autodeploydir}/endpoint/Hello.class_deployed"/>
        </condition>
        <condition property="deploy_failed">
                <available file="${autodeploydir}/endpoint/Hello.class_deployFailed"/>
        </condition>
    </target>    <target name="get-artifacts" depends="compile-deploy-service,get-artifacts-windows,get-artifacts-unix"/> <!-- 生成客户端所需的stub -->
    <target name="get-artifacts-windows" if="windows">
        <exec executable="${javaee.home}/bin/wsimport.bat">
            <arg line="-keep -d ${classesdir} http://${javaee.server.name}:${javaee.server.port}/Hello/HelloService?WSDL"/>
        </exec>
    </target>    <target name="get-artifacts-unix" if="unix">
        <exec executable="${javaee.home}/bin/wsimport">
            <arg line="-keep -d ${classesdir} http://${javaee.server.name}:${javaee.server.port}/Hello/HelloService?WSDL"/>
        </exec>
    </target>   <!-- 编译客户端 -->
    <target name="compile-client" depends="get-artifacts">
        <javac srcdir="./src/client" destdir="${classesdir}">
            <classpath refid="classpath"/>
        </javac>
    </target>
    
    
    <target name="run-client" depends="compile-client,run-client-windows,run-client-unix"/>

<!-- 执行客户端 -->
    <target name="run-client-windows" if="windows">
        <exec executable="${javaee.home}/bin/appclient.bat" dir="${classesdir}">
            <arg value="client.Client"/>    
        </exec>    
    </target>    <target name="run-client-unix" if="unix"> 
        <exec executable="${javaee.home}/bin/appclient" dir="${classesdir}" failifexecutionfails="false">
            <arg value="client.Client"/>    
        </exec>    
    </target>
    
    <!-- 以下几个任务用与清理和卸载-->
    <!-- 删除生成的类文件-->
    <target name="clean">
    <delete dir="${classesdir}"/>
    </target>
<!-- 删除和卸载服务器的webservice-->
    <target name="restore">
        <delete>
        <fileset dir="${autodeploydir}/endpoint" includes="Hello*.*"/>
        </delete>
    </target>    <target name="undeploy">
        <antcall target="restore"/>
    </target>
</project>这个脚本有许多在windows平台用不到的步骤,下面我们对其进行改造,把它精简一下./*title: web service入门学习笔记(五)
**date: 2007/01/18
**author:laomai
**url: http://blog.csdn.net/laomai/
*/

解决方案 »

  1.   


    五、精简后的ant脚本
    1、卸载webservice
    执行原build.xml里的clean和 undeploy任务,把安装好的webservice删除掉,具体办法为:
    (1)在myeclipse里打开build.xml文件
    (2)在build.xml文件里单击右键菜单中的""run as"->"2 ant build..."",
    (3)在弹出的对话框中只选择clean和undelpoy任务。 然后单击"run"按钮。
    此时再访问http://localhost:8080/Hello/HelloService?WSDL,出现http 404错误,说明卸载成功2、简化后的脚本内容,在hello-jaxws目录下新建一个buildtest.xml文件,内容为
    <?xml version="1.0" encoding="UTF-8"?>
    <project name="hello-jaxws" default="all" basedir=".">
    <!-- javaee安装目录的设置,代替了原来脚本中的导入语句 -->
    <property name="javaee.home" value = "d:/Sun/SDK"/>
    <property name="javaee.domaindir" value="${javaee.home}/domains/domain1"/>
    <property name="javaee.server.name" value="localhost"/>
    <property name="javaee.server.port" value="8080"/>  <!-- 设置发布目录和类的输出目录 -->
    <property name="autodeploydir" value="${javaee.domaindir}/autodeploy"/>
    <property name="classesdir" value="./build"/>     <!-- 设置java类库路径 -->
    <path id="classpath">
    <pathelement location="${javaee.home}/lib/j2ee.jar"/>
    <pathelement location="${classesdir}"/>
    </path> <target name="all" depends="run-client">
    <!--antcall target="restore"/-->
    </target> <target name="run-client" depends="compile-client,run-client-windows" /> <!-- 运行测试类,为项目的最后一个步骤-->
    <target name="run-client-windows">
    <exec executable="${javaee.home}/bin/appclient.bat" dir="${classesdir}">
    <arg value="client.Client" />
    </exec>
    </target> <!-- 编译测试webservice的客户类,为项目的第三个步骤,本步骤的输出文件为
    ${classesdir}/client/Client.class
    -->

    <target name="compile-client" depends="get-artifacts">
    <javac srcdir="./src/client" destdir="${classesdir}">
    <classpath refid="classpath" />
    </javac>
    </target> <target name="get-artifacts" depends="compile-deploy-service,get-artifacts-windows"/>

    <!-- 本步骤的目的是生成客户端的stub文件,是项目的第二个步骤,本步骤的输出文件为
    在${classesdir}下面自动生成了如下的文件
    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
    -->
    <target name="get-artifacts-windows">
    <exec executable="${javaee.home}/bin/wsimport.bat">
    <arg line="-keep -d ${classesdir} http://${javaee.server.name}:${javaee.server.port}/Hello/HelloService?WSDL" />
    </exec>
    </target> <!-- 本步骤的目的是编译服务器类,并自动产生wsdl.是项目的第一个步骤,本步骤的主要输出文件为
    ${autodeploydir}\endpoint\Hello.class
    ${autodeploydir}\domain1\autodeploy\endpoint\Hello.class_deployed

    在d:\Sun\SDK\domains\domain1\applications\j2ee-modules
    下建立一个endpoint_Hello目录,


    在d:\Sun\SDK\domains\domain1\generated\ejb\j2ee-modules建立一个
    endpoint_Hello目录,这个目录下又建立了一个endpoint\jaxws目录,里面有如下内容
    GetHello.java
    GetHelloResponse.java
    GetHello.class
    GetHelloResponse.class

    在D:\Sun\SDK\domains\domain1\generated\xml\j2ee-modules\下建立一个
    endpoint_Hello目录,这个目录下又有一个WEB-INF子目录,内容为
    wsdl子目录

    sun-web.xml  文件
    web.xml      文件
    webservices.xml  文件
    wsdl子目录下又有两个文件
    HelloService.wsdl
    HelloService_schema1.xsd
    当我们在浏览器输入http://localhost:8080/Hello/HelloService?WSDL时,显示的正是
    这个domains\domain1\generated\xml\j2ee-modules\endpoint_Hello\WEB-INF\wsdl
    文件的内容
    -->

    <target name="compile-deploy-service">
    <mkdir dir="${classesdir}" />
    <echo message="${javaee.home}" />
    <javac 
                srcdir="./src" 
                includes="endpoint/**"           
                destdir="${autodeploydir}"     
                classpath="${javaee.home}/lib/j2ee.jar" 
            />
    <waitfor maxwait="100" maxwaitunit="second">
    <or>
    <available file="${autodeploydir}/endpoint/Hello.class_deployed"/>
    <available file="${autodeploydir}/endpoint/Hello.class_deployFailed"/>
    </or>
    </waitfor>
    <condition property="deploy_succeeded">
    <available file="${autodeploydir}/endpoint/Hello.class_deployed"/>
    </condition>
    <condition property="deploy_failed">
    <available file="${autodeploydir}/endpoint/Hello.class_deployFailed"/>
    </condition>
    </target>
    <!-- 以下的任务用于清理和卸载-->
    <target name="clean">
    <delete dir="${classesdir}"/>
    </target> <target name="restore">
    <delete>
    <fileset dir="${autodeploydir}/endpoint" includes="Hello*.*"/>
    </delete>
    </target> <target name="undeploy">
    <antcall target="restore"/>
    </target>
    </project>3、运行结果
    在myeclipse里执行这个刚才编写的buildtest.xml脚本,console里的输出为
    Buildfile: D:\Sun\SDK\samples\javaee5\webservices\hello-jaxws\buildtest.xml
    compile-deploy-service:
        [mkdir] Created dir: D:\Sun\SDK\samples\javaee5\webservices\hello-jaxws\build
         [echo] d:/Sun/SDK
        [javac] Compiling 1 source file to D:\Sun\SDK\domains\domain1\autodeploy
    get-artifacts-windows:
    get-artifacts:
    compile-client:
        [javac] Compiling 1 source file to D:\Sun\SDK\samples\javaee5\webservices\hello-jaxws\build
    run-client-windows:
         [exec] Hello result = Hello Administrator!
    run-client:
    all:
    BUILD SUCCESSFUL
    Total time: 50 seconds也执行成功
      

  2.   

    /*title: web service入门学习笔记(六)
    **date: 2007/01/19
    **author:laomai
    **url: http://blog.csdn.net/laomai/
    */六、一个通用的ant脚本
    1、脚本内容
     上面的buildtest.xml脚本虽然对原始的build.xml做了精简,但是还不够通用,
    比如服务器的类名和方法名等等都写死了,显然还不适合我们的需要,于是我又写了一个相对通用的脚本
    mybuild.xml,内容如下
    <?xml version="1.0" encoding="UTF-8"?><project name="hello-jaxws" default="all" basedir=".">
    <!-- javaee安装目录的设置,代替了原来脚本中的导入语句 -->
    <property name="javaee.home" value = "d:/Sun/SDK"/>
    <property name="javaee.domaindir" value="${javaee.home}/domains/domain1"/>
    <property name="javaee.server.name" value="localhost"/>
    <property name="javaee.server.port" value="8080"/> <!-- 设置发布目录和类的输出目录 -->
    <property name="autodeploydir" value="${javaee.domaindir}/autodeploy"/>
    <property name="classesdir" value="./build"/> <!-- 设置java类库路径 -->
    <path id="classpath">
    <pathelement location="${javaee.home}/lib/j2ee.jar"/>
    <pathelement location="${classesdir}"/>
    </path>
    <!-- 提供服务的类名 -->
    <property name="serviceclass" value="Hello" />
    <property name="serverclasspath" value="endpoint" /> <!-- 服务器所在的package名称
    也就是Hello.java文件中第一句
    package endpoint;语句中的endpoint
    -->
    <!-- 调用webservice的测试类名-->
    <property name = "clientclass" value="Client"/>
    <property name = "clientclasspath" value="client"/> <!-- 测试类所在的package名称,
         也就是Client.java文件中第一句
        package client;语句中的client;
        -->
    <!-- 生成的wsdl文件的uri的格式,注意value的值分成两行写时有问题, 
    这里为了阅读方便而分行,拷贝时必须放到一行
    我还没找到ant脚本里的续行符是什么:-( 
    -->
    <property name="wsdluri" 
      value="http://${javaee.server.name}:${javaee.server.port}
      /${serviceclass}/${serviceclass}Service?WSDL" /> <target name="all" depends="run-client">
    <!-- antcall target="restore"/ -->
    </target> <target name="run-client" depends="compile-client,run-client-windows" /> <!-- 运行测试类,为项目的最后一个步骤-->
    <target name="run-client-windows">
    <exec executable="${javaee.home}/bin/appclient.bat" dir="${classesdir}">
    <arg value="${clientclasspath}.${clientclass}" />
    </exec>
    </target> <!-- 编译测试webservice的客户类,为项目的第三个步骤,本步骤的输出文件为
    ${classesdir}/client/Client.class
    --> <target name="compile-client" depends="get-artifacts">
    <javac srcdir="./src/${clientclasspath}" destdir="${classesdir}">
    <classpath refid="classpath" />
    </javac>
    </target> <target name="get-artifacts" depends="compile-deploy- ②asadmin deploy --user admin --password laomailaomai --host localhost --port 4848 --contextroot hello --upload=true --target server
    service,get-artifacts-windows"/> <!-- 生成客户端的stub类 -->
    <target name="get-artifacts-windows">
    <exec executable="${javaee.home}/bin/wsimport.bat">
    <arg line="-keep -d ${classesdir} ${wsdluri}" />
    </exec>
    </target> <!-- 本步骤的目的是编译服务器类,并自动产生wsdl文件-->
    <target name="compile-deploy-service">
    <echo message="${javaee.home}" />
    <javac 
                srcdir="./src" 
                includes="${serverclasspath}/**"           
                destdir="${autodeploydir}"     
                classpath="${javaee.home}/lib/j2ee.jar" 
            />
    <waitfor maxwait="100" maxwaitunit="second">
    <or>
    <available file="${autodeploydir}/${serverclasspath}/${serviceclass}.class_deployed"/>
    <available file="${autodeploydir}/${serverclasspath}/${serviceclass}.class_deployFailed"/>
    </or>
    </waitfor>
    <condition property="deploy_succeeded">
    <available file="${autodeploydir}/${serverclasspath}/${serviceclass}.class_deployed"/>
    </condition>
    <condition property="deploy_failed">
    <available file="${autodeploydir}/${serverclasspath}/${serviceclass}.class_deployFailed"/>
    </condition>
    </target> <!-- 以下的任务用于清理和卸载-->
    <target name="clean">
    <delete dir="${autodeploydir}/${serverclasspath}"/>
    <delete dir="${classesdir}/${serverclasspath}"/>
    <delete dir="${classesdir}/${clientclasspath}"/>
    </target>
    </project>2、脚本的使用方式
    以后再写自己service时,只要按实际情况改变以下4条语句中的value值就可以了
    <property name="serviceclass" value="Hello" />  
    <property name="serverclasspath" value="endpoint" />
    <property name = "clientclass" value="Client"/>
    <property name = "clientclasspath" value="client"/>
    /*title: web service入门学习笔记(七)
    **date: 2007/01/19
    **author:laomai
    **url: http://blog.csdn.net/laomai/
    */
      

  3.   

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

  4.   

    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!
    执行成功
      

  5.   

    /*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/*/)
      

  6.   

    写得不错啊,我很容易就看懂了。感觉web services挺像ejb,
    差别在于获得远程服务对象
    web services用的是通过http的web services规范,
    ejb是通过rmi的ejb规范。
      

  7.   

    还没用到web service
    先下,以后用方便查,谢谢楼主
      

  8.   

    Webservice是个好东西,用于大型和分布系统的集成非常好.大雁软件
    Tiger
    <a href=www.szdayan.com target=_blank>大雁协同办公</a>
      

  9.   

    用myeclipse的xfire做webservice,就跟用vs.net做webservice一样方便。无论是服务端,还是客户端,都是鼠标点几下,无需什么配置脚本,就可以生成一个完整的框架。楼主可能是linux出身,喜欢搞些脚本配置我windows出身,就喜欢指指点点。你直接上不就行了,费那事干吗(出自疯狂的石头)
      

  10.   

    支持,我突然想起j2se sdk和j2ee sdk有什么区别。
      

  11.   

    能不能不用ant工具 讲解一下啊 谢谢楼主