用axis1.4发布自己的wsdl服务详解
开发自己的WebService:(参照附件目录结构)
Axis提供两种发布的方式:即时发布---Instant Deployment 与 定制发布---Custom Deployment
首先要部署axis服务,把Axis1_4目录下的axis拷贝到tomcat的webapps目录下,修改端口为8080
一、即时发布
1. 即时发布提供了一种非常简单的发布方式,发布者只要有java源代码,然后把其后缀名改为jws拷贝
到%TOMACAT_HOME%\webapps\axis目录下即完成所有的发布工作。axis编译引擎会处理接下来的事情。
2. 实例:
(1) 服务端代码:
public class HelloWorldJWS{ public String testJws(String name1,String name2){ String result = "name1="+name1+",name2"+name2; return result; } }
把HelloWorldJWS.java文件改为HelloWorldJWS.jws然后拷贝到%TOMACAT_HOME%\webapps\axis目录下。启动tomcat访问http://localhost:8080/axis/HelloWorldJWS.jws,如果你能看到Click to see the WSDL这个连接,OK发布成功。
(2) 客户端代码:
import java.rmi.RemoteException; import javax.xml.namespace.QName; import javax.xml.rpc.ServiceException; import org.apache.axis.client.call; import org.apache.axis.client.Service; public class ClientJWS{ public static void main(String[] args){ try{ String url ="http://127.0.0.1:8080/axis/HelloWorldJWS.jws"; Service serv = new Service(); Call call = (Call)serv.createCall(); call.setTargetEndpointAddress(url); call.setOperationName(new Qname(url,"testJws")); String result = (String)call.invoke(new Object[]{"ml1","ml2"}); System.err.println(result); }catch(ServiceException e){ }catch(RemoteException e){ } } }
测试代码很简单,根据反射机制来的.
注意:假如你现在手里只有.class或者一个jar包,jws就不再能满足你的需求了,最要命的是即时发布不支持带包的类。
二、定制发布-----WSDD
1. 定制发布就是需要自己把你的发布的服务配置在xml文件里,然后在通过命令来发布。
2. 实例:
(1) 服务端代码:
package com.huawei.ws; public class HelloWorldWSDD{ public String testWsdd(String name1,String name2){ String result = "name1="+name1+",name2"+name2; return result; } }
把这个类编译为.class文件,拷贝到%TOMACAT_HOME%\webapps\axis\WEB-INF\classes目录下(即:HelloWorldWSDD.class在%TOMACAT_HOME%\webapps\axis\WEB-INF\classes\com\huawei\ws目录下)
(2) 接下来是编写deploy.wsdd文件:
在Axis1_4目录下新建deploy.wsdd文件,内容为:
<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<!-- Services from ImsService WSDL service -->
<!--服务的名字/服务的类型(四种:RPC,Docment,Wrapped,Message)-->
<service name="HelloWorldWSDD" provider="java:RPC" style="wrapped" use="literal">
<parameter name="className" value="com.huawei.ws.HelloWorldWSDD"/>---服务的具体类
<parameter name="allowedMethods" value="*"/>---允许调用的方法
<parameter name="scope" value="request"/>
</service>
</deployment>
注意:service节点里还有很多配置项,大家可以网上看看API。
(3) 启动tomcat,双击deploy.bat即可发布成功,tomcat\webapps\axis\WEB-INF下多了一个server-config.wsdd。
发布服务成功,访问http://localhost:8080/axis/servlet/AxisServlet即可看见你发布的服务。
(4) 至于如何添加到自己的web工程里,可以参照前面说的axis1.4发布服务与web工程整合。
(5) 客户端调用可以根据发布成功的wsdl来生成。
Axis1.4发布的服务与web项目进行整合
对于目前做soap感言:如果客户端和服务端都是java可选择xfire,如果是异构系统之间做soap服务大家可以千万别用xfire,有bug而且很难对上,最好用axis。
关于AXIS1.4如何基于web工程发布webService服务端详解:
1. 设置环境变量
AXIS_HOME: s1.4的路径(D:\axis-1_4)
AXISCLASSPATH:对应你lib下面的jar包路径(D:\axis-1_4\lib\axis.jar;D:\axis-1_4\lib\axis-ant.jar;D:\axis-1_4\lib\commons-discovery-0.2.jar;D:\axis-1_4\lib\commons-logging-1.0.4.jar; D:\axis-1_4\lib\jaxrpc.jar;D:\axis-1_4\lib\saaj.jar;D:\axis-1_4\lib\log4j-1.2.8.jar;D:\axis-1_4\lib\wsdl4j-1.5.1.jar;)
2. 生成服务端代码命令:
WSDL2Java -o [放在那个包下面] -d Session -s -S true [wsdl路径]
Eg:WSDL2Java -o server -d Session -s -S true Centrex_IMS.wsdl
双击生成服务端代码脚本:wsdl2java.bat内容如下(如果用脚本可以省略s设置环境变量)
@echo -----------------------------------------
@echo 设置Output_Path设置为你要生成的路径
@echo Package设置为生成文件的包路径
@echo 最后是wsdl可以是文件路径 可以是URL
@echo WSDL2Java -o [放在那个包下面] -d Session -s -S true [wsdl路径]
@echo -----------------------------------------
set Axis_Lib=D:\axis-1_4\lib
set Java_Cmd=java -Djava.ext.dirs=%Axis_Lib%
set Output_Path=D:\axis-1_4\server
%Java_Cmd% org.apache.axis.wsdl.WSDL2Java -o%Output_Path% D:\axis-1_4\Centrex_IMS.wsdl.xml
@pause
上面根据具体情况,要把axis相应路径替换为你自己的就OK了。
3. 如果测试可以接着下面的步骤:
(1) axis拷贝到TOMCAT_HOME/webapps。
(2) 把生成的代码编译为class文件(可以新建一个工程把生成的代码放到工程下面编译方法是:project--->clean 选择要生成class文件的项目)。
(3) 编译生长的class拷贝到TOMCAT_HOME/webapps\axis\WEB-INF\classes (这里可以把class打成jar,部署到WEB-INF\lib)。
(4) 启动Tomcat,将刚才生成的服务器端代码中的delopy.wsdd文件拷到一个目录下面用命令java
org.apache.axis.client.AdminClient deploy.wsdd 来部署服务器,部署成功会有相应的提示。
(5) 双击部署服务器脚本deploy.bat,内容如下:
@echo.
@echo 生成的server-config.wsdd在Tomcat发布的应用下
@echo.
set Axis_Lib=D:\axis-1_4\lib
set Java_Cmd=java -Djava.ext.dirs=%Axis_Lib%
set Axis_Servlet=http://10.168.5.102:8080/axis/servlet/AxisServlet
%Java_Cmd% org.apache.axis.client.AdminClient -l%Axis_Servlet% D:\axis-1_4\deploy.wsdd
@pause
上面根据具体情况,要把axis相应路径替换为你自己的就OK了。
(6) 然后我们到Tomcat\webapps\axis\WEB-INF下会发现多了个server-config.wsdd文件。(注意,在执行此命令前,确保tomcat处于启动状态。)
(7) 通过http://localhost:8080/axis/下的List可以看到服务了。
4. 如何把生成的webService服务结合在自己的web项目中:
(1) 完成以上操作。
(2) 把上面生成的的代码拷贝到你项目的对应目录下面,写服务器端相关的业务逻辑类,实现接口,在xxxBindingImpl那个类中返回相关的值,也就是业务逻辑的对像。
(3) 把刚刚生成的server-config.wsdd拷贝到的WEB-INFO的目录下面。
(4) 把需要的axis的jar包拷贝的lib目录。
(5) 配置你的web.xml文件,添加一下内容:(略axis1.4自带的例子里面有(可能需要修改自己))
(6) 你访问的路径为:首先你可以根据测试路径访问到你的服务,看到你的服务名称
(http://localhost:8080/axis/servlet/AxisServlet)
当你完成你的服务和项目结合时,在发布访问路径为:http://localhost:8080/[项目发布名称]/ service/[你的服务名称]?wsdl(sevice可以在web.xml配置)。
axis1.4如何头部鉴权
1. 需要在发布的server-config.wsdd文件中加上以下节点:
(1) 添加:
<handler name="AuthByAxis" type="java:com.huawei.cmserver.unifyproxy.wsu.AuthByAxis"/>
name是不变的,死的;type是你自己实现的鉴权类。
(2) 在这个service里添加注释部分
<service name="CentrexService" provider="java:RPC" style="wrapped" use="literal">
<!--
<requestFlow>
<handler type="AuthByAxis" />
</requestFlow>
-->
2. 鉴权类模板为:
/* * 文件名: UserAuthentizationHandler.java * 版权: Huawei Technologies Co., Ltd. Copyright 1998-2009, All rights reserved * 描述: //FIXME 请添加相应的描述 * 修改人: tKF19110 * 修改时间: Nov 12, 2009 * 跟踪单号: * 修改单号: * 修改内容: 新增 */ package com.huawei.cmserver.unifyproxy.wsu; import java.util.List; import javax.xml.namespace.QName; import javax.xml.soap.SOAPException; import org.apache.axis.AxisFault; import org.apache.axis.Message; import org.apache.axis.MessageContext; import org.apache.axis.handlers.BasicHandler; import org.apache.axis.message.MessageElement; import org.apache.axis.message.SOAPHeader; import com.huawei.cmserver.common.log.CentrexLogFactory; import com.huawei.cmserver.common.log.ICentrexLog; import com.huawei.cmserver.unifyproxy.utils.InternationalizationUtils; import com.huawei.cmserver.unifyproxy.utils.ResourceConstant; /** * @author tKF19110 * @version 1.0, Nov 12, 2009 * @since VPNV600R002C02 * */ public class AuthByAxis extends BasicHandler { private static final ICentrexLog LOG = CentrexLogFactory.getLog(AuthByAxis.class); /** * @author tKF19110 */ private static final long serialVersionUID = -4607899940018396356L; public void invoke(MessageContext mc) throws AxisFault { try { Message msg = mc.getRequestMessage(); SOAPHeader header = (SOAPHeader) msg.getSOAPHeader(); if (header == null) { throw new AxisFault(new QName(ResourceConstant.HEADER_NULL_CODE), InternationalizationUtils.getMessage(ResourceConstant.HEADER_NULL, null), null, null); } List<?> list = header.getChildren(); MessageElement token = (MessageElement) list.get(0); if (null == token) { throw new AxisFault(new QName(ResourceConstant.HEADER_NULL_CODE), InternationalizationUtils.getMessage(ResourceConstant.HEADER_NODE_ERROR, null), null, null); } list = token.getChildren(); MessageElement nameNode = (MessageElement) list.get(0); String userName = nameNode.getValue(); MessageElement pwdNode = (MessageElement) list.get(1); String password = pwdNode.getValue(); WsuAuthentication authen = new WsuAuthentication(); if (authen.authentication(userName, password)) { LOG.info(userName + " login successful!!"); } else { LOG.error(" authentication failed!!"); throw new AxisFault(new QName(ResourceConstant.USER_PASSWD_ERROR), InternationalizationUtils.getMessage(ResourceConstant.USER_PASSWD_ERROR, null), null, null); } } catch (SOAPException e) { LOG.error(" authentication failed!!"); e.printStackTrace(); throw new AxisFault(new QName(ResourceConstant.HEADER_NULL_CODE), InternationalizationUtils.getMessage(ResourceConstant.AUTHENTICATION_ERROR, null), null, null); } } }
注意:附件里面得jar包已经删除,请到开源网站下载后使用。