`
greemranqq
  • 浏览: 975473 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

请您先登录,才能继续操作

webservice (二) 初次尝试

阅读更多

前面简单介绍了一下webservice ,这里快速建立一个例子学习。

这是我用到的jar:可能版本有差异,主要包括 cxf,jetty 服务 io http util ,xml规范等

cxf 可以去:http://cxf.apache.org/download.html 下载,注意版本匹配

 

cxf-2.3.11.jar

jetty-continuation-7.4.5.v20110725.jar

jetty-http-7.4.5.v20110725.jar

jetty-io-7.4.5.v20110725.jar

jetty-server-7.4.5.v20110725.jar

jetty-util-7.4.5.v20110725.jar

wsdl4j-1.6.2.jar

XmlSchema-1.4.7.jar

 

一、 业务场景:

         假设我系统需要提供一个接口让另外的系统可以登录,相当于第三方访问,有点像单点登录。

         我们的方法是提供一个接口,接受第三方传来的用户名和密码,通过接口在我方系统进行调用,然后返回一个布尔值,判定登录是否成功。

 

二、开发步骤

       假设我们的web 项目叫webservice,然后建立一个登录的接口,并且实现它。

      

import javax.jws.WebParam;
import javax.jws.WebService;

// 单点登录的接口
// @WebService 这表是需要暴露出这个接口,也是所谓的(SEI)
@WebService
public interface ILoginService {
	 // 加入@WebParam 表示强制指定参数名字,不加生成出来的方法参数默认会是arg0..
	 public  boolean login(@WebParam(name="name") String name,@WebParam(name="password")String password);
}

 

   下面是业务逻辑,这里临时写得很简单。

import javax.jws.WebService;

// endpointInterface 限定接口位置
@WebService(endpointInterface="com.user.ILoginService")
public class LoginServiceImpl implements ILoginService{
	public boolean login(String name, String password) {
		// 数据临时写死
		if("admin".equals(name)&&"1234".equals(password)){
			return true;
		}
		return false;
	}
}

 

  下面是发布:

 

import javax.xml.ws.Endpoint;

// 这是一种发布方式
public class WebServer {
	public static void main(String[] args) {
	System.out.println("Starting Server");  
	// 实现类
        ILoginService implementor = new LoginServiceImpl();  
        // 地址
        String address = "http://localhost:8080/login";  
        // 发布
        Endpoint.publish(address, implementor);
        System.out.println("publish over");
	}
}

 

     运行这个类,不报错的话,在浏览器输入http://localhost:8080/login?wsdl  出现xml 就算成功了。

     你可以将上面的页面保存下来,后缀用wsdl,那么这个wsdl 就能生产客户端,让别人访问了。

 

     下面我们将保存下来的wdsl 文件拿到,看如何生产客户端和服务器端。

 

三、场景2:别人给你了一个wdsl 文件,或者比如:http://localhost:8080/login?wsdl 这个地址,要让你生成  客户端,去调用别人的接口。

       我这里是用cxf 命令,进行生成的,首先要下一个cxf 的源文件,和jdk 的差不多,含有bin 目录,你可以通过配置环境变量配置进去,当然我是没有配置,直接通过cmd 命令进入bin目录,然后命令生成。

       我的cxf 目录: D:\MMS文件\cxf-axis-jar\apache-cxf-2.3.11\bin

       我的wdsl 目录:D:\MMS文件\cxf-axis-jar\apache-cxf-2.3.11\bin\wsdl\login.wsdl

       在doc 下,进入该目录:D:\MMS文件\cxf-axis-jar\apache-cxf-2.3.11\bin>

       wsdl2java -p com.user.client -d d:/  -client D:\MMS文件\cxf-axis-jar\apache-cxf-2.3.11\bin\wsdl\login.wsdl

       这样你就可就在d:/ 盘下生成了,包名是com.user.client 的Java 文件。

       更多命令 参考 http://blog.csdn.net/pengchua/article/details/2740565
      生成的service 构造有错,不影响,版本有点差异,按默认的改就行了

 

      生成主要包含几个部分文件:

      1.service  和 serviceImpl  也就是接口以及实现。

      2.xxxx_client,这里是负责你测试调用的,它和平时你调用的业务方法类似

      3.xxxReponse ,这里面主要是返回值,定义的返回对象,上面接口返回的就是boolean,可以返回集合

      4.ObjectFactory ,package-info 这里面是一些限制,暂时不用

      5.如果参数和返回值 包含很多实体,那么都可以生成,文件相对较多,暂时不用管。

 

       下面我们主要来看ServiceImpl  和  client 方法。

    

@WebServiceClient(name = "LoginServiceImplService", 
                  wsdlLocation = "file:/D:/MMS文件/cxf-axis-jar/apache-cxf-2.3.11/bin/wsdl/login.wsdl",
                  targetNamespace = "http://user.com/") 
public class LoginServiceImplService extends Service {

    public final static URL WSDL_LOCATION;

    public final static QName SERVICE = new QName("http://user.com/", "LoginServiceImplService");
    public final static QName LoginServiceImplPort = new QName("http://user.com/", "LoginServiceImplPort");
    static {
        URL url = null;
        try {
            url = new URL("file:/D:/MMS文件/cxf-axis-jar/apache-cxf-2.3.11/bin/wsdl/login.wsdl");
        } catch (MalformedURLException e) {
            java.util.logging.Logger.getLogger(LoginServiceImplService.class.getName())
                .log(java.util.logging.Level.INFO, 
                     "Can not initialize the default wsdl from {0}", "file:/D:/MMS文件/cxf-axis-jar/apache-cxf-2.3.11/bin/wsdl/login.wsdl");
        }
        WSDL_LOCATION = url;
    }
    // ......下面的代码略

    上面的实现类,可以看出仅仅是注解了一些属性,已经没有 login方法了,他通过url 地址(因为这里我没有根据ip 生成,因此是绝对路径),继承Service 接口,当我们调用的时候实际是通过消息代理,将我们要执行的操作发送到服务器端进行执行。下面我看client 的调用。

  

     我们可以建一个新项目,表示是远程调用。

    

/**
 * Please modify this class to meet your needs
 * This class is not complete
 */

import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;

import javax.xml.namespace.QName;

/**
 * This class was generated by Apache CXF 2.3.11
 * 2013-11-07T15:40:01.015+08:00
 * Generated source version: 2.3.11
 * 
 */
public final class ILoginService_LoginServiceImplPort_Client {

    private static final QName SERVICE_NAME = new QName("http://user.com/", "LoginServiceImplService");

    private ILoginService_LoginServiceImplPort_Client() {
    }
    // 主函数
    public static void main(String args[]) throws java.lang.Exception {
    	// 获得实现类的url
        URL wsdlURL = LoginServiceImplService.WSDL_LOCATION;
        // 这代码,一般我都删除了
        if (args.length > 0) { 
            File wsdlFile = new File(args[0]);
            try {
                if (wsdlFile.exists()) {
                    wsdlURL = wsdlFile.toURI().toURL();
                } else {
                    wsdlURL = new URL(args[0]);
                }
            } catch (MalformedURLException e) {
                e.printStackTrace();
            }
        }
        // 这是主要逻辑代码 获得 service 和端口。
        LoginServiceImplService ss = new LoginServiceImplService(wsdlURL, SERVICE_NAME);
        ILoginService port = ss.getLoginServiceImplPort();  
        // 下面就是调用了,我们实际开发中 主要就是参考着两段代码进行
        {
        System.out.println("Invoking login...");
        java.lang.String _login_name = "admin";
        java.lang.String _login_password = "1234";
        boolean _login__return = port.login(_login_name, _login_password);
        System.out.println("login.result=" + _login__return);
        }
        System.exit(0);
    }

}

 

小结:

         1.例子很简单,仅仅先了解一个过程。

         2.自动生成的代码只有主要逻辑,对各种异常的处理,我们要特殊处理。

         3.代码省略的很多注解,加上肯定更加规范,这里暂时不介绍了。

         4.实际开发中,这些有SOA部门封装,定义一个统一的wsdl 进行。

 

其他:可以尝试一个复杂点的,参数和返回值 都是对象,然后完善注解

 

    

 

 

      

 

 

2
0
分享到:
评论
2 楼 greemranqq 2013-11-09  
lsioui 写道
调用别人提供的webservice:
public static void main(String[] args) {
	DynamicClientFactory dcf = DynamicClientFactory.newInstance();
	Client client = dcf.createClient("http://lsioui.com/Test.asmx?WSDL");
	Object reply = null;
	try {
		reply = client.invoke("XxxMethod", new Object[] {"lsioui","mima"});
		} catch (Exception e) {
			e.printStackTrace();
		}
		Object[] replys = (Object[]) reply;
		for (Object o : replys) {
			System.out.println(o);
		}
	}


谢谢了,哥们,这方式调用挺方便的
1 楼 lsioui 2013-11-08  
调用别人提供的webservice:
public static void main(String[] args) {
	DynamicClientFactory dcf = DynamicClientFactory.newInstance();
	Client client = dcf.createClient("http://lsioui.com/Test.asmx?WSDL");
	Object reply = null;
	try {
		reply = client.invoke("XxxMethod", new Object[] {"lsioui","mima"});
		} catch (Exception e) {
			e.printStackTrace();
		}
		Object[] replys = (Object[]) reply;
		for (Object o : replys) {
			System.out.println(o);
		}
	}

相关推荐

    WebService二——使用Eclipse开发WebService及各种调用方式

    【WebService二——使用Eclipse开发WebService及各种调用方式】 在IT行业中,WebService是一种基于标准协议(如SOAP、WSDL和UDDI)的开放Web应用程序接口,它允许不同系统之间进行互操作通信。本教程将详细介绍如何...

    C,C#webservice 返回数组,二进制

    标题“C,C# webservice 返回数组,二进制”意味着我们将讨论如何创建一个Web服务,该服务能够接收和返回数组形式的数据,并且这些数据可能是以二进制格式存储的。二进制数据通常用于处理图像、音频、视频或其他大型...

    Webservice第二部分思维导图

    Webservice第二部分思维导图

    WebService教程+实例+代码提示功能WebService实例.rar

    这个"WebService教程+实例+代码提示功能WebService实例.rar"压缩包文件显然包含了关于WebService的学习资料、实例代码和可能的代码提示功能,旨在帮助用户深入理解和实践WebService的开发。 首先,"教程地址.txt"很...

    webservice

    #### 二、WebService的基本组成部分 WebService主要包括以下几个部分: 1. **服务提供者**:提供WebService的一方,通常是指实现了某些业务逻辑的服务端应用。 2. **服务消费者**:调用WebService的一方,可以是...

    WebServiceStudio webservice测试工具

    WebServiceStudio是一款轻量级的Web服务测试工具,它允许开发者无需编写任何代码就能对Web服务进行快速、便捷的测试。这个工具特别适用于那些需要验证Web服务功能或调试接口的IT专业人员。在本文中,我们将深入探讨...

    一个简单的WEBSERVICE 例子

    ### 二、示例代码解析 #### 2.1 创建 WebService 类 ```csharp public class Service1 : System.Web.Services.WebService { public Service1() { InitializeComponent(); } } ``` 在这个例子中,`Service1` 类...

    C#调用JavaWebService

    调用WebService,最简单的办法当然是直接添加WEB引用,然后自动产生代理类,但是在调用JAVA的WebService时并没有这么简单,特别是对于SoapHeader的处理,通过C#添加Web引用方式访问JavaWebService的方法,除了string...

    oracle 调用webservice

    二、Java 编写简单的 WebService 实例 使用 Eclipse 编写简单的 WebService 实例,首先需要安装 Eclipse 和 Java Development Kit(JDK)。然后,创建一个新的 Java 项目,添加 WebService 依赖项,编写 WebService...

    Idea实现WebService实例

    【标题】:Idea实现WebService实例 在Java开发中,WebService是一种常见的跨平台、跨语言的通信方式,它允许不同的应用程序之间交换数据。IntelliJ IDEA(简称Idea)是广受欢迎的Java集成开发环境,提供了强大的...

    通过Webservice方式提供U8二次开发API调用

    通过Webservice方式提供U8的API调用,可避免客户端安装用友U8才能调用到U8API,完整的调用源码..实现其他语言开发的平台可以调用U8 API生成单据以及处理单据的审核等. 需引用: UFIDA.U8.MomServiceCommon.dll UFIDA....

    Android调用WebService

    最近学习的是在android端如何去调用远程WebService,都说WebService是一种基于SOAP协议的远程调用标准,对于这个协议理解...该Demo参考《疯狂Android讲义》并做改动,希望可以帮助到初次接触Androi调用WebService的朋友

    WebserviceStudio webservice调试工具

    Web服务(WebService)是一种基于互联网的、平台独立的交互方式,它允许不同系统之间的应用程序进行通信。WebServiceStudio是一款专门用于调试和测试Web服务的工具,尤其适用于开发人员在开发过程中验证和测试Web...

    webservice测试调用工具WebserviceStudio20

    WebserviceStudio是一款强大的Web服务测试和调用工具,版本为20。这款工具主要帮助开发者和测试人员方便地测试和调试他们的Web服务。以下是WebserviceStudio的一些核心功能和相关知识点: 1. **图形化界面**:...

    axis2开发webservice(二)

    资源包含了:axis2-1.7.4-bin.zip、axis2-1.7.4-war.zip、axis2-eclipse-...备注:资源超过了70M 分成了3部分 见axis2方式开发webservice(一)和 axis2方式开发webservice(二)、 axis2方式开发webservice(三)

    webservice获取List案例

    在本案例中,我们关注的是一个特定的Web服务类型——WebService,它用于获取一个包含泛型对象的List。这个场景在分布式系统、微服务架构或者跨平台数据共享中非常常见。让我们深入探讨一下相关的知识点。 1. **...

    webservice测试软件WebServiceStudio

    Web服务(WebService)是一种基于标准的、平台和语言无关的方式,允许不同系统之间进行通信和数据交换。在IT行业中,Web服务广泛应用于企业级应用程序集成,使得不同系统间的数据共享和交互变得更加简单。本文将详细...

    WebService的优势与劣势

    #### 二、WebService的优势 1. **平台独立性**:WebService通过XML和HTTP等通用标准进行通信,使得它可以跨不同的操作系统和开发环境进行数据交换。 2. **易于集成**:由于其平台独立性和基于标准协议的特点,...

Global site tag (gtag.js) - Google Analytics