webservice学习笔记——理解篇

    技术2022-05-11  79

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


    最新回复(0)