商讯信箱
用户名: @
密  码:   注册|忘记密码
登录
个人用户经销商
您的位置:首页 > 技术频道 > 正文

webservice学习笔记——理解篇

作者:laomai  2007-09-07



【IT168 技术文档】

七、命令行开发过程
   通过以上的学习,我们知道如何在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文件中
  
  
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!
 执行成功

1 2
【内容导航】
第1页: 命令行开发过程 第2页: 小结
©版权所有。未经许可,不得转载。
[责任编辑:李宁]
[an error occurred while processing this directive]