本文例子代码来源于网上,感谢代码作者!
<一>引入库以及添加环境变量
对于有时只需要将库导入工程,有时又需要将库加入环境变量Classpath中,感到很迷惑,为什么有的只引入工程就可以,有的就需要加入环境变量?
学习过程中稍微理解了一些:
1、当引入jar包到某个工程后,引入的库也只是在这个工程有效
2、将库的路径加入环境变量,这样就成了系统变量,当某些程序需要找寻库文件(例如include <>只去系统目录查找 ,而双引号“”则会先去当前目录找,找不到再去系统目录),如果为这个库设置了环境变量,则可以直接引用,就类似于系统库
库加入环境变量后可以直接在DOS调用
<二>axis开发webservice
只选择了前面2种方法来操作
DII方式
1、编写一个类,例如
public class SayHello{
public String say(String name){
return " Hello ~~" + name;
}
}
然后将这个类保存成SayHello.JWS,然后放到tomcat的webapps的axis,然后运行tomcat,访问http://localhost:8080/axis/SayHello.jws,这个站点就是服务器端的webservice
2、编写客户端访问它
访问客户端webservice也可以有2种创建方式
(1)创建一个Java Project,并在src创建一个类,取名ToClient.java
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
public class ToClient {
public static void main(String args[]) throws Exception {
String urlname = "http://localhost:8080/axis/SayHello.jws";
//这是wsdl的绝对路径.也可以直接写成如下 ,这个没有区别.
Service s = new Service();
Call call = (Call)s.createCall();
call.setOperationName("say");//注意。这里是要调用的方法名
call.setTargetEndpointAddress(urlname);//设置调用的目标url
String val = (String)call.invoke(new Object[]{"我是Blue’s Boy!"}); //设置调用方法中的参数
System.out.println("这是webservice服务器返回给你的:>>>>"+val);
}
}
然后引入库,右键工程build path->add externel archives->然后找到axis下lib内的库
右键工程run as->java application,双击它,Main class里选择Toclient,然后运行就可以看到返回结果
(2)创建一个文本文件,将代码写入,保存成ToClient.java,放到任意目录,比如c盘,然后运行cmd,然后到保存ToClient.java的目录,
然后javac ToClient.java编译成类文件ToClient.class,然后执行java ToClient (如果需要端口-p8080),然后就可以看到返回的结果了
Stubs方式
1、创建一个web Project,然后将axis的lib复制到工程的lib以及web.xml覆盖工程的web.xml
2、写一个简单的服务器类
public class SayHello {
public String say(String name){
return " Hello ~~" + name;
}
}
3、新建一个deploy.wsdd文件,内容为
<deployment xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<service name="stubs" provider="java:RPC">
<parameter name="className" value="SayHello"/>
<parameter name="allowedMethods" value="*"/>
</service>
</deployment>
注:deploy.wsdd中的service name="stubs"可以换成自己想要的名字,server-config.wsdd这个文件内包含的就是webservice上看到的这些服务,所以如果想去掉某个服务,只要去掉server-config.wsdd中的对应的<service></service>就可以
4、然后将这个工程发布到tomcat的webapps下,操作步骤:右键工程->myeclipse->add and remove project deployment->add,然后选择之前配置好的tomcat,然后点ok,工程就发布到了tomcat的webapps下
5、进入cmd,然后进入到tomcat的webapps下的刚新发布的工程文件下的web-inf文件,然后输入
java org.apache.axis.client.AdminClient -l http://localhost:8080/axis_example/services/stubs deploy.wsdd
调用AdminClient这个类将deploy.wsdd的service服务stubs发布到http://localhost:8080/axis_example/services站点
并创建更新axis站点的默认发布文件service-config.wsdd,这个service-config.wsdd就是webservice服务默认读取的发布文件
6.webservice站点服务就发布完成,读取流程为
tomcat是一个jsp/servlet容器,创建web工程,都会有web.xml.此时web.xml只是最基础的web站点配置,将axis的lib以及web.xml拷贝到工程,就相当于引入了axis框架,(添加struts框架也是这样,就是引入struts相关的库以及配置web.xml),这个站点一运行就读取web.xml以及引用需要的库,读取配置创建axis的Servlet,它引用的servlet类是org.apache.axis.transport.http.AxisServlet,设置拦截的类型,当客户访问http://localhost:8080/axis_sample/services,跟struts的.do一样,axis只要访问是/services,*.jws,/servlet/AxisServlet,则Servelet就会拦截下来进行处理,读取service-config.wsdd配置,显示发布的服务的wsdl
当客户端访问wsdl文件时,知道是以什么协议,什么类型的方法以及参数进行调用,然后就发送合适的soap请求,由axisServlet处理后返回soap消息,客户端根据wsdl来解析
soap是simple object access protocol简单对象访问协议,客户需要这个soap协议来调用公共服务
wsdl是web service decription language web服务描述语言,用于一套标准的方法向外界描述它提供的服务
7.写一个类来调用测试发布的webservice 服务
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
public class ToClient {
public static void main(String args[]) throws Exception {
String urlname = "http://localhost:8080/axis_simple/services/stubs?wsdl";
//这是wsdl的绝对路径.也可以直接写成如下 ,这个没有区别.
//String urlname=”http://localhost:8080/axis/SayHello.jws?wsdl”
Service s = new Service();
Call call = (Call)s.createCall();
call.setOperationName("say");//注意。这里是要调用的方法名
call.setTargetEndpointAddress(urlname);//设置调用的目标url
String val = (String)call.invoke(new Object[]{"我是Blue’s Boy!"}); //设置调用方法中的参数
System.out.println("这是webservice服务器返回给你的:>>>>"+val);
}
}
注:如果使用到javabean,一个自定义的对象当作参数传递,那么需要在deploy.wsdd在发布服务的时添加一个<typeMapping>来映射类型,作用是序列化参数,就在deploy.wsdd加入:
<typeMapping
deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"
encodingStyle=http://schemas.xmlsoap.org/soap/encoding/
qname="ns1:user"
serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"
type="java:com.web.test.UserBean"
xmlns:ns1="urn:BeanService"
/>
cmd调用java org.apache.axis.client.AdminClient -l http://localhost:8080/axis_simple/services/stubs deploy.wsdd后有一点不同,就是service-config.wsdd里的<service>增加了下面这行代码:
<typeMapping deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" qname="ns1:user" serializer="org.apache.axis.encoding.ser.BeanSerializerFactory" type="java:com.web.test.UserBean" xmlns:ns1="urn:BeanService"/>
站点也发布成功,但是当你测试时,会出错,这是因为服务器端类使用javabean进行了类型序列化的映射后,不允许访问,这就是封装性,为了访问它,需要将webservice的服务类生成可提供调用的接口,进入cmd,进入到工程的web-inf目录,然后:
java org.apache.axis.wsdl.WSDL2Java –p client http://localhost:8080/axis_simple/services/stubs?wsdl
就是将服务映射成接口,并将这些接口类放在client文件夹中,客户需要调用的时候,只需要在将client文件夹复制到工程中就可以。