本文主要是介绍Web Service之AXIS定制发布,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
新建一个服务端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 –l http://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的对象都调用这个对象。优点开销最小,缺点就是个性化不能满足。
针对相关的服务设置对应的请求范围。
这篇关于Web Service之AXIS定制发布的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!