Web Service之AXIS定制发布

来源:互联网 发布:java ssh项目 编辑:程序博客网 时间:2024/04/27 03:45

新建一个服务端java项目,在里面先写一个服务端的java代码(HelloWSDD.java),代码如下:

 

publicclassHelloWSDD {

   //定制提供web服务的方法

   privateintrequestCount = 0 ;

   public String hello(Stringname){

     requestCount++ ;

     System.out.println("调用的次数"+requestCount);

     return"欢迎你 " + name ;

   }

   public Float add(Float a,Floatb){

     requestCount++ ;

     System.out.println("调用的次数"+requestCount);

     return a + b ;

   }

}

 

保存这个文件,如果myeclipse已经设置为自动编译的话,就直接到项目里面找出编译出的HelloWSDD.Class文件,如果不是自动编译,编译后再找这个文件。把这个文件(包含包的结构,比如我的包是com. webservice.wsdd,就直接把com包复制出来)复制到tomcat里面的axis目录中的\WEB-INF\classes。既然class文件可以,那么生成的jar包也不会有什么问题了。

 

编写一个个人的*.wsdd文件,描述一个web服务,在官网上下的axis里面有samples文件夹,里面有例子,不过我这个没有。

那么就编写一个叫HelloWSDD.wsdd的文件,里面的代码如下:

 

<deployment name="test"xmlns="http://xml.apache.org/axis/wsdd"

       xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">

 

 

       <servicename="urn:cominfo" provider="java:RPC">

              <parametername="className" value="指明需要发布的类绝对位置" />

              <parametername="allowedMethods" value="方法名" />

       </service>

 

</depoyment>

 

把这个文件放到tomcat里面的axis文件夹里面的的web-inf文件夹里面。再运用命令行的方式会自动生成server-config.wsdd文件,不过这种方法有点麻烦,不如直接编写server-config.wsdd,具体代码如下:


<?xml version="1.0"encoding="UTF-8"?>

<deployment name="test"xmlns="http://xml.apache.org/axis/wsdd"

       xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">

      

       <globalConfiguration>

              <parametername="adminPassword" value="admin" />

              <parametername="attachments.implementation"value="org.apache.axis.attachments.AttachmentsImpl" />

              <parametername="sendXsiTypes" value="true" />

              <parametername="sendMultiRefs" value="true" />

              <parametername="sendXMLDeclaration" value="true" />

              <parametername="axis.sendMinimizedElements" value="true" />

 

              <requestFlow>

                     <handlertype="java:org.apache.axis.handlers.JWSHandler">

                            <parametername="scope" value="request" />

                            <parametername="extension" value=".jwr" />

                     </handler>

              </requestFlow>

       </globalConfiguration>

       <handlername="LocalResponder"type="java:org.apache.axis.transport.local.LocalResponder" />

       <handlername="URLMapper"type="java:org.apache.axis.handlers.http.URLMapper" />

       <handlername="Authenticate" type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/>

 

       <servicename="HelloWSDD" provider="java:RPC">

              <parametername="className" value="com.webservice.wsdd.HelloWSDD"/>

              <parametername="allowedMethods" value="*" />

       </service>

 

       <transportname="http">

              <requestFlow>

                     <handlertype="URLMapper" />

                     <handlertype="java:org.apache.axis.handler.http.HTTPAuthHandler" />

              </requestFlow>

       </transport>

       <transportname="local">

              <requestFlow>

                     <handlertype="LocalResponder" />

              </requestFlow>

       </transport>

 

</deployment>

 

上面的文件是完全抄视频的,一个个字母地敲,累死人了。敲完,运行tomcat,报错!仔细又核对,发现两处小错误,又运行,还是不行!说什么deployment写错了,推荐的写法是deployment,这不是完全一样的吗?!真是郁闷。搞了半天,都不行,只好不按视频的教法来做。把HelloWSDD.wsdd放到了WEB-INF目录中,这个文件是这样编写的:

<deployment xmlns=http://xml.apache.org/axis/wsddxmlns:java="http://xml.apache.org/axis/wsdd/providers/java">     

       <servicename="HelloWSDD" provider="java:RPC" style="rpc"use="encoded">

              <parametername="wsdlTargetNamespace"value="http://wsdd.webservice.com" />

              <parametername="className" value="com.webservice.wsdd.HelloWSDD"/>

              <parametername="scope" value="Application" />

              <parametername="allowedMethods" value="*" />

       </service>

</deployment>

开启CMD,进入WEB-INF这个目录,运行以下命令:

Java -Djava.ext.dirs=liborg.apache.axis.client.AdminClient –lhttp://localhost:8089/axis/servlet/AxisServletHelloWSDD.wsdd

出现了如下错误:

查了资料,说axis的环境变量没有配好!没办法,配呗!

AXIS_HOME:

C:\tomcat7.0\webapps\axis\WEB-INF\lib

AXISCLASSPATH:

.;%AXIS_HOME%\activation.jar;%AXIS_HOME%\axis.jar;%AXIS_HOME%\axis-schema.jar;%AXIS_HOME%\axis-ant.jar;%AXIS_HOME%\commons-discovery-0.2.jar;%AXIS_HOME%\commons-logging-1.0.4.jar;%AXIS_HOME%\jaxrpc.jar;%AXIS_HOME%\log4j-1.2.8.jar;%AXIS_HOME%\mail.jar;%AXIS_HOME%\saaj.jar;%AXIS_HOME%\wsdl4j-1.5.1.jar;%AXIS_HOME%\xmlsec.jar

在classpath后面添加

% AXISCLASSPATH %

重启tomcat,又是输入命令。还是不行!

再查资料,又有人说WEB-INF里面又有一个现成的server-config.wsdd。又去下载一个。重启tomcat居然不报错,很好。接着重复刚才的操作,还是不行,跳出一样的错误信息!再查资料,又有人说tomcat端口号要设为默认的8080。好和axis默认配置对应才行,所以把tomcat端口号改回8080,再试,还是不行啊!真是没法了!最后回归按视频的操作,在server-config.wsdd里面修改service的属性。重启tomcat,没有报错,在浏览器里面输入:http://localhost:8089/axis/servlet/AxisServlet  终于跳出了理想的效果:

搞这个东西居然花费了大约四个钟头!真是折磨人啊!自己手贱,把axis的环境变量配置全部删除了,不过也没有出现错误。看来问题的根源还是视频的server-config.wsdd代码有不正确的地方。

 

正确的server-config.wsdd代码:

<?xml version="1.0"encoding="UTF-8"?>

<deploymentxmlns="http://xml.apache.org/axis/wsdd/"

           xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">

<globalConfiguration>

 <parameter name="adminPassword"value="admin"/>

 <parameter name="attachments.Directory"value="./attachments"/>

 <parameter name="attachments.implementation"value="org.apache.axis.attachments.AttachmentsImpl"/>

 <parameter name="sendXsiTypes" value="true"/>

 <parameter name="sendMultiRefs" value="true"/>

 <parameter name="sendXMLDeclaration"value="true"/>

 <parameter name="axis.sendMinimizedElements"value="true"/>

 <requestFlow>

       <handlertype="java:org.apache.axis.handlers.JWSHandler">

   <parameter name="scope" value="session"/>

  </handler>

  <handlertype="java:org.apache.axis.handlers.JWSHandler">

   <parameter name="scope" value="request"/>

   <parameter name="extension" value=".jwr"/>

  </handler>

 </requestFlow>

 </globalConfiguration>

 <handler name="LocalResponder"

         type="java:org.apache.axis.transport.local.LocalResponder"/>

 <handler name="URLMapper"

         type="java:org.apache.axis.handlers.http.URLMapper"/>

 <handler name="Authenticate"

         type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/>

 

 <service name="HelloWSDD"provider="java:RPC">

              <parametername="className" value="com.webservice.wsdd.HelloWSDD"/>

              <parametername="allowedMethods" value="*" />

       </service>

 

<transport name="http">

 <requestFlow>

  <handler type="URLMapper"/>

  <handlertype="java:org.apache.axis.handlers.http.HTTPAuthHandler"/>

 </requestFlow>

 </transport>

 <transport name="local">

 <responseFlow>

  <handler type="LocalResponder"/>

 </responseFlow>

 </transport>

</deployment>

 

 

回到客户端的那个项目,在里面编写调用的代码。文件名为:TestClient.java

代码如下:

 

import javax.xml.namespace.QName;

 

import org.apache.axis.client.Call;

import org.apache.axis.client.Service;

 

publicclassTestClient {

 

   publicstaticvoid main(String[] args) throws Exception {

     //指定获取web服务的位置

     Stringurl ="http://localhost:8089/axis/services/HelloWSDD" ;

     //区别于jws方式的指定:http://localhost:8089/axis/Hello.jws

      Service service =new Service() ;

     Callcall = (Call) service.createCall() ;

     call.setTargetEndpointAddress(new java.net.URL(url)) ;

     call.setOperationName(new QName(url,"add")) ;

     FloatreturnValue = (Float) call.invoke(new Object[]{newFloat(3.2),newFloat(4.5)}) ;

     System.out.println(returnValue);

   }

}

 

运行,控制台出现了结果:7.7

再看tomcat的控制台,服务器这边出现了:“调用的次数1”的字样!再运行客户端这边的程序,还是出现同样的字样,可见是重新调用服务器这边的服务了。如果要改变这种现象,就要修改服务端这边的配置信息。

 

接下来编写取消的服务:*.wsdd

只要把元素deployment改为undeployment就行了。

<undeployment xmlns="http://xml.apache.org/axis/wsdd/"

xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">

       <servicename=”要取消的服务名”>

</ undeployment >

以后取消服务其实也不用这么麻烦,直接删除或者注销服务就行了。

 

Web Service Object的生存范围

<parameter name=”scope”value=”request/session/application” />

request :Axis为每一个SOAP的请求产生服务对象——针对于请求,缺点开销大

session:Axis为每一个调用WebService的客户端产生服务对象——针对会话

application:Axis在服务器的内存中直接new一个服务对象,然后所有的web的对象都调用这个对象。优点开销最小,缺点就是个性化不能满足。

 

针对相关的服务设置对应的请求范围。


原创粉丝点击