webService是在ajax出现之前公司之间接口调用常见的方法,和此类技术类似的还有restful api.

最近做社保查询的东西,然而这个是三个公司一起做的,需要调其他公司的接口,他们公司用了webService这个当年比较流行的技术,于是乎就研究了一下这个webService.

HTTP协议 + XML方式实现跨语言调用。因为Http+xml会有很多冗余数据。所以后来有了RPC框架(Dubbo、Spring Cloud)

一、WebService是什么?
  1. 基于Web的服务:服务器端整出一些资源让客户端应用访问(获取数据)
  2. 一个跨语言、跨平台的规范(抽象)
  3. 多个跨平台、跨语言的应用间通信整合的方案(实际)

二、为什么要用Web service(能解决什么)?
    跨平台调用
    跨语言调用
    远程调用

三、什么时候使用web Service?
  1. 同一家公司的新旧应用之间
  2. 不同公司的应用之间
  3. 一些提供数据的内容聚合应用:天气预报、股票行情

四、Web Service中的几个重要术语4.1、WSDL(web service definition language)
  WSDL是webservice定义语言, 对应.wsdl文档, 一个webservice会对应一个唯一的wsdl文档, 定义了客户端与服务端发送请求和响应的数据格式和过程4.2、SOAP(simple object  access protocal)
  SOAP是"简单对象访问协议"是一种简单的、基于HTTP和XML的协议, 用于在WEB上交换结构化的数据soap消息:请求消息和响应消息4.3、SEI(WebService EndPoint Interface)
  SEI是web service的终端接口,就是WebService服务器端用来处理请求的接口4.4、CXF(Celtix + XFire)
  一个apache的用于开发webservice服务器端和客户端的框架。

首先定义两个webService功能接口

@WebServicepublic interface WebserviceI {
    @WebMethod    public String sayHello(String name);
    @WebMethod    public String sayBye(String name);
}

@WebServicepublic interface Webservice2I {
    @WebMethod    public String run(String name);
    @WebMethod    public String lover(String name);
}

然后实现webService功能接口

@WebServicepublic class WebServiceImpl implements WebserviceI {

    @Override    public String sayHello(String name) {
        String result = "你好,"+name;
        System.out.println(result);        return result;
    }

    @Override    public String sayBye(String name) {
        String result = "再见,"+name;
        System.out.println(result);        return result;
    }

}
@WebServicepublic class WebService2Impl implements Webservice2I {
    
    @Override    public String run(String name) {
        String result = "not flash , but have to run."+name;
        System.out.println(result);        return result;
    }
    
    @Override    public String lover(String name) {
        String result = "dyl,"+name;
        System.out.println(result);        return result;
    }
}

最后发布出去,我们用三种示例方式发布

1.直接在java类中发布

public static void main(String[] args) {        //必须要是部署机器的ip,端口也要开,我就用tomcat的端口了
        String address = "http://222.222.221.137:8080/WS_Server/Webservice";        //用endpoint发布webservice
        Endpoint.publish(address, new WebServiceImpl());
        System.out.println("通过java文件部署webservice成功");
    }

2.通过设置servlet自动加载初始化,用servlet发布

public class TestServlet extends HttpServlet {

    @Override    public void init() throws ServletException {        //必须要是部署机器的ip,端口也要开,我就用tomcat的端口了
        String address = "http://222.222.221.137:8088/WS_Server/Webservicesss";        //用endpoint发布webservice
        Endpoint.publish(address, new WebServiceImpl());
        System.out.println("通过httpservlet部署webservice成功");
    }
    
}
其中要在web.xml配置中配置
 通过servlet部署 -->    
  <servlet>    
      <servlet-name>InitServletservlet-name>  
      <servlet-class>com.qy.servlet.TestServletservlet-class>  
      <init-param>  
          <param-name>usernameparam-name>  
          <param-value>qyparam-value>  
      init-param>  
       此处指定加载顺序为2,表明还有优先级更高的Servlet要先执行,数值越小,优先级越高   -->
      <load-on-startup>1load-on-startup>  
  servlet>  
  <servlet-mapping>    
      <servlet-name>InitServletservlet-name>  
      <url-pattern>/url-pattern>  
  servlet-mapping>

3.通过用ServletContextListener发布

public class contextlistener implements ServletContextListener {
    @Override    public void contextDestroyed(ServletContextEvent arg0) {
    }
    
    @Override    public void contextInitialized(ServletContextEvent arg0) {        //必须要是部署机器的ip,端口也要开,我就用tomcat的端口了
        String address = "http://222.222.221.137:8087/WS_Server2/Webservices2";        //用endpoint发布webservice
        Endpoint.publish(address, new WebService2Impl());
        System.out.println("通过servletcontextlistener部署webservice成功");
    }

}

web.xml中配置

<listener>  
      <listener-class>com.qy.servletcontextlistener.contextlistenerlistener-class>  
  listener>

还有其他启动的方法,比如过滤器,使用ioc容器的可以在xml中配置

 

这下就好了,在浏览器中输入地址然后可以显示成这样子的

 webService开发(JDK版)_webService

如果是demo,那么久结束了。

但是!!!浏览器的url请求成功并不代表这个接口可以调用!!!!一定要用专业的工具测试!!!!昨天就是另外一家公司的webservice部署好之后浏览器查看没事就溜了,结果根本不能调用,这里我们用wsCaller.jar测试.

 

webService开发(JDK版)_webService_02

这里是源码和测试工具,有兴趣的可以看一下

JDK中wsimport命令

wsimport -keep -d D:\logs\d -s D:\logs\s -p com.qy.clent -verbose http://222.222.221.137:8081/WS_Server/Webservice?wsdl

-keep:是否生成java源文件

-d:指定.class文件的输出目录

-s:指定.java文件的输出目录

-p:定义生成类的包名,不定义的话有默认包名

-verbose:在控制台显示输出信息

webService开发(JDK版)_webService_03

生成客户端代码,测试是否可以使用

       /*try {  
            //服务WSDL Document的地址  
            URL url = new URL("http://222.222.221.137:8081/WS_Server/Webservice?wsdl");  
            //1.Qnameqname是qualified name 的简写  
            //2.构成:由名字空间(namespace)前缀(prefix)以及冒号(:),还有一个元素名称构成  
            //由发布的wsdl可知namespace为http://server.ws.platform.whaty.com/,  
            QName qname=new QName("http://interf.qy.com/","WebServiceImplService");  
            Service service=Service.create(url, qname);  
            WebServiceImpl ms=service.getPort(WebServiceImpl.class);  
            String re = ms.sayHello("qy");
            System.out.println(re);
        } catch (Exception e) {  
            e.printStackTrace();  
        }*/
        WebServiceImplService ss = new WebServiceImplService();
        WebServiceImpl webServiceImplPort = ss.getWebServiceImplPort();
        String result = webServiceImplPort.sayBye("qy");
        System.out.println(result);

结果

webService开发(JDK版)_(JDK_04