您的位置:首页 > 编程语言 > Java开发

java调用webservice axis

2010-02-23 11:14 363 查看
webservice,先让我们来理解一下这个名词。简单点说调用其他网站的资源的一种方法。所以,通俗地说,Web service(Web服务)就是让你的网站可以使用其他网站的资源,比如在网页上显示天气、地图、twitter上的最新动态等等。

本地服务与web服务

本地服务,显然和web服务相对应,完成一项任务,若不需要调用其他网站上得资源,都靠本地资源来完成,我们就把这个称为"本地服务",打个比方,我肚子饿了,我可以自己做饭(本地),也可以打电话订一份快餐(web)来填饱肚子。

为什么要用webservice?

首先本地服务有一定的缺陷:资源不足,Internet最大的优势就是资源共享;成本因素,包括硬件和人员;可移植性不好;

其次,webservice有相当的优势:平台无关,无论什么平台都可以用web服务;与编程语言无关,只要遵守相关协议,就可以使用任何编程语言,向其他网站申请web服务等等之类的优势。

下面我们开始发布一个web服务

发布webservice有两种方式:即时发布和定制发布,定制发布比即时发布稍显复杂,但是也更加灵活,所以我用都是采用定制发布方式。Axis是Apache的一个开源web service引擎。它目前最为成熟的开源web service引擎之一。我们这里介绍利用Axis来发布一个web服务。

1)首先我们要准备以下jar包:axis.jar、commons-logging-1.1.jar、commons-discovery-0.2.jar、jaxrpc.jar、saaj.jar、wsdl4j-1.5.1.jar,activation.jar、mail.jar这些jar包大家都可以到这个网站上去下载 http://www.findjar.com/index.x 输入你想要得jar包,即可搜索到,下载。

2)编写服务端程序server:eg
package p1;

public class Hello {
public String SayHello(String name)
{
return "hello"+name;
}

}


3)编写deploy.wsdd文件:eg

<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<service name="Hello" provider="java:RPC">
<parameter name="className" value="p1.Hello"/>
<parameter name="allowedMethods" value="*"/>
</service>
</deployment>


4)发布服务

编辑一个deploy.bat文件(我是放在与web-inf同一目录下):内容如下:

set Axis_Lib=D:/Workspace03/releaseByAxis/WEB-INF/lib

set Java_Cmd=java -Djava.ext.dirs=%Axis_Lib%

set Axis_Servlet=http://localhost:8080/releaseByAxis/servlet/AxisServlet

%Java_Cmd% org.apache.axis.client.AdminClient -l%Axis_Servlet% deploy.wsdd

这样的话,可能有些人会出现无法找到类之类得异常,原因就是没有在classpath中加载需要得jar包。所以如果出现此错误,需要在上面内容中加上set classPath=……目录.jar

如果出现:

Processing file deploy.wsdd
<Admin>Done processing</Admin>

那么恭喜你,你已经成功发布一个服务了。同时在同级目录下会产生一个server-config.wsdd文件,这里给出了我们发布的service的具体信息。

当然也会出现问题,比如我在测试得时候,在这一步骤就会出现:

Exception: AxisFault
faultCode: {http://xml.apache.org/axis/}HTTP
faultSubcode:
faultString: (404)/axis/servlet/AxisServlet
faultActor:
faultNode:
faultDetail:
{}:return code: 404

错误,那是因为我还没有配置好web.xml,所以如果出现这个问题,那么我们就需要将官方的web.xml文件拷贝到web-inf下。官方xml内容:

<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web
Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
<display-name>Apache-Axis</display-name>

<listener>
<listener-class>org.apache.axis.transport.http.AxisHTTPSessionListener</listener-class>
</listener>

<servlet>
<servlet-name>AxisServlet</servlet-name>
<display-name>Apache-Axis Servlet</display-name>
<servlet-class>
org.apache.axis.transport.http.AxisServlet
</servlet-class>
</servlet>

<servlet>
<servlet-name>AdminServlet</servlet-name>
<display-name>Axis Admin Servlet</display-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>
<display-name>SOAPMonitorService</display-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-draft for 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-list id="WelcomeFileList">
<welcome-file>index.jsp</welcome-file>
<welcome-file>index.html</welcome-file>
<welcome-file>index.jws</welcome-file>
</welcome-file-list>

</web-app>


这样我们就可以在浏览器中访问我们发布得服务了,http://localhost:8080/releaseByAxis/servlet/AxisServlet

二、编写客户端,访问web服务

1)在浏览器端访问服务器端的服务,那么可以下载到其webservice,通过axis相关工具,可以自动从wsdl文件中生成webservice客户端代码。

set classpath=……jar
set Axis_Lib=D:/Workspace03/releaseByAxis/WEB-INF/lib
set Java_Cmd=java -Djava.ext.dirs=%Axis_Lib%
set Output_Path=D:/Workspace03/releaseByAxis/src
set Package=p1.SayHello
%Java_Cmd% org.apache.axis.wsdl.WSDL2Java -o%Output_Path% -p%Package% SayHello.wsdl
执行完该批处理后,即可生成client stub,生成的列表包括Hello.java,HelloService.java,HelloServiceLocator.java,HelloSoapBindingStub.java。

也可以不用下载,直接转换,eg:这是一个天气预报得服务
Java -classpath E:……jar org.apache.axis.wsdl.WSDL2Java http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?WSDL 得到这些列表后,接下来便是相当于在本机中进行方法调用,贴上一段代码:

2)
public static void main(String[] args) {
HelloService hs=new HelloServiceLocator();
try {
HelloSoapBindingStub hsbs=(HelloSoapBindingStub)hs.getHello();
System.out.println(hsbs.sayHello("xhf"));
} catch (ServiceException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}


至此,一套完整的流程就结束了。共同学习!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息