12、webservice-AXIS-1.4_demo1

<转>http://blog.csdn.net/angus_17/article/details/8032856
让我们来看一种需求,集团公司可能具有多种WEB应用。比如,前年开发了个进销存系统、去年开发了一个ERP、今年又开发了一个OA。现在这家集团公司需要将这三个系统整合,难道需要重新编码将它们整合吗?而这三个系统又是用不同语言编写的,这种成本对公司来说无疑是一种浪费。WebService可以很好的解决这种需求。

WebService像是一条线将这些系统穿起来——企业服务总线(ESB),什么是整合?当然是功能和数据的整合,也就是一个系统可以调用另一个系统的WebService接口来完成数据的交互。这样我们就需要知道,提供WebService服务功能的应用公开了哪些接口,我们可以通过WebService描述文档(WSDL)得知。WSDL不需要我们手动编写,Java的WebService实现可以为我们自动生成。JDK1.6新增支持WebService,但还不够成熟。所以我们使用Apache第三方开源组织提供的WebService实现——Axis。
下面开始编写服务端代码:
1.在MyEclipse中,建立一个WebProject。命名为WebService.
2.下载axis1.4的包,解压,里面有一些关于axis的资料和文件。
将webapps里面的,WEB-INF中的web.xml复制,替换到自己的WebService项目中。
如果你没有,可以将下如代码拷贝到你的web.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>
添加jar包:


部署启动 url:http://localhost:8080/WebService/services

表示环境搭建工作已经完成了。可以进入真正的开发了。

用wsdd方法首先需要定制我们的wsdd xml文件,这里命名为deploy.wsdd,创建在当前web工程的WEB-INF目录下,代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<deployment xmlns="http://xml.apache.org/axis/wsdd/"  xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">    
<service name="HelloServices" provider="java:RPC">        
<parameter name="className" value="HelloService"/>         
<parameter name="allowedMethods" value="*"/>  
 <parameter name="scope" value="request" />   
</service> 
</deployment>

service标签代表一个WebService服务,HelloWorldWSDD就是当前WebService的名称;provider是java的WebService类型,分别有: RPC、Document、Wrapped、Message、EJB、RMI;有兴趣的可以看看org.apache.axis.providers.java包下面的WebService的实现类或是文档;

className代表当前WebService的class类路径;
allowedMethods代表暴露的方法,那些方法在客户端可以调用;
<parameter name="scope" value="request" />
这个是当前WebService的作用域,它有3个值,分别是:request、session、application。
request代表为每个WebService SOAP的请求都产生一个服务对象,和Spring的scope很像,在服务请求频繁的话会消耗很多资源。
session 是给每个调用当前WebService的客户端创建一个服务对象
application 是个当前所有的请求创建一个服务对象

写完配置后,就需要用axis提供的AdminClient工具类来发布到WebService,直到生成server-config.wsdd,步骤如下:运行cmd命令,然后进入当前工程发布的目录,即%tomcat_home%/webapps/project/WEB-INF>

我的是:D:\program files (x86)\apache-tomcat-7.0.59-windows-x64\apache-tomcat-7.0.59\webapps\WebService\WEB-INF

然后输入命令:java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient deploy.wsdd

这里的deploy.wsdd是我们刚才定制的wsdd文件,java当然是jvm的命令,-Djava.ext.dirs=lib设置当前命令的依赖包,AdminClient是axis提供的工具类,这个类本来是可以在官方的工程中admin可以直接运行的(这里不可以,下载下来的少了AdminServlet,有兴趣的可以研究下,就是前面说的官方的示例);

如果运行命令后,看到:
Processing file deploy.wsdd
<Admin>Done processing</Admin>
但是:
D:\program files (x86)\apache-tomcat-7.0.59-windows-x64\apache-tomcat-7.0.59\web
apps\WebService\WEB-INF>java -Djava.ext.dirs=lib org.apache.axis.client.AdminCli
ent deploy.wsdd
Processing file deploy.wsdd
Exception: AxisFault
 faultCode: {http://xml.apache.org/axis/}HTTP
 faultSubcode:
 faultString: (404)Not Found
 faultActor:
 faultNode:
 faultDetail:
        {}:return code:  404

看看deploy.wsdd同级目录有没有生成server-config.wsdd如果有这个文件就成功了,没有就失败了。如果失败了就换命令行代码如下:
D:\program files (x86)\apache-tomcat-7.0.59-windows-x64\apache-tomcat-7.0.59\web
apps\WebService\WEB-INF>java -Djava.ext.dirs=lib org.apache.axis.client.AdminCli
ent -lhttp://localhost:8080/WebService/services/AdminService deploy.wsdd
Processing file deploy.wsdd
<Admin>Done processing</Admin>

因为你的端口可能被axis占用了,我们将指定AdminService来完成转换,运行上面命令就没有问题了。

再在浏览器中输入http://10.64.59.12:8080/WebService/services时,看到


则HelloServices就被成功发布了。


其他程序来访问真个HelloService:

import java.io.IOException;
import java.net.MalformedURLException;
import javax.xml.namespace.QName;
import javax.xml.rpc.ServiceException;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;


public class Test_Webservice {
private static final Log log = LogFactory.getLog(Test_Webservice.class);
private static final String HELLO_SERVICE_ENDPOINT = "http://localhost:8080/WebService/services/HelloServices?wsdl";

/**
* 调用sayHello方法
*/
public void callSayHello() {
try {
Service service = new Service();
Call call = (Call) service.createCall();
//传递url
call.setTargetEndpointAddress(new java.net.URL(HELLO_SERVICE_ENDPOINT));
//调用方法名字
call.setOperationName(new QName("http://webservice.sinosoft.com/","sayHello"));
call.setReturnType(org.apache.axis.Constants.XSD_STRING);
try {
//ret即执行方法之后得到的返回值,此处不用传参,故不用写字符串
String ret = (String) call.invoke(new Object[] {});
System.out.println("The return value is:" + ret);
return;
}
catch (IOException e) {
e.printStackTrace();
}
}
catch (MalformedURLException e) {
e.printStackTrace();
}
catch (ServiceException e) {
e.printStackTrace();
}
log.error("call sayHello service error!");
}

/**
* 调用sayHelloToPerson方法
*/
public void callSayHelloToPerson() {
try {
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress(new java.net.URL(HELLO_SERVICE_ENDPOINT));
call.setOperationName(new QName("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 {
//ret即执行方法之后得到的返回值,此处传了一个字符串做为参数,如果不写空,会报错
String ret = (String) call.invoke(new Object[] {"Seven"});
System.out.println("The return value is:" + ret);
return;
} catch (IOException e) {
e.printStackTrace();
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (ServiceException e) {
e.printStackTrace();
}
log.error("call sayHello service error!");
}

/**
* 调用两个方法
* @param args
*/
public static void main(String[] args) {
Test_Webservice tester = new Test_Webservice();
tester.callSayHello();
tester.callSayHelloToPerson();
}
}

print:
The return value is:hello
The return value is:hello Seven

猜你喜欢

转载自onway417.iteye.com/blog/2190306
今日推荐