八进制

少年壮志无烟抽

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  231 随笔 :: 0 文章 :: 2956 评论 :: 11 Trackbacks

使用Axis,要发布一个Web服务非常简单,简直不能再简单了,尽管看起来过程和相关代码有些长。我这个帖子里用到了这些软件:Axis 1.1、Eclipse 2.1和Eclipse的Tomcat插件2.2(Sysdeo Tomcat plugin)。发布的方法如下:

我要发布的服务是一个图书商店,公布的方法有添加图书addBook、列表图书listBooks、删除图书deleteBook等等,为简单起见这里就只发布一个添加图书方法,因为其他方法的发布是类似的。

1、首先在Eclipse里新建一个名为bookstore的Tomcat工程,注意要安装了前面说的Tomcat插件才有这个选项的。如果没有安装可以建立一个java工程,然后手动建立必要的目录结构(WEB-INF等),并在Tomcat的server.xml里手动增加与项目对应的<context>项。

2、接下来建立图书类(com.bookstore.model.Book),图书有名称、ISDN号和页数三个属性,这是一个Bean类,代码如下:

package com.bookstore.model;

public class Book {
    private String name;
    private String ISDN;
    private 
int page;

    public String getISDN() {
        
return ISDN;
    }

    public String getName() {
        
return name;
    }

    public 
int getPage() {
        
return page;
    }

    public 
void setISDN(String string) {
        ISDN 
= string;
    }

    public 
void setName(String string) {
        name 
= string;
    }

    public 
void setPage(int i) {
        page 
= i;
    }

}

3、接下来建立用来提供服务的类(com.bookstore.BookSvc),这个类就是实际的功能类了,它里面只有一个public的addBook()方法,而它的参数只有一个就是要添加的图书。代码如下:

package com.bookstore;

import com.bookstore.model.Book;

public class BookSvc {
    
    public 
void addBook(Book book){
        
//here you save a book into database
        System.out.println("Book has been added.");
    }
}

4、现在,把下载来的Axis解压缩到一个文件夹,这里假设你解到C:\axis-1_1。把C:\axis-1_1\webapps\axis\WEB-INF\lib目录下的所有.jar文件复制到你的这个web应用程序的WEB-INF\lib下,再把C:\axis-1_1\webapps\axis\WEB-INF目录下的web.xml复制到你的web应用程序的WEB-INF下。这个步骤相当于在你的web应用程序中配置了Axis。

5、为了让Axis知道你要发布哪些服务,你得在WEB-INF下建立一个名为server-config.wsdd的文件,内容如下:

<?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">
 
<globalConfiguration>
  
<parameter name="adminPassword" value="admin"/>
  
<parameter name="attachments.Directory" value="C:\eclipse\workspace\bookstore\WEB-INF\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>
   
<handler type="java:org.apache.axis.handlers.JWSHandler">
    
<parameter name="scope" value="session"/>
   
</handler>
   
<handler type="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="Authenticate" type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/>
 
<handler name="URLMapper" type="java:org.apache.axis.handlers.http.URLMapper"/>
 
<service name="Version" provider="java:RPC">
  
<parameter name="allowedMethods" value="getVersion"/>
  
<parameter name="className" value="org.apache.axis.Version"/>
 
</service>
 
<service name="BookSvc" provider="java:RPC">
  
<parameter name="allowedMethods" value="*"/>
  
<parameter name="className" value="com.bookstore.BookSvc"/>
 
</service>
 
<service name="AdminService" provider="java:MSG">
  
<parameter name="allowedMethods" value="AdminService"/>
  
<parameter name="enableRemoteAdmin" value="false"/>
  
<parameter name="className" value="org.apache.axis.utils.Admin"/>
  
<namespace>http://xml.apache.org/axis/wsdd/</namespace>
 
</service>
 
<transport name="local">
  
<responseFlow>
   
<handler type="LocalResponder"/>
  
</responseFlow>
 
</transport>
 
<transport name="http">
  
<requestFlow>
   
<handler type="URLMapper"/>
   
<handler type="java:org.apache.axis.handlers.http.HTTPAuthHandler"/>
  
</requestFlow>
 
</transport>
</deployment>

这个文件里发布了三个服务:Version、AdminService和我们的BookSvc。还有一个方法可以生成这个文件,好象Axis推荐使用这种生成的方法,就是在同样目录下写一个deploy.wsdd文件(如果不想看可以直接跳到下一步),内容如下:

<deployment xmlns="http://xml.apache.org/axis/wsdd/"
            xmlns:java
="http://xml.apache.org/axis/wsdd/providers/java">
 
<service name="BookSvc" provider="java:RPC">
  
<parameter name="className" value="com.bookstore.BookSvc"/>
  
<parameter name="allowedMethods" value="*"/>
 
</service>
</deployment>

也就是说deploy.wsdd里只包含关于我们的服务的描述,确认Tomcat已经启动,然后在同一目录下用下面这个命令生成server-config.wsdd文件:

java org.apache.axis.client.AdminClient -lhttp://localhost:8080/bookstore/services/AdminService deploy.wsdd

其中bookstore是我这个web应用程序的虚拟路径。

6、重新启动Tomcat,访问路径http://localhost:8080/bookstore/services,就可以看到现在发布了三个Web服务,如下图。点击每个服务后的wsdl链接可以看到对应的WSDL描述。

相关链接:

posted on 2004-10-09 15:33 八进制 阅读(22199) 评论(28)  编辑 收藏 所属分类: Web服务/语义Web

评论

#1楼  2005-01-09 22:52 wu [未注册用户]
没有出现以上画面,为什么?
And now... Some Services
AXIS error
Sorry, something seems to have gone wrong... here are the details:

Fault - Could not find class for the service named: com.bookstore.BookSvc
Hint: you may need to copy your class files/tree into the right location (which depends on the servlet system you are using).; nested exception is:
java.lang.ClassNotFoundException: com.bookstore.BookSvc
AxisFault
faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.generalException
faultSubcode:
faultString: Could not find class for the service named: com.bookstore.BookSvc
Hint: you may need to copy your class files/tree into the right location (which depends on the servlet system you are using).; nested exception is:
java.lang.ClassNotFoundException: com.bookstore.BookSvc
faultActor:
faultNode:
faultDetail:

另外,我想自动生成server-config.wsdd就已经出错了,为什么?
D:\Eclipse\workspace\bookstore\WEB-INF>java org.apache.axis.client.AdminClient -lhttp://localhost:8080/bookstore/services/AdminServic deploy.wsdd
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/axis/client/AdminClient


  回复  引用    

找不到类BookSvc,即在指定位置找不到BookSvc.class,请确定你已将.java文件,编译为.class;
RE:另外,我想自动生成server-config.wsdd就已经出错了,为什么?
检查你的系统变量设置,确定包含axis.jar
  回复  引用    

#3楼  2005-01-17 15:30 carisma [未注册用户]
我有一个问题,如何用jsp页面作为客户端调用Web服务
  回复  引用    

#4楼 [楼主] 2005-01-17 23:38 八进制      
carisma,和在java里一样调用,jsp运行时是服务器上的java程序。
  回复  引用  查看    

#5楼  2005-05-13 09:32 rain [未注册用户]
能不能告诉我,用jboss怎么用axis来布署吗?
  回复  引用    

#6楼 [楼主] 2005-05-13 13:29 八进制      
jboss和tomcat的情况是一样的,只要把axis当作一个web应用程序发布即可。至于怎样把应用程序发布到jboss,网上有很多文章的。
  回复  引用  查看    

#7楼  2005-06-14 18:20 zhengyun      
多谢!
按照你的步骤,比较顺利地实现了bookstore,除了一点小挫折:
http://www.cnblogs.com/zhengyun_ustc/archive/2005/06/14/174348.html([Java]Axis需要高版本的J2sdk: j2sdk-1_4_2_08)
  回复  引用  查看    

#8楼  2005-08-23 18:06 zhubob [未注册用户]
我自动生成server-config.wsdd也出错,请问各位兄弟是怎么解决的呀
C:\>java -cp %AXISCLASSPATH% org.apache.Axis.client.AdminClient deploy.wsdd
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/Axis/clien
t/AdminClient

环境变量
AXIS_HOME=D:\Tomcat\webapps\axis\WEB-INF
AXISCLASSPATH=.;%AXIS_HOME%\lib\axis.jar;%AXIS_HOME%\lib\axis-ant.jar;%AXIS_HOME%\lib\commons-discovery-0.2.jar;%AXIS_HOME%\lib\commons-logging-1.0.4.jar;%AXIS_HOME%\lib\jaxrpc.jar;%AXIS_HOME%\lib\saaj.jar;%AXIS_HOME%\lib\wsdl4j-1.5.1.jar;%AXIS_HOME%\lib\log4j-1.2.8.jar;

直接用DII的方式写一个简单的webservice然后远程调用*.jws就正常,现在这个服务里加了访问数据库的代码在里面,我在网上查看了资料说这种情况一般要发布服务,按照那些操作在命令行执行总是出现如上的错误,请问是什么原因

  回复  引用    

#9楼  2005-08-30 16:26 arctic [未注册用户]
我用axis时出现这样的问题:
如果源码中(以Hello为例)出现了package server,然后运行http://localhost:8080/axis/Hello.jws?WSDL想直接生成wsdl时,这时axis是生成了.class文件,不过是在axis\WEB-INF\jwsClasses\server下的Hello.class.也就是说.class文件已经打包 ,但ie报错说找不到axis\WEB-INF\jwsClasses下的Hello.class,这时即使copy一个.class文件放到axis\WEB-INF\jwsClasses下,会报另一个错:
AXIS error
Sorry, something seems to have gone wrong... here are the details:

Exception - java.lang.NoClassDefFoundError: Hello (wrong name: server/Hello)

这个是不是说有package的不能直接生成呢?
呵呵,刚开始接触axis,不是很明白.


  回复  引用    

我试过JDK自带类型String List都可以返回,但是自定义了一个User泪就不可以
  回复  引用    

#11楼 [楼主] 2005-09-02 22:20 八进制      
我记得要在server-config.wsdd里指定一下Serializer,比如用axis自带的BeanSerializer就可以。
  回复  引用  查看    

#12楼  2005-09-05 23:47 ss [未注册用户]


D:\Tomcat 4.1\webapps\axis\WEB-INF>java -cp %AXISCLASSPATH% org.apache.axis.clie
nt.AdminClient deploy.wsdd
log4j:WARN No appenders could be found for logger (org.apache.axis.i18n.ProjectR
esourceBundle).
log4j:WARN Please initialize the log4j system properly.
Processing file deploy.wsdd
Exception: AxisFault
faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException
faultSubcode:
faultString: java.net.ConnectException: Connection refused: connect
faultActor:
faultNode:
faultDetail:
{http://xml.apache.org/axis/">http://xml.apache.org/axis/}stackTrace:java.net.ConnectException: Conne
ction refused: connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(Unknown Source)
at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.axis.components.net.DefaultSocketFactory.create(DefaultSoc
ketFactory.java:135)
at org.apache.axis.components.net.DefaultSocketFactory.create(DefaultSoc
ketFactory.java:99)
at org.apache.axis.transport.http.HTTPSender.getSocket(HTTPSender.java:1
31)
at org.apache.axis.transport.http.HTTPSender.writeToSocket(HTTPSender.ja
va:370)
at org.apache.axis.transport.http.HTTPSender.invoke(HTTPSender.java:88)
at org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrateg
y.java:32)
at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118)
at org.apache.axis.SimpleChain.invoke(SimpleChain.java:83)
at org.apache.axis.client.AxisClient.invoke(AxisClient.java:147)
at org.apache.axis.client.Call.invokeEngine(Call.java:2719)
at org.apache.axis.client.Call.invoke(Call.java:2702)
at org.apache.axis.client.Call.invoke(Call.java:1738)
at org.apache.axis.client.AdminClient.process(AdminClient.java:438)
at org.apache.axis.client.AdminClient.process(AdminClient.java:403)
at org.apache.axis.client.AdminClient.process(AdminClient.java:409)
at org.apache.axis.client.AdminClient.process(AdminClient.java:319)
at org.apache.axis.client.AdminClient.main(AdminClient.java:462)

{http://xml.apache.org/axis/">http://xml.apache.org/axis/}hostname:MICROSOF-8768E9

这是什么错啊。

  回复  引用    

#13楼  2006-04-20 16:32 piggy [未注册用户]
想问个问题,这个web发布是在服务器端上吗?
如果我想做一个客户端调用的测试,直接通过http访问吗?
在网上找到了个一个和这个不太一样的用axis做webservice的例子
链接如下:
http://www-128.ibm.com/developerworks/cn/webservices/ws-startaxis/index.html
为什么这里不是用自己写的service,而是把自己写的类直接自动编译成四个文件,然后通过其他程序调用?
能解释一下吗?谢谢,不太理解。。。>_<。。。

  回复  引用    

@rain
把Axis中的LIB包含到工程,发布的时候一起发布,将Axis中的Web.xml内容放到工程Web.xml 文件中,就可以在Jboss下使用Axis
  回复  引用    

#15楼 [楼主] 2006-05-12 10:50 八进制      
To piggy: 是发布在服务器上。客户端有很多种,可以是普通的应用程序,也可以是浏览器,但都要通过http协议访问服务。
  回复  引用  查看    

#16楼  2006-05-23 15:42 wpet [未注册用户]
在文件server-config.wsdd中为什么会有下面这句话,什么意思,用来作什么的?能不能请楼主解释一下啊,小弟不胜感激!
<parameter name="attachments.Directory" value="C:\eclipse\workspace\bookstore\WEB-INF\attachments"/>

  回复  引用    

@zhubob 可能是你执行的命令的语句中的路径里的字母的大写与小写有错误哦!你试将Axis改为axis试试!!!即为ora.apache.axis.client.AdminClient .呵呵,再一个,如果你的Tomcat的端口号不是默认的8080了,那你就要在后面加个参数-p8899 再执行,再就是你在执行这条命令时要保证你的Tomcat是启动的。要不无法发布的。会提示你connection错误的。
@ss


这是你Tomcat版本的问题,用这个版本要在server.xml中配置一下你工程的目录,最好在WEB-INF下建一个目录,再在server.xml中的</host>之前加入 <Context path="/MyService" docBase="工程文件夹的路径" reaload="true" />,这样你的“小猫”就不会再提示你i18n的错误了!!!呵呵

  回复  引用    

#18楼  2006-09-13 13:40 xulimou [未注册用户]
出错的同志们注意啦
需要将lib下的tools.jar添加到tomcat下的common文件夹下
  回复  引用    

#19楼  2006-09-27 19:44 Tian [未注册用户]
我在使用 SOAP (RPC 方式) 开发一个 web 服务(实验)中,

当我在client 端代码中为 soap envelope 加了自己定义的 header 后,已在soap1.1的条件下运行正常,但一旦用

call.setSOAPVersion(SOAPConstants.SOAP12_CONSTANTS); //soap 1.1 is default.


使 soap1.2 协议被使用,就会出错,以下是部分错误代码:

'false' is not a valid value for the mustUnderstand attribute on element 。

很奇怪,因为我的server端和client端都用了 axis 1.4 的jar 包,怎么会不支持soap1.2 的协议(mustUnderstand 可以取 1/true和0/false),因为只有soap1.1 才不理解 mustUnderstand="false"。

请教并谢谢。

  回复  引用    

我想实做一个web服务的例子:就是查询数据表的记录,通过参数,就能查询到符合条件的数据,必须用XML作为数据交换的格式,我想用AXIS来实现,请高手帮助.也可以讨论,QQ是515010939,邮箱:chongqingwxp@yahoo.com.cn.
  回复  引用    

#21楼  2006-10-24 18:36 彭敏 [未注册用户]
你好,按照你的步骤,我已经全部成功的做了一遍,你的调用是在地址栏里调用,如果我是另一个应用程序要调用这个方法,比方说就是一个很普通的java类的main方法里要用,这段调用的代码该怎么写?希望你抽出一点宝贵的时间,谢谢给予提示或解答!
我的msn:iceaugustmin@hotmail.com
QQ:12452964
多多身你学习
  回复  引用    

#22楼  2006-10-26 22:30 红 [未注册用户]
C:\eclipse\workspace\bookstore\WebRoot\WEB-INF>java org.apache.axis.client.Admin
Client -lhttp://localhost:8080/bookstore/services/AdminService deploy.wsdd
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/axis/clien
t/AdminClient
  回复  引用    

@红
classpath环境变量的问题
  回复  引用    

#24楼  2006-12-21 14:01 hdware [未注册用户]
这个指定位置是哪个位置?

you may need to copy your class files/tree into the right location
  回复  引用    

C:\Documents and Settings\quickmans>d:

D:\>cd D:\Tomcat 5.0\webapps\bookstore\WEB-INF

D:\Tomcat 5.0\webapps\bookstore\WEB-INF>java org.apache.axis.client.AdminClient -lhttp://l
ervices/AdminService deploy.wsdd
Exception in thread "main" java.lang.NoClassDefFoundError: javax/xml/rpc/ServiceException

这个是什么原因啊?跪求啊 我折腾了一个晚上都生成不了server-config.wsdd 大家快快帮忙啊!

  回复  引用    

服务能发布了,但是用DII调用时出错,原因可能是对于复杂类型(Book)需设置特定的编码.如:document/literal,但是不知道如何在deploy.wsdd中设置,请高手们指教
  回复  引用    

#27楼  2007-09-12 22:56 freshfree [未注册用户]
服务发布后,点击WSDL连接,出错,是怎么回事呀?怎么没有生成WSDL文件?
  回复  引用    

在 WEB-INF 下 的 server-config.wsdd
注意你的路径
<parameter name="attachments.Directory" value="D:\cnc_net\web_max\WEB-INF\attachments"/>

我的路径为 D:\cnc_net\web_max\WEB-INF\attachments

修改为自己的发布绝对路径,应该就没有什么问题了.
我的是采用的直接修改文件的方式做的.已经成功了



李光明
2008-02-18


  回复  引用