Java实现的简单的WebService服务发布和Client调用例子

做大作业,要求用到WS,在网上看了看,自己写了一个,很简单的服务发布和Client调用例子。

WebService有很多实现的方式,但是原理基本都是一样的,都是基于SOA的三角模型,所以重点在于理解了SOA,之后使用WS就很清晰了。

 

这是一个调用短信系统发送短信例子,具体的:

服务端:SMSender类中方法sendMessage(String receiver, String msg),返回值类型boolean,用WS发布。

Client:调用服务端的sendMessage方法,实现短信发送。

具体实现见下:

说明:工程环境是MyEclipse8.5下,发布的服务器是Tomcat6.0

分为两个部分,WS的发布和Client调用。

一.WS的发布

步骤如下:

1.New->Web Project,新建WSofSMNS工程,并把服务器设置为Tomcat(具体步骤不详赘述);

2.在包com.smns下编写SMSender类并实现sendMessage(String receiver, String msg)方法,代码如下:


Code
 1 package com.smns;
2
3 public class SMSender {
4 public boolean sendMessage(String receiver, String msg)
5 {
6 System.out.printf("################\nMessage Sent to %s\nContent\n%s\n", new Object[] {
7 receiver, msg
8 });
9 return true;
10 }
11 }


3.需要导入axis相关的jar文件(网上下),具体的文件如下:

activation.jar
axis.jar
axis-ant.jar
commons-discovery-0.2.jar
commons-logging-1.0.4.jar
jaxrpc.jar
log4j-1.2.8.jar
mailapi.jar
saaj.jar

wsdl4j-1.5.1.jar

xml-apis-2.6.2.jar

xmlsec-1.3.0.jar

4.在web.xml中进行axis的相关配置,文件信息如下:

Code
 1 <?xml version="1.0" encoding="ISO-8859-1"?>
2
3 <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web
4 Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
5
6 <web-app>
7 <display-name>Apache-Axis</display-name>
8
9 <listener>
10 <listener-class>org.apache.axis.transport.http.AxisHTTPSessionListener</listener-class>
11 </listener>
12
13 <servlet>
14 <servlet-name>AxisServlet</servlet-name>
15 <display-name>Apache-Axis Servlet</display-name>
16 <servlet-class>
17 org.apache.axis.transport.http.AxisServlet
18 </servlet-class>
19 </servlet>
20
21 <servlet>
22 <servlet-name>AdminServlet</servlet-name>
23 <display-name>Axis Admin Servlet</display-name>
24 <servlet-class>
25 org.apache.axis.transport.http.AdminServlet
26 </servlet-class>
27 <load-on-startup>100</load-on-startup>
28 </servlet>
29
30 <servlet>
31 <servlet-name>SOAPMonitorService</servlet-name>
32 <display-name>SOAPMonitorService</display-name>
33 <servlet-class>
34 org.apache.axis.monitor.SOAPMonitorService
35 </servlet-class>
36 <init-param>
37 <param-name>SOAPMonitorPort</param-name>
38 <param-value>5001</param-value>
39 </init-param>
40 <load-on-startup>100</load-on-startup>
41 </servlet>
42
43 <servlet-mapping>
44 <servlet-name>AxisServlet</servlet-name>
45 <url-pattern>/servlet/AxisServlet</url-pattern>
46 </servlet-mapping>
47
48 <servlet-mapping>
49 <servlet-name>AxisServlet</servlet-name>
50 <url-pattern>*.jws</url-pattern>
51 </servlet-mapping>
52
53 <servlet-mapping>
54 <servlet-name>AxisServlet</servlet-name>
55 <url-pattern>/services/*</url-pattern>
56 </servlet-mapping>
57
58 <servlet-mapping>
59 <servlet-name>SOAPMonitorService</servlet-name>
60 <url-pattern>/SOAPMonitor</url-pattern>
61 </servlet-mapping>
62
63 <!-- uncomment this if you want the admin servlet -->
64 <!--
65 <servlet-mapping>
66 <servlet-name>AdminServlet</servlet-name>
67 <url-pattern>/servlet/AdminServlet</url-pattern>
68 </servlet-mapping>
69 -->
70
71 <session-config>
72 <!-- Default to 5 minute session timeouts -->
73 <session-timeout>5</session-timeout>
74 </session-config>
75
76 <!-- currently the W3C havent settled on a media type for WSDL;
77 http://www.w3.org/TR/2003/WD-wsdl12-20030303/#ietf-draft
78 for now we go with the basic 'it's XML' response -->
79 <mime-mapping>
80 <extension>wsdl</extension>
81 <mime-type>text/xml</mime-type>
82 </mime-mapping>
83
84
85 <mime-mapping>
86 <extension>xsd</extension>
87 <mime-type>text/xml</mime-type>
88 </mime-mapping>
89
90 <welcome-file-list id="WelcomeFileList">
91 <welcome-file>index.jsp</welcome-file>
92 <welcome-file>index.html</welcome-file>
93 <welcome-file>index.jws</welcome-file>
94 </welcome-file-list>
95
96 </web-app>

5.重新发布一次工程到Tomcat,并启动Tomcat;

6.测试默认服务是否已经发布到服务器:

打开浏览器,访问地址http:host:port/WSofSMNS/services,(host为你的主机名,port为你的tomcat端口)如果看到如下界面就说明AXIS部署成功了。

此时只是默认的服务,还没有把我们的SMSender类发布出来,下面来发布

7.创建一个deploy.wsdd文件,用来指明要发布的服务相关信息,文件与web.xml在同级目录,内容如下:

Code
1 <?xml version="1.0" encoding="UTF-8"?>
2 <deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
3 <service name="SMSendService" provider="java:RPC">
4 <parameter name="className" value="com.smns.SMSender"/>
5 <parameter name="allowedMethods" value="*"/>
6 </service>
7 </deployment>

其中,"SMSendService"是为服务定的一个名字,

<parameter name="className" value="com.smns.SMSender"/>指明提供服务的类的路径

8.创建批处理文件deploywebservice.bat用来执行服务的发布,文件位置与deploy.wsdd文件同级目录,内容如下:

java -cp E:\code\lib\activation.jar;E:\code\lib\axis-ant.jar;E:\code\lib\axis.jar;E:\code\lib\commons-discovery-0.2.jar;E:\code\lib\commons-logging-1.0.4.jar;E:\code\lib\jaxrpc.jar;E:\code\lib\log4j-1.2.8.jar;E:\code\lib\mailapi.jar;E:\code\lib\saaj.jar;E:\code\lib\wsdl4j-1.5.1.jar;E:\code\lib\xmlsec-1.4.2.jar;E:\code\lib\xml-apis-2.6.2.jar org.apache.axis.client.AdminClient -lhttp://localhost:8080/WSofSMNS/services/AdminService deploy.wsdd

其中E:\code\lib是存放axis对应的jar文件的文件夹,现在将所有的jar文件都加入到classpath中进行执行。

-l 后的参数是本地要发布WebService的AdminService对应的访问地址。

最后deploy.wsdd是对应的配置文件名称。

9.执行批处理文件deploywebservice.bat,完成发布;

10.重新访问http:host:port/WSofSMNS/services,若看到如下,说明成功:

访问SMSendService(wsdl),可看到代码:

Code
 1 This XML file does not appear to have any style information associated with it. The document tree is shown below.
2 <wsdl:definitions xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://localhost:8080/WSofSMNS/services/SMSendService" xmlns:intf="http://localhost:8080/WSofSMNS/services/SMSendService" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://localhost:8080/WSofSMNS/services/SMSendService">
3 <!--
4 WSDL created by Apache Axis version: 1.4 Built on Apr 22, 2006 (06:55:48 PDT)
5 -->
6 <wsdl:message name="sendMessageResponse">
7 <wsdl:part name="sendMessageReturn" type="xsd:boolean"/>
8 </wsdl:message>
9 <wsdl:message name="sendMessageRequest">
10 <wsdl:part name="receiver" type="soapenc:string"/>
11 <wsdl:part name="msg" type="soapenc:string"/>
12 </wsdl:message>
13 <wsdl:portType name="SMSender">
14 <wsdl:operation name="sendMessage" parameterOrder="receiver msg">
15 <wsdl:input message="impl:sendMessageRequest" name="sendMessageRequest"/>
16 <wsdl:output message="impl:sendMessageResponse" name="sendMessageResponse"/>
17 </wsdl:operation>
18 </wsdl:portType>
19 <wsdl:binding name="SMSendServiceSoapBinding" type="impl:SMSender">
20 <wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
21 <wsdl:operation name="sendMessage">
22 <wsdlsoap:operation soapAction=""/>
23 <wsdl:input name="sendMessageRequest">
24 <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://smns.com" use="encoded"/>
25 </wsdl:input>
26 <wsdl:output name="sendMessageResponse">
27 <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://localhost:8080/WSofSMNS/services/SMSendService" use="encoded"/>
28 </wsdl:output>
29 </wsdl:operation>
30 </wsdl:binding>
31 <wsdl:service name="SMSenderService">
32 <wsdl:port binding="impl:SMSendServiceSoapBinding" name="SMSendService">
33 <wsdlsoap:address location="http://localhost:8080/WSofSMNS/services/SMSendService"/>
34 </wsdl:port>
35 </wsdl:service>
36 </wsdl:definitions>

 

wsdl中可以看到关于类,方法的详细描述。(这里的wsdl是自动生成的,也可以自己编写,但是比较烦)

至此,服务的发布完成了。

 

二.Client调用

调用很简单,只需要在一个普通的Java工程中编写调用类即可,工程同样需要导入和上述一中的第3步相同的包,具体的类代码如下:

Code
 1 package wstest;
2
3 import java.io.IOException;
4 import java.net.MalformedURLException;
5
6 import javax.xml.namespace.QName;
7 import javax.xml.rpc.ServiceException;
8
9 import org.apache.axis.client.Call;
10 import org.apache.axis.client.Service;
11 import org.apache.commons.logging.Log;
12 import org.apache.commons.logging.LogFactory;
13
14 public class InvokeSender {
15
16 private Log log = LogFactory.getLog(InvokeSender.class);
17 private String SendSM_ENDPOINT = "http://localhost:8080/WSofSMNS/services/SMSendService?wsdl";
18
19 public boolean sendSM(String receiver,String msg){
20 boolean result=false;
21
22 try {
23 Service service = new Service();
24 Call call = (Call) service.createCall();
25 call.setTargetEndpointAddress(new java.net.URL(
26 SendSM_ENDPOINT));
27 call.setOperationName(new QName("http://localhost/",
28 "sendMessage"));
29 call.addParameter("receiver", org.apache.axis.Constants.XSD_STRING,
30 javax.xml.rpc.ParameterMode.IN);
31 call.addParameter("msg", org.apache.axis.Constants.XSD_STRING,
32 javax.xml.rpc.ParameterMode.IN);
33 call.setReturnType(org.apache.axis.Constants.XSD_BOOLEAN);
34 try {
35 result=(Boolean) call.invoke(new Object[] {receiver,msg});
36
37 } catch (IOException e) {
38 e.printStackTrace();
39 }
40 } catch (MalformedURLException e) {
41 e.printStackTrace();
42 } catch (ServiceException e) {
43 e.printStackTrace();
44 }
45 //log.error("call SMSenderService error!");
46
47 return result;
48 }
49 }

 

调用的是"sendMessage"方法,两个参数:"receiver"和"msg",传参实现调用:call.invoke(new Object[] {receiver,msg});

经main函数试验,调用成功。

至此,完成。

原理就是这样了,更大规模的WS只是再进一步扩展。

posted @ 2011-11-29 00:43  liyancode  阅读(2017)  评论(0编辑  收藏  举报