axis1-myeclipse/eclipse-入门级别-资源、流程、常见问题

来源:互联网 发布:java sdk 如何使用 编辑:程序博客网 时间:2024/06/05 02:20

本文转载自:http://blog.csdn.net/bestcxx/article/details/52300248



axis1-myeclipse/eclipse-入门级别-资源、流程、常见问题




1、资源下载

总共需要 axis1.4资源包,mail.jaractivation.jar

下载完axis1.4资源包 后解压缩到一个地方,路径中不要出现中文,其路径需要在下面axis的环境配置中用到。


我将mail.jar和 activation.jar放到了axis-1_4/lib下,这个在后面的环境变量配置中也要起到作用。


1.1下载途径一:

http://download.csdn.net/detail/bestcxx/9611310

 

 

1.2下载途径二:

·http://mirrors.hust.edu.cn/apache/axis/axis/java/1.4/

打开后选择  axis-bin-1_4.tar.gz


此外还需要两个常用的jar包,下载途径一中包含了所有所需资源,但是如果你没有下载权限也可以自己在网上找一下。

mail.jar和 activation.jar


2、环境变量配置

2.1 jdk环境变量配置,如果已经配置可以略过

参考:http://blog.csdn.net/bestcxx/article/details/52300559

2.2 axis1.4 环境变量配置

 

用户变量和系统变量都要配置一下

·AXIS_HOME

AXIS_HOME    D:\axis-1_4        (注:这一条要根据你实际的路径配置axis-1_4的位置)

 

·AXIS_LIB

AXIS_LIB       %AXIS_HOME%\lib

 

·AXISCLASSPATH

AXISCLASSPATH  %AXIS_LIB%\axis.jar;%AXIS_LIB%\axis-ant.jar;%AXIS_LIB%\commons-discovery-0.2.jar;%AXIS_LIB%\commons-logging-1.0.4.jar;%AXIS_LIB%\jaxrpc.jar;%AXIS_LIB%\log4j-1.2.8.jar;%AXIS_LIB%\saaj.jar;%AXIS_LIB%\wsdl4j-1.5.1.jar

 

·classpath,这个在配置jdk的环境变量的时候已经配置了,但是那是jdk的,现在在后面追加AXISCLASSPATHmail.jaractivation.jar的路径

 

classpath  .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;%AXISCLASSPATH%;%AXIS_LIB%\activation.jar;%AXIS_LIB%\mail.jar;

 

检查下:cmd  echo %AXIS_HOME% 等等,看配置的是否生效。


3、你一定安装了tomcat服务器

D:\axis-1_4\webapps 下你会发现一个项目 axis ,将之复制到tomcatwebapps

目录下(我的是D:\tomcat7\webapps,然后启动服务器




4、Axis1.4 自带的 axis项目访问

Tomcat服务器启动之后,在浏览器中访问:

http://localhost:8080/axis/

显示如下页面说明系统部署正常,接下来我们将以这个axis项目为中介逐步在一个独立的项目中完成webservice服务的实现。


5、jws方式发布 webservice服务

这种方式发布webservice服务需要以axis这个项目为载体。

大致的流程是,编写一个没有package包路径的java文件,比如HelloJWS.java,然后直接重命名为HelloJWS.jws

将这个文件复制到D:\tomcat7\webapps\axis 目录下

内容如下(再强调一下,不能有package包路径)

public class HelloJWS{

public String getSayHello(String name,int age){

return "Hello "+ name+",you are "+age+" years old.";

}

}

 

文件结构如下:


然后,服务器也不用重启,直接在地址栏中访问

http://localhost:8080/axis/HelloJWS.jws

你会看到


点击 Click to see the WSDL , 看到下面的内容说明你的JWS式服务发布成功了。

可以放大图片查看基本含义。


6、调用已经发布的webservice 服务

有一种是直接在代码中调用,还有一种是生成客户端代码,后者的优势是可以调用的方法名可以直接通过IDE代码提示获知,前者则需要以String字符串的形式体现出来。

6.1 使用代码调用发布的webservice服务

[java] view plain copy
  1. import java.rmi.RemoteException;  
  2.   
  3. import javax.xml.namespace.QName;  
  4. import javax.xml.rpc.ServiceException;  
  5.   
  6. import localhost._8080.axis.hellows.HelloWSService;  
  7.   
  8. import org.apache.axis.client.Call;  
  9. import org.apache.axis.client.Service;  
  10.   
  11.   
  12.   
  13. public class WebserviceTestForHelloWS {  
  14.   
  15.     /** 
  16.      * @param args 
  17.      * @throws ServiceException  
  18.      * @throws RemoteException  
  19.      * @throws ServiceException  
  20.      * @throws RemoteException  
  21.      */  
  22.     public static void main(String[] args) throws RemoteException, ServiceException {  
  23.         // TODO Auto-generated method stub  
  24.         System.out.println(new WebserviceTestForHelloWS().firstwsmethod("Han MeiMei",20));  
  25.     }  
  26.   
  27.     public String firstwsmethod(String name,int age) throws ServiceException, RemoteException{  
  28.         String result=null;  
  29.           
  30.         //设置远程访问链接  
  31.         String url="http://localhost:8080/axis/HelloJWS.jws";  
  32.           
  33.         //获取Service 对象-创建服务  
  34.         Service service=new Service();  
  35.           
  36.         //通过 Service 对象获取远程调用对象Call-创建调用句柄  
  37.         Call call=(Call) service.createCall();  
  38.           
  39.         //设置远程调用桩-设置请求地址  
  40.         call.setTargetEndpointAddress(url);  
  41.           
  42.         //设置远程操作方法名  
  43.          /** 
  44.          * 设置调用的方法和方法的命名空间; 
  45.          * 因为这里是手动发布到webroot目录下的,所以命名空间和请求地址一致 
  46.          * 当然null也可以,因为本身它就没有设置命名空间,一般方法的命名空间是 
  47.          * 包名倒写组成,如com.hoo.service,ns=http://service.hoo.com 
  48.          *  getSayHello 是要调用的方法名     
  49.          */  
  50.         call.setOperationName(new QName(url,"getSayHello"));//写成 (null,"getSayHello")也是可以的  
  51.           
  52.         //设置参数,执行远程方法  
  53.         result=(String)call.invoke(new Object[]{name,age});  
  54.           
  55.         return result;  
  56.     }  
  57.       
  58. }  

6.2 生成webservice客户端调用服务

首先,你需要一点点的DOS系统的操作知识(下面所有需要输入的内容都仅含双引号内的内容,此外注意空格的存在)。

打开cmd :即启动dos系统。

打开盘符:比如D盘,输入 “D:,然后按enter键。

打开某个文件:cd  文件名” ,这里有个小窍门,比如有个文件叫filename ,输入 “f”之后 按tab 键,系统会自动提示文件名全称。

如果你想看当前目录下有哪些文件,直接 输入 “dir”, 然后按enter键。

返回上一层目录: 输入 “cd ..”。

 

DOS 操作的东西这么点就够了。

 

DOS中使用cd命令,打开HelloJWS.jws所在的文件夹,注意这一点十分重要

D:\tomcat7\webapps\axis>

然后输入命令行,中间是个空格,第一部分是固定的,第二行是不是很熟悉?放到浏览器中看一下就知道了。

Java -Djava.ext.dirs=lib org.apache.axis.wsdl.WSDL2Java

http://localhost:8080/axis/HelloJWS.jws?wsdl

 

可以使用复制粘贴来完成这个操作,之后按 enter 键,正常来说会看到下面的景象,就是什么也没有发生,事实上,打开下面的目录,你会发现多出一个文件夹,这个文件夹可以加到你的其他java项目中,像调用一般类一样调用你刚才发布的webservice方法。


先看下生成的文件夹:


看看里面的结构

下面演示如何调用刚刚生成的webservice 客户端代码,当然,你需要有一个javaweb项目,还需要把axis这个项目中的jar包添加到这个项目的lib路径中。

下面的例子将在myeclipse 中实现服务的调用过程。

新建一个web project ,然后把刚才生成的客户端的文件夹整个复制到src目录下


然后,报错了,别担心,把jar包考到lib路径下,或者直接设置路径(建议这样,节约存储空间)


恢复正常


然后新建一个java测试类HelloJWSTest.java


HelloJWSTest.java代码内容如下

[java] view plain copy
  1. package stu.test.demo;  
  2.   
  3. import java.rmi.RemoteException;  
  4.   
  5. import javax.xml.rpc.ServiceException;  
  6.   
  7. import org.junit.Test;  
  8.   
  9. import localhost.axis.HelloJWS_jws.HelloJWS;  
  10. import localhost.axis.HelloJWS_jws.HelloJWSService;  
  11. import localhost.axis.HelloJWS_jws.HelloJWSServiceLocator;  
  12.   
  13.   
  14. public class HelloJWSTest {  
  15.   
  16.     @Test  
  17.     public void testMethod() {  
  18.         try {  
  19.             //HelloJWSService 和HelloJWSServiceLocator(),要根据你客户端的实际值进行更改  
  20.             HelloJWSService hellojwss=new HelloJWSServiceLocator();  
  21.             //HelloJWS要根据你的客户端的实际值进行更改  
  22.             HelloJWS hellojws=hellojwss.getHelloJWS();  
  23.             String result=hellojws.getSayHello("Jecket"20);  
  24.             System.out.println("调用url返回的结果为:"+result);  
  25.         } catch (ServiceException e) {  
  26.             // TODO Auto-generated catch block  
  27.             e.printStackTrace();  
  28.         } catch (RemoteException e) {  
  29.             // TODO Auto-generated catch block  
  30.             e.printStackTrace();  
  31.         }  
  32.   
  33.     }  
  34.       
  35. }  

运行结果如下


运行正常,但是提示有个class文件无法解析,我们把mail.jar也加入到路径中,或者拷贝到本项目的lib包中,再次运行测试方法shift+alt+d+t,就完全正常了。


为了之后不再出现其他问题,顺便把activation.jar 也加入到路径中。



6.3然后介绍一下使用eclipse这个IDE自动生成客户端的方法





完成


延伸,可能我测试环境和生产环境的url是不同的,客户端应该更自由些

回到myeclipse的项目中

HelloJWSServiceLocator.java

添加一个带参数的构造方法

[java] view plain copy
  1. public HelloJWSServiceLocator() {  
  2.     }  
  3.       
  4.     public HelloJWSServiceLocator(String HelloJWS_address) {  
  5.         this.HelloJWS_address=HelloJWS_address;  
  6. }  
  7.   
  8. 然后就可以自由的更改wsdl的参数了。  
  9. @Test  
  10.     public void testMethod() {  
  11.         try {  
  12.             //HelloJWSService 和HelloJWSServiceLocator(),要根据你客户端的实际值进行更改  
  13.             HelloJWSService hellojwss=new HelloJWSServiceLocator("http://localhost:8080/axis/HelloJWS.jws");  
  14.             //HelloJWS要根据你的客户端的实际值进行更改  
  15.             HelloJWS hellojws=hellojwss.getHelloJWS();  
  16.             String result=hellojws.getSayHello("Jecket"20);  
  17.             System.out.println("调用url返回的结果为:"+result);  
  18.         } catch (ServiceException e) {  
  19.             // TODO Auto-generated catch block  
  20.             e.printStackTrace();  
  21.         } catch (RemoteException e) {  
  22.             // TODO Auto-generated catch block  
  23.             e.printStackTrace();  
  24.         }  
  25.   
  26.     }  

7、WSDD发布webservice

在使用JWS发布webservice服务的时候,尽管我们再axis这个项目中添加了一项服务,但是去访问http://localhost:8080/axis/servlet/AxisServlet的时候,并不能发现我们刚才发布的服务,反过来说,我们把HelloJWS.jws这个文件的存在是不可知的,如果我们添加一个服务就可以通过http://localhost:8080/axis/servlet/AxisServlet来看到,移除这个服务这里就减少,显然这样更加有利于我们对项目的管理。所以,就涉及到另一种更为复杂也更为常用的webservice服务的发布方式,WSDD式的发布。

我们还是在helloworld项目中进行操作,不同的是这次我们将允许package包的存在。

这个服务将先被添加到axis 项目中,然后最终会直接在helloworld 项目中被访问。

新建java文件,HelloWSDD.java


HelloWSDD.java的内容如下,将提供webservice的对外发布的方法:

[java] view plain copy
  1. package src.test.demo;  
  2.   
  3. public class HelloWSDD {  
  4.     public String getUser(String name,int age){  
  5.         return "Hello "+name+", you are "+age+" years old.";  
  6.     }  
  7. }  

然后启动一下项目,实质上是编译一下项目,获取class文件


复制 stu这个文件夹到D:\tomcat7\webapps\axis\WEB-INF\classes


然后编写两文件,分别为deploy.wsddundeploy.wsdd,当然名字不是固定的,你可以自定义。

deploy.wsdd的内容如下

[html] view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <deployment xmlns="http://xml.apache.org/axis/wsdd/"  
  3.     xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">  
  4. <service name="HelloWSDD" provider="java:RPC">  
  5. <!-- * stu.test.demo.HelloWSDD 具体到类路径 -->  
  6.         <parameter name="className" value="stu.test.demo.HelloWSDD" />  
  7.         <!-- * 代表所有的方法都暴露 -->  
  8.         <parameter name="allowedMethods" value="*" />  
  9.         <parameter name="scope" value="request" />  
  10.     </service>  
  11. </deployment>  


undeploy.wsdd的内容如下(注意servicename就是deploy.wsdd中设定的内容)

[html] view plain copy
  1. <undeployment xmlns="http://xml.apache.org/axis/wsdd/">  
  2.     <service name="HelloWSDD"/>  
  3. </undeployment>  


编写完毕后将这两个文件复制到D:\tomcat7\webapps\axis\WEB-INF

然后访问一下http://localhost:8080/axis/servlet/AxisServlet

 

如图

然后在DOS中操作

打开axisWEB-INF(D:\tomcat7\webapps\axis\WEB-INF)

输入

java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient -l http://localhost:8080/axis/services/HelloWSDD  deploy.wsdd

 

为了防止报错,mail.jar 和 activation.jar  复制 axis这个项目下的lib文件夹下

enter

运行结果如下:



然后看下路径D:\tomcat7\webapps\axis\WEB-INF

多了一个文件server-config.wsdd 说明成功了。

然后再次访问一下链接http://localhost:8080/axis/servlet/AxisServlet

多了一个服务有木有,说明WSDD发布成功了,点进去看看,访问的方法前面已经说过,自己访问看看吧

然后再次回到DOS窗口

D:\tomcat7\webapps\axis\WEB-INF>

输入下面的命令行

java org.apache.axis.client.AdminClient undeploy.wsdd

enter 

然后再次访问一下链接

http://localhost:8080/axis/servlet/AxisServlet

刚才WSDD发布的服务HelloWSDD已经从列表中去掉了


8、在自己的项目中使用WSDD方式发布webservice服务

我们已经在axis项目中实现了以jws方式和wsdd方式发布简单的webservice服务,下面将演示如何在我们自己的项目中以wsdd方式发布webservice服务(jws式的就不实用了)。

首先在我们自己的项目中引入足够的jar


然后把刚才的两个文件 deploy.wsdd 和 undeploy.wsdd复制到项目helloworldWEB-INF文件夹中


然后需要对web.xml 的内容做出处理

如果你还记得axis 这个项目,把他的web.xml文件找出来,复制里面的内容,替换掉helloworldweb.xml (头部可以保留编码格式<?xml version="1.0" encoding="UTF-8"?>,内部的AdminServlet可以注释掉,尽管没有啥影响)

 

然后启动项目(如果你不想程序报错,就把刚才为访问axis项目而启动的tomcat服务器关闭掉,然后再去启动项目,我是在myeclipse中直接启动的,而且我myeclipsetomcat端口是8085


我们再次来到DOS环境,不过这次需要打开的是helloworldWEB-INF,我们需要deploy.wsddundeploy.wsdd


输入刚才一模一样的命令,噢,不 ,你现在的项目是helloworld,不是axis,而且要注意你的端口号是不是8080,我的测试环境端口是8085

java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient -l http://localhost:8085/helloworld/services/HelloWSDD  deploy.wsdd



然后访问http://localhost:8085/helloworld/servlet/AxisServlet

点进去


然后是去掉刚才添加的wsdd服务

,回到DOS环境

输入命令

java org.apache.axis.client.AdminClient undeploy.wsdd

如果是这个项目是发布在axis这个项目中的话,这个命令是OK的,但是如果失败了,也不要担心,换成下面的命令试试

java org.apache.axis.client.AdminClient undeploy.wsdd -l http://localhost:8085/helloworld/servlet/AxisServlet undeploy.wsdd


再次访问http://localhost:8085/helloworld/servlet/AxisServlet

服务成功去除了

9、常见问题解决

9.1 jar包错误

解决办法是把必须的那几个jar包添加到路径中。


9.2 jws发布失败

看看是不是文件内部有 package com.demo.test 类似的,jws 发布是不允许有包路径的。

9.3wsdd 找不到wsdd路径

在你DOS当前路径下输入 “dir+enter键,看是否有wsdd文件,如果没有wsdd文件就再看下DOS中打开文件夹的教程,否则就去除路径中的中文试一下。

9.4 404等错误

看你的环境是否启动了服务器,服务器中是否有要访问的项目,访问路径是否正确,端口号是否正确。



10、wsdd命令的作用是什么?如何在使 项目名.war 具备可访问的webservice服务——直接编辑server-config.wsdd文件

作用是在与wsdd通路径下产生一个server-config.wsdd文件,我们添加wsdd服务或者去除wsdd服务本质上都是对这个文件内容的修改



但是需要注意的是,这个文件默认是不存在的,而且,即便是在ide环境中调用了tomcat可以访问wsdd发布的服务,在直接导出的项目名.war中也不包含这个文件。

也就是说:如果想要生成的项目名.war 在tomcat中发布后可以被访问到webservice服务,必须在项目的sources目录下增加server-config.wsdd文件

技巧就是,直接把tomcat中使用wsdd命令自动生成的server-config.wsdd复制到当前的目录下,或者在生产环境运行wsdd发布服务命令。

原创粉丝点击