webservice 修炼之java模式(一)

      目前项目里有使用到webservice,之前有对webservice进行了解过,但是懂得的不多,我们来一起看看它吧,正式学习它之前我们来提出java3问(是什么?有什么用?怎么用?)

是什么:

      一句话来说,webservice就是一种跨编程语言和跨操作系统平台的远程调用技术。

      webservice的客户端和服务端可以是不同语言的,也可以在不同的操作系统之间进行使用,远程调用是指一台机器上A系统可以调用另一台机器上的B系统,例如:我们平时有些app会提示天气预报的功能,这些个app背后的公司总不可能各自开发自己的天气预报系统,这样成本太大,所以他们普遍调用气象局的天气服务系统。

      webservice中主要四种技术——XML、WSDL、SOAP、UDDI。在一套完整的Webservice服务中,这四种技术各有其自己的实现价值,下面分别来介绍一下各自的用途

1.XML 

       XML是用来标记数据的(对于XML标签详细介绍,可以参考W3C),因为上面我们说过,webservice不依赖于某一门特定的编程语言。而不同的系统可能是使用不同的编程语言来开发,(如上:项目A使用PHP开发,项目B使用Java开发)所以说就需要一种方式来交换数据,这种方式同样不依赖于某种编程语言,大多数软件都集成了XML标签,因此使用XML格式的数据来实现数据的交换。

2.SOAP 

       SOAP是一种特殊的协议,用来传输数据。当调用方一旦发现提供Webservice接口的地址,它将会使用SOAP协议和提供Webservice的系统进行连接。

3.WSDL

       WSDL用来描述客户端可以调用的接口的规则,所有这些规则定义在WSDL文件中,当有客户端发起调用的时候,Webservice提供方会参考这个WSDL规则来验证数据请求的合法性。

4.UDDI

       UDDI列出了那些服务是可以被访问的。当一个系统需要数据的时候,首先它会先查找UDDI,找出从除了自己之外的那些可以获取到自己需要的数据的服务,然后进行链接获取数据。这一点有点类似于DNS的功能。

有什么用:

      有什么用处,其实在说是什么的时候有点到,主要就是借助这个技术实现各系统间方法的调用。例如在一家公司中,可能java编写的ERP系统需要调用C++编写的CRM系统的某些功能,这时候就需要webservice。

怎么用:

webservice开发有三种方式:jdk,cxf和axis,目前cxf的使用根据网络了解比axis高出50%,所以本系列文章介绍jdk和cxf两种方式。先介绍jdk开发方式:

服务端:

  • 首先创建webservice的服务端:
package com.ljm.server.webservice;

import java.io.UnsupportedEncodingException;
import javax.jws.WebService;

/**
 * Created by linjiaming
 */
@WebService
public class WeatherServiceImpl implements IWeatherService {

    @Override
    public String query(String cityName) throws UnsupportedEncodingException {
        //乱码:原本的编码方式为utf-8,客户端传输参数传输过程中,被错误的转成GBK后又被转为UTF-8
        System.out.println("查询"+new String(cityName.getBytes("GBK"),"UTF-8"));
        return "大晴天";
    }
}
  •  发布服务
package com.ljm.server.main;

import com.ljm.server.webservice.WeatherServiceImpl;
import javax.xml.ws.Endpoint;

/**
 * @author linjiaming
 * JDK方式发布服务
 */
public class WeatherServer {

    public static void main(String[] args) {
        //服务地址和服务的实现
        Endpoint.publish("http://localhost:8080/weatherService", new WeatherServiceImpl());
        System.out.println("发布成功");
    }
}

客户端:

  • 判断服务端是否发布成功,首先在地址栏输入发布的地址:http://localhost:8080/weatherService加上?wsdl。看是否生成描述文档

  • 创建客户端项目,定位到项目src地址,采用java命令生成客户端代码,或者采用ide自带的webservice客户端生成工具(本文采用的是idea自带的工具)
  1. java命令

-s . 指的是在当前路径,指令介绍可以使用wsimport -h 查看

      2. idea工具生成

 

生成之后如下所示(已删除.class文件):

  • 书写代码,调用服务
package com.ljm.main;

import com.ljm.webservice.WeatherServiceImpl;
import com.ljm.webservice.WeatherServiceImplService;
import java.net.MalformedURLException;
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;

/**
 * Created by linjiaming
 */
public class WeatherClient {

    /**
     * 第一种方式调用方式
     * @param args
     */
    public static void main(String[] args) {
        //创建服务视图
        WeatherServiceImplService service = new WeatherServiceImplService();
        //得到服务实现类
        //WeatherServiceImpl port = service.getPort(WeatherServiceImpl.class);
        WeatherServiceImpl weatherServiceImplPort = service.getWeatherServiceImplPort();

        String s = weatherServiceImplPort.query("上海");
        System.out.println(s);


    }

    /**
     * 第二种调用方式
     * @param args
     */
   /* public static void main(String[] args) throws MalformedURLException {
        //wsdl描述文档
        URL url = new URL("http://localhost:8080/weatherService?wsdl");
        //服务名
        QName qName = new QName("http://webservice.server.ljm.com/", "WeatherServiceImplService");

        Service service = Service.create(url, qName);
        //得到服务实现
        WeatherServiceImpl weatherService = service.getPort(WeatherServiceImpl.class);

        String s = weatherService.query("上海");
        System.out.println(s);

    }*/
}

运行之后,观察控制台可知服务调用成功

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值