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