Axis1.x版本的学习笔记

用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包已经删除,请到开源网站下载后使用。

 

猜你喜欢

转载自mljavalife.iteye.com/blog/1182063