WebServices是作为一种服务提供给需要的人使用的技术。当一种服务希望可以供更多的人来使用时,比如气象局收集到的天气预报的数据,很多的网址或者是客户端希望可以得到这部分的数据,这样就可以在自己的网站或者客户端产品中提供用户所需要的天气预报信息。所以从这里我们知道:我们需要一个服务端,就是收集或提供这些数据的来源,然后,就我们自己的产品,相对WebServices服务,叫客户端。这样我们的客户端产品就可以通过WebServices服务端提供的接口,将这部分数据导入到我们自己的网站中。
所用的技术包括:xml,soap,java等
首先:搭建webServices的服务端
这里使用apache旗下的axis来提供这种服务
整个项目要用到的jar包(12):
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_1_3_1.jar,
saaj.jar,
wsdl4j-1.5.1.jar,
xml-apis-2.6.2.jar,
xmlsec-1.4.2.jar
需要创建一个ws的部署工程,目录结构如下:
ws
- WEB-INF
-class
-lib(就包含了上面的12个jar包)
-web.xml
-server-config.wsdd(提供自己的service,)
具体的web.xml内容
<?xml version="1.0"encoding="UTF-8"?>
<web-appxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID"version="2.5">
<display-name>Apache-Axis</display-name>
<listener>
<listener-class>org.apache.axis.transport.http.AxisHTTPSessionListener</listener-class>
</listener>
<servlet>
<servlet-name>AxisServlet</servlet-name>
<servlet-class>org.apache.axis.transport.http.AxisServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>AdminServlet</servlet-name>
<servlet-class>org.apache.axis.transport.http.AdminServlet</servlet-class>
<load-on-startup>100</load-on-startup>
</servlet>
<servlet>
<servlet-name>SOAPMonitorService</servlet-name>
<servlet-class>org.apache.axis.monitor.SOAPMonitorService</servlet-class>
<init-param>
<param-name>SOAPMonitorPort</param-name>
<param-value>5001</param-value>
</init-param>
<load-on-startup>100</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>/servlet/AxisServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>*.jws</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>SOAPMonitorService</servlet-name>
<url-pattern>/SOAPMonitor</url-pattern>
</servlet-mapping>
<!--uncomment this if you want the admin servlet --> <!-- <servlet-mapping><servlet-name>AdminServlet</servlet-name><url-pattern>/servlet/AdminServlet</url-pattern>
</servlet-mapping>-->
<session-config>
<!--Default to 5 minute session timeouts -->
<session-timeout>5</session-timeout>
</session-config>
<!--currently the W3C havent settled on a media type for WSDL;
http://www.w3.org/TR/2003/WD-wsdl12-20030303/#ietf-draftfor now we go with the basic 'it's XML' response
-->
<mime-mapping>
<extension>wsdl</extension>
<mime-type>text/xml</mime-type>
</mime-mapping>
<mime-mapping>
<extension>xsd</extension>
<mime-type>text/xml</mime-type>
</mime-mapping>
<welcome-file-listid="WelcomeFileList">
<welcome-file>index.jsp</welcome-file>
<welcome-file>index.html</welcome-file>
<welcome-file>index.jws</welcome-file>
</welcome-file-list>
</web-app>
把ws放到tomcat的webapps目录中,启动tomcat,在浏览器地址栏中输入:http://localhost:8080/ws/services,如果在浏览器左上角显示
说明axis部署的webservices服务已经成功了。
然后,创建我们自己的service服务。
HelloService.java
/**
* <br>
* do what youwant to do and never stop it.
* <br>
*/
package com.web.webservice;
/**
* @author Jack
* 2013-3-21
* <br>
*/
public class HelloService {
publicString sayHello() {
return"Hello";
}
publicString sayHellotoPerson(String name) {
if(name== null || "".equals(name)){
name= "nobody";
}
return"Hello " + name;
}
}
编译java文件生成class文件,再把整个完整的目录放到tomcat目录下上面的那个class文件夹中(目录:class/com/web/webservice/HelloService.class)。
追加文件server-config.wsdd
<?xmlversion="1.0" encoding="UTF-8"?>
<deploymentxmlns="http://xml.apache.org/axis/wsdd/"xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<globalConfiguration>
<parametername="sendMultiRefs" value="true"/>
<parametername="disablePrettyXML" value="true"/>
<parametername="dotNetSoapEncFix" value="true"/>
<parametername="enableNamespacePrefixOptimization"value="false"/>
<parametername="sendXMLDeclaration" value="true"/>
<parametername="sendXsiTypes" value="true"/>
<parametername="attachments.implementation" value="org.apache.axis.attachments.AttachmentsImpl"/>
</globalConfiguration>
<handlertype="java:org.apache.axis.handlers.http.URLMapper"name="URLMapper"/>
<servicename="HelloServices.jws" provider="java:RPC">
<parametername="className"value="com.web.webservice.HelloService"/>
<parameter name="scope" value="request"/>
<parameter name="allowedMethods"value="*"/>
<messageReceiverclass="org.apache.axis2.receivers.RawXMLINOutMessageReceiver"/>
</service>
<transportname="http">
<requestFlow>
<handler type="URLMapper"/>
</requestFlow>
</transport>
</deployment>
重启tomcat,地址栏输入:http://localhost:8080/ws/services显示如下:
这样webservices服务端就算是部署好了, 点击wsdl的超链接,导航到:
http://localhost:8080/ws/services/HelloServices.jws?wsdl,这就是webservices的调用接口了。
最后就很简单了,就是创建客户端来调用webservices的接口,就可以了。
WebServicesClient.java
/**
* <br>
* do what youwant to do and never stop it.
* <br>
*/
package com.web.webservice;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.axis.client.Service;
import org.apache.axis.client.Call;
import javax.xml.namespace.QName;
import javax.xml.rpc.ServiceException;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
/**
* @author Jack2013-3-22 <br>
*/
public class WebServiceClient {
privatestatic final Log log = LogFactory.getLog(WebServiceClient.class);
privatestatic final String HELLO_SERVICE_ENDPOINT ="http://localhost:8080/ws/services/HelloServices.jws?wsdl";
/**
* @param args
* @throws ServiceException
*/
publicstatic void main(String[] args) {
WebServiceClientclient = new WebServiceClient();
//client.callSayHello();
client.callSayHelloToPerson();
}
publicvoid callSayHello() {
try{
Serviceservice = new Service();
Callcall = (Call) service.createCall();
call.setTargetEndpointAddress(newURL(HELLO_SERVICE_ENDPOINT));
call.setOperationName("sayHello");//newQName("http://webservice.sinosoft.com/",
call.setReturnType(org.apache.axis.Constants.XSD_STRING);
try{
String ret =(String) call.invoke(new Object[] {});
System.out.println("Thereturn value is:" + ret);
return;
}catch (IOException ioe) {
ioe.printStackTrace();
}
}catch (MalformedURLException e) {
e.printStackTrace();
}catch (ServiceException e) {
e.printStackTrace();
}
log.error("callsayHello service error!");
}
publicvoid callSayHelloToPerson() {
try{
Serviceservice = new Service();
Callcall = (Call) service.createCall();
call.setTargetEndpointAddress(newjava.net.URL(
HELLO_SERVICE_ENDPOINT));
call.setOperationName(newQName("http://webservice.sinosoft.com/",
"sayHellotoPerson"));
call.addParameter("name",org.apache.axis.Constants.XSD_STRING,
javax.xml.rpc.ParameterMode.IN);
call.setReturnType(org.apache.axis.Constants.XSD_STRING);
try{
Stringret = (String) call.invoke(new Object[] { "Jack" });
System.out.println("Thereturn value is:" + ret);
return;
}catch (IOException e) {
e.printStackTrace();
}
}catch (MalformedURLException e) {
e.printStackTrace();
}catch (ServiceException e) {
e.printStackTrace();
}
log.error("callsayHello service error!");
}
}
直接运行这个文件就可以显示相对应的功能了。