??xml version="1.0" encoding="utf-8" standalone="yes"?>
**author:laomai
**url: http://blog.csdn.net/laomai/
*/
七、命令行开发过E?br />
通过以上的学习,我们知道如何在ant脚本和ide环境中开发一个简单的webservice.
但是作ؓ搞技术的人特别是搞c的h来看Q上面的q程隐藏了太多的东西Q?br />
Ҏ们有ȝ_的hQ自然就x清楚脚本背后的过E?br />
假设我们的机器上没有ide环境和ant工具Q?br />
我们如何“手工”~译qwebservice呢?
q就是本节要讲述的内?-只用命o行工具开发webservice.
再次声明:
本部分主要参考了
http://blog.csdn.net/lin_bei/archive/2006/11/07/1371131.aspx
的内容,׃q位兄弟译的不是很通顺Q我按照自q理解来改~成?br /> hellowrold的例?-)?br /> 其他部分为我原创Q{载时h明出处?/p>
0、设|环境变?br />
把jdk和javaee的\径如
D:\Java\jdk1.6.0
D:\Sun\SDK\bin加到pȝ的path变量中去
1、徏立项目目?br />
首先建立一个项目的目录Q名为WebTestQ项目目录下又包含三个子目录
src\ 本目录用于存放源代码Q?br />
build\ 本目录用于存放输出的文g
deploy\ 本目录用于对服务器打?br />
2、编写服务器cd现文?br />
在项目的src目录下徏立一个个子目录endpointQ?br />
在这个endpoint子目录下新徏一个Hello.java文gQ内容如?br />
/*src\endpoint\Hello.java文g
提供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、编译服务器c?br />
①在build目录下徏立一个子目录classes
②在命o行执行如下命?br />
cd WebTest ;q入目目录
javac -classpath d:/Sun/SDK/lib/javaee.jar -d ./build/classes src/endpoint/Hello.java ;~译服务器类
执行完后会生一个build\classes\endpoint\Hello.class文g
4、生成wsdl文g
①在build目录下徏立一个子目录generated
②生成wsdl文g,执行
wsgen -cp ./build/classes -keep -d ./build/classes -r ./build/generated -wsdl endpoint.Hello
执行完成会在./build/generated产生两个文g
HelloService.wsdl
HelloService_schema1.xsd
q且在\build\class\endpoint下徏立一个jaxws目录Q下面有4个文?br />
GetHello.java
GetHello.class
GetHelloResponse.java
GetHelloResponse.class
q些文g与与前面所说的ant脚本中生成的
D:\Sun\SDK\domains\domain1\generated\ejb\j2ee-modules\endpoint_Hello\endpoint\jaxws
下的文g相同
5、将服务器打包,做成war文g
①徏立打包所需要的目录
在项目的deploy目录下徏立一个子目录/WEB-INFQ?br />
WEB-INF子目录下再徏立两个子目录
classes/ 用于存放服务器端c?br />
wsdl/ 用于存放wsdl文g
②将各输出文件或目录拯到相应的目录?br />
(1)把build\classes\endpoint整个目录拯到deploy/WEB-INF/class目录?br />
(2)把build\generated目录下的两个文g
HelloService.wsdl、HelloService_schema1.xsd拯?br />
deploy/WEB-INF/wsdl目录?br />
③在deploy/WEB-INF/ 目录下新Z个web.xml文gQ内容ؓ
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="
xmlns:j2ee="
xmlns:xsi="
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
<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 ;q入打包目录
(2)jar cvf hello.war * ;当前目录下的所有内Ҏ包到hello.war文g?br />
6、将service cd布到|络服务器上
①启动sun 服务?br />
Ҏ?br />
开?>E序->Sun Microsystems->Application Server PE 9->Start Default Server
②在目目录下徏立一个passwd文gQ内Ҏsun服务器admin用户的密码,例如
AS_ADMIN_PASSWORD=testtesttest
③将hello.war发布到服务器上,执行
(1)cd WebTest ;q入目目录
(2)发布服务器包Q注意这个命令是在一行执行的Q?br />
我ؓ了书写方便而断行。分号后面是注释
asadmin deploy
--user admin ;理员用户名
--passwordfile passwd ;密码文g名,是我们刚才写的passwd文g
--host localhost
--port 4848 ;理端口?br />
--contextroot myhello ;上下文根名称
--upload=true
--target server
deploy/hello.war
④在览器中输入地址
http://localhost:8080/myhello/HelloService?WSDLQ?br />
如果览器能昄出正的内容Q就说明成功?/p>
7、生成客L的stubc?br />
①在目的build\classes目录下徏立一个stub子目?br />
②执?br />
(1)cd WebTest ;q入目子目?br />
(2)wsimport -keep -d ./build/classes/stub http://localhost:8080/myhello/HelloService?WSDL
执行完成后会在build/classes/stub下徏立一个endpoint目录Q下面有q些文g
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
q些文g和ant脚本中import执行的结果一?br />
8、编写客L试E序
在项目的src目录下徏立一个子目录clientQ在q个目录下面建立一?br />
Client.java文gQ内容ؓ
// src\client\Client.java文g 调用服务器提供的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、编译客LE序
执行
(1)cd WebTest ;q入目目录
(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目录下徏立一?br />
client目录Q下面有一个Client.class文g
10、运行客LE序
(1)cd WebTest\build\classes\stub ;q入client的上U目?br />
(2)set APPCPATH=. ;讄环境变量APPCPATHQ不然运行appclientE序时会Z堆莫名奇妙的错误
(3)>appclient client.Clientq行试E序Q结果ؓ
Hello result = Hello Administrator!
执行成功
/*title: web service入门学习W记Q八Q?br />
**date: 2007/01/19
**author:laomai
**url: http://blog.csdn.net/laomai/
*/
八、小l?br />
开发webservice的基本步骤ؓ
1、编写服务器端,要点?br />
①导入WebService包和WebMethod?br />
import javax.jws.WebService;
import javax.jws.WebMethod;
②实现的服务cd加@WebServiceW号
③ؓ了代码清?cL供的公开Ҏ前加@WebMethodW号,q个不写对编译也没媄响,
2、编译服务器端,要点?br />
①javac命o的classpath选项中要有javaee.jar的\径,?br />
javac -classpath d:/Sun/SDK/lib/javaee.jar -d ./build src/endpoint/Hello.java
②用wsgen命o生成wsdl文g.
③将服务器端打包
注意如果是sun的服务器Q那么把servicecȝ接编译到
javaee5安装目录\domains\domain1\autodeploy下,可以自动完成②和③的工作?br />
我们介绍的sun自带的入门脚本就是这么做的?br />
3、在客户端机器上自动生成stubc?要点?br />
①客h上必M装有jdk和javaee5
②用wsimport工具服务器传过来的wsdl文g转换成本地的stubc?br />
4、编写客L调用代码Q要?
①导入WebServiceRef?br />
import javax.xml.ws.WebServiceRef;
②导入本地生成的stubc,?br />
import endpoint.HelloService;
import endpoint.Hello;
③指明服务器的wsdl路径
@WebServiceRef(wsdlLocation="http://localhost:8080/myhello/HelloService?WSDL")
④声明一个静态的service对象
static HelloService service;
⑤对要调用的q程Ҏ声明一个代理对象,通过代理来调用真正的q程Ҏ
Hello port = service.getHelloPort();
String ret = port.getHello(System.getProperty("user.name"));
5、编译客L调用E序Q注意classpath参数中要?br />
①stubcȝ路径
②javaee.jar的\?br />
③appserv-ws.jar的\?br />
6、用appclient执行客户端程序,要点?br />
①进入到客户端程序的上目录
②把APPCPATH的D|ؓ当前目录" . "
③appclient的第一个参Cؓ客户端程序名Q?br />
后面的参数是传给客户端程序本w的命o行参数?/p>
/*title: web service入门学习W记Q九Q?br />
**date: 2007/01/19
**author:laomai
**url: http://blog.csdn.net/laomai/
*/
九、本文中用到的文?br />
1、WebTest目文g列表
WebTest\passwd 保存密码的文Ӟ手工建立
WebTest\src 子目?手工建立Q内容ؓ
endpoint\Hello.java 服务器类的实现文?br />
client\Client.java 客户cȝ实现文g
WebTest\build
generated 子目?手工建立Q内容ؓ
HelloService.wsdl 由wsgen命o生成
HelloService_schema1.xsd 由wsgen命o生成
classes 子目?手工建立Q内容ؓ
endpoint\Hello.class 由javac命o生成
endpoint\jaxws子目录,由wsgen命o自动生成Q内容ؓ
GetHello.java
GetHelloResponse.java
GetHello.class
GetHelloResponse.class
stub 子目录,手工建立Q内容ؓ:
client\Client.class 由javac命o生成
endpoint 子目?由wsimport命o自动生成Q内容ؓ:
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子目?手工建立Q内容ؓ
hello.war WEB-INF子目录打包后生成的文Ӟ由jar命o生成
WEB-INF 打包的输入目录,手工建立。内容包括:
web.xml 手工建立
classes\endpoint子目?为build\classes\endpoint的拷?br />
wsdl子目录,由build\generated拯而来
2、生成的HelloService.wsdl文g的内?br />
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<definitions targetNamespace="http://endpoint/" name="HelloService" xmlns="http://endpoint/" xmlns:xsd="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="
<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>
十、致?br />
在学习WebService的过E中Q我得到了csdn java版的叉城朋友的许多指点Q?br />
饼子堂的兄弟们也l了很多有用的资料,q里一q表C意。本文也是我给q些
朋友们的一个汇报和ȝQ呵c?/p>
Q?-end
/*title: web service入门学习W记
**date: 2007/01/23
**author:laomai
**url: http://blog.csdn.net/laomai/*/Q?/p>
转自http://blog.csdn.net/laomai/archive/2007/01/23/1490829.aspx