`
my_java_life
  • 浏览: 146116 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

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

 

分享到:
评论

相关推荐

    Axis2_1.X学习笔记

    标题"Axis2_1.X学习笔记"指的是关于Axis2的一个学习资源,其中1.X代表可能是1.4或者1.5等版本,Axis2是Apache软件基金会开发的一个开放源代码Web服务平台,主要用于构建和部署Web服务。这个学习笔记可能是对Axis2在1...

    Tushare 和 Matplotlib学习笔记整理.pdf

    除了设置坐标轴的范围,我们还可以通过`plt.axis("equal")`确保x轴和y轴具有相同的度量单位,使得在绘制例如圆形的图形时能够保持正确的形状。 ### 总结 这份笔记整理详细介绍了量化分析中Tushare库和Matplotlib库...

    matlab学习笔记.pdf

    在给定的"matlab学习笔记.pdf"中,我们探讨了如何使用MATLAB进行图形绘制以及一些关键的图形命令和属性。 首先,从描述中可以看到,MATLAB被用于绘制多个正弦波形的图形。通过`x=-2*pi:0.1:2*pi;`定义了x轴的取值...

    matlab学习笔记.docx

    【MATLAB学习笔记】 MATLAB是一款强大的数学计算和数据分析软件,广泛应用于科研和工程领域。以下是一些关于MATLAB的基本知识点: 1. **函数eval**: `eval`函数在MATLAB中用于执行字符串中的MATLAB代码。它可以...

    matlab学习笔记 (3).pdf

    在MATLAB的学习中,了解和掌握各种函数及操作是至关重要的。...以上就是MATLAB学习笔记中涉及的一些关键知识点,涵盖了函数使用、数据操作、图形绘制等多个方面,对于理解和使用MATLAB进行数据分析和计算很有帮助。

    Matlab学习笔记 (3).docx

    【Matlab学习笔记】 Matlab是一款强大的数学计算和数据分析软件,尤其在工程计算、科学建模和算法开发中广泛使用。以下是一些Matlab的基本概念和常用操作: 1. **文件命名与界面恢复**:Matlab是区分大小写的,...

    matlab学习笔记 (2).pdf

    8. **图形控制**:`plot`函数用于绘制二维图形,`axis`函数调整坐标轴范围,`axis equal`使X和Y轴单位长度相同,`axis square`使图像为正方形,`axis tight`适应性调整范围,`axis ij`和`axis xy`改变坐标轴方向,`...

    pandas,numpy笔记.docx

    pandas 和 numpy 笔记 在数据科学和机器学习中,pandas 和 numpy 是两种非常重要的库,它们提供了强大的数据处理和分析功能。下面是对 pandas 和 numpy 的一些重要知识点的总结。 数据导入 pandas 提供了多种方式...

    matlab学习笔记 (3).docx

    在MATLAB的学习中,了解和掌握各种函数及操作是非常关键的。以下是一些关于MATLAB的重要知识点: 1. **函数eval**:`eval`函数在MATLAB中用于执行字符串中的MATLAB代码,它允许我们将字符串作为表达式来计算,从而...

    Pandas学习笔记

    ### Pandas学习笔记 #### 一、简单操作 ##### 1. Series 对象 - **创建**:可以通过列表、NumPy 数组或字典来创建一个 `Series` 对象。 - 使用列表创建: ```python s = pd.Series([12, -4, 7, 9]) ``` - ...

    Matlab入门基础学习笔记.docx

    你可以定义一个简短的匿名函数,如`f = @(x) 2*x`,这样`f`就成为了一个函数句柄,之后可以通过`f(1)`来调用这个函数,输出结果为2。 在Matlab中,基础绘图是十分重要的部分。可以使用`plot`函数来绘制二维曲线,有...

    Fluent学习笔记

    Fluent学习笔记 Fluent是一款功能强大且广泛应用于计算流体力学(CFD)的软件。以下是 Fluent 学习笔记中的重要知识点总结: 网格划分 * Quad:四边形网格,要求各对边节点数要相同 * Tri:三角形网格 * Quad/Tri...

    JFreeChart学习笔记

    **JFreeChart学习笔记** JFreeChart是一款强大的Java图表库,它允许开发者在应用程序、Swing组件、Applet或Web应用中创建各种复杂的图表。这个开源项目提供了多种图表类型,如饼图、柱状图、线图、散点图、甘特图等...

Global site tag (gtag.js) - Google Analytics