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