WebService就是这么简单(四)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 首先我们来谈一下为什么需要学习webService这样的一个技术吧….

uddi

uddi (Universal Description, Discovery and Integration)统一描述、发现、集成

  • 它是目录服务,通过该服务可以注册和发布webservcie,以便第三方的调用者统一调用
  • 用得并不太多。


实现接口的webservice


服务端


import javax.jws.WebService;
/**面向接口的webservice发布方式
 * 
 * 
 */
@WebService
public interface JobService {
    public String getJob();
}
import javax.jws.WebService;
@WebService(endpointInterface="cn.it.ws.e.JobService")//设置服务端点接口 ,指定对外提供服务的接口
public class JobServiceImpl implements JobService {
    @Override
    public String getJob() {
        return "JEE研发工程师|Android研发工程师|数据库工程师|前端工程师|测试工程师|运维工程师";
    }
    public void say(){
        System.out.println("早上好!");
    }
}


客户端


import javax.xml.ws.Endpoint;
public class Test {
    public static void main(String[] args) {
        JobService jobService=new JobServiceImpl();
        String address="http://192.168.114.10:9999/ws/jobservice";
        Endpoint.publish(address, jobService);
        System.out.println("wsdl地址:"+address+"?WSDL");
    }
}


CXF框架


Apache CXF 是一个开源的 Services 框架,CXF 帮助您来构建和开发 Services 这些 Services 可以支持多种协议,比如:SOAP、POST/HTTP、RESTful HTTP CXF 大大简化了 Service可以天然地和 Spring 进行无缝集成。

CXF介绍 :soa的框架

  • * cxf 是 Celtrix (ESB框架)和 XFire(webserivice) 合并而成,并且捐给了apache  
  • * CxF的核心是org.apache.cxf.Bus(总线),类似于Spring的 ApplicationContext
  • * CXF默认是依赖于Spring的
  • * Apache CXF 发行包中的jar,如果全部放到lib中,需要 JDK1.6 及以上,否则会报JAX-WS版本不一致的问题
  • * CXF 内置了Jetty服务器 ,它是servlet容器,好比tomcat

CXF特点

  • 与Spring、Servlet做了无缝对接,cxf框架里面集成了Servlet容器Jetty
  • 支持注解的方式来发布webservice
  • 能够显示一个webservice的服务列表
  • 能够添加拦截器:输入拦截器、输出拦截器 :
  • 输入日志信息拦截器、输出日志拦截器、用户权限认证的拦截器


CXF开发


要想使用CXF框架,那么就先导入jar包

  • asm-3.3.jar
  • commons-logging-1.1.1.jar
  • cxf-2.4.2.jar
  • jetty-continuation-7.4.5.v20110725.jar
  • jetty-http-7.4.5.v20110725.jar
  • jetty-io-7.4.5.v20110725.jar
  • jetty-security-7.4.5.v20110725.jar
  • jetty-server-7.4.5.v20110725.jar
  • jetty-util-7.4.5.v20110725.jar
  • neethi-3.0.1.jar
  • wsdl4j-1.6.2.jar
  • xmlschema-core-2.0.jar

接口


import javax.jws.WebParam;
        import javax.jws.WebResult;
        import javax.jws.WebService;
@WebService(serviceName="languageManager")
public interface LanguageService {
    public @WebResult(name="language")String getLanguage(@WebParam(name="position")int position);
}


实现:


package cn.it.ws.cxf.a;
import org.apache.cxf.frontend.ServerFactoryBean;
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
/**开发语言排行描述服务
 * 
 * 
 * @author 李俊  2015年5月17日
 */
public class LanguageServiceImpl implements LanguageService {
    /* (non-Javadoc)
     * @see cn.it.ws.cxf.a.LanguageService#getLanguage(int)
     */
    @Override
    public String getLanguage(int position){
        String language=null;
        switch (position) {
        case 1:
            language="java"; 
            break;
        case 2:
            language="C";
            break;
        case 3:
            language="Objective-C";
            break;  
        case 4:
            language="C#";
            break;
        default:
            break;
        }
        return language;
    }
    /**通过cxf框架发布webservice
     *  1. ServerFactoryBean
     *    - 不设置注解也可以发布webservice服务, 不支持注解
     *    - 不支持拦截器的添加
     *  2. JaxWsServerFactoryBean
     *    - 支持注解
     *    - 可以添加拦截器
     *  3. webservice 访问流程:
     *    1. 检测本地代理描述的wsdl是否与服务端的wsdl一致 ,俗称为握手
     *    2. 通过soap协议实现通信 ,采用的是post请求 , 数据封装在满足soap规约的xml中
     *    3. 返回数据 同样采用的是soap通信,  数据封装在满足soap规约的xml中
     * @param args
    public static void main(String[] args) {
        LanguageService languageService=new LanguageServiceImpl();
        ServerFactoryBean bean=new ServerFactoryBean();
        //Endpoint :地址  , 实现对象
        bean.setAddress("http://192.168.114.10:9999/ws/cxf/languangeService");
        bean.setServiceClass(LanguageService.class);//对外提供webservcie的业务类或者接口
        bean.setServiceBean(languageService);//服务的实现bean
        bean.create();//创建,发布webservice
        System.out.println("wsdl地址:http://192.168.114.10:9999/ws/cxf/languangeService?WSDL");
    }
     */
    public static void main(String[] args) {
        LanguageService languageService=new LanguageServiceImpl();
        JaxWsServerFactoryBean bean=new JaxWsServerFactoryBean();
        //Endpoint :地址  , 实现对象
        bean.setAddress("http://192.168.114.10:9999/ws/cxf/languangeService");
        bean.setServiceClass(LanguageService.class);//对外提供webservcie的业务类或者接口
        bean.setServiceBean(languageService);//服务的实现bean
        //添加输入拦截器  :输入显示日志信息的拦截器
        bean.getInInterceptors().add(new LoggingInInterceptor());
        //添加输出拦截器  :输出显示日志信息的拦截器
        bean.getOutInterceptors().add(new LoggingOutInterceptor());
        bean.create();//创建,发布webservice
        System.out.println("wsdl地址:http://192.168.114.10:9999/ws/cxf/languangeService?WSDL");
    }
}


CXF与Spring集成


  • 建立一个web项目
  • 准备所有jar包,将CXF_HOME\lib项目下的所有jar包,全部都拷贝新项目的lib目录下.其中里面已经包含了Sring3.0的jar包  其中jetty 服务器的包可以不要.因为我们要部署的tomcat服务器中了
  • 在web.xml中配置cxf的核心servlet,CXFServlet
  • 此配置文件的作用类 拦截/ws/*的所有请求 类似Struts2的过滤器

web.xml配置文件:


<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         version="3.0">
    <display-name>CXF_Server</display-name>
    <!-- 添加  CXF 的Servlet ,处理 webservice的请求 -->
    <servlet>
        <servlet-name>cxf</servlet-name>
        <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
        <load-on-startup>0</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>cxf</servlet-name>
        <url-pattern>/ws/*</url-pattern>
    </servlet-mapping>
    <!-- Spring 监听添加 -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>
</web-app>


实体:


public class Employee {
    private Integer  id;
    private String name;
    private Integer age;
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
}


接口:


package cn.it.ws.cxf.b;
import java.util.List;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import cn.it.ws.cxf.bean.Employee;
@WebService(serviceName="EmployeeService")
public interface EmployeeManager {
    void add(@WebParam(name="employee")Employee employee);
    @WebResult(name="employees")List<Employee> query();
}


接口实现:


package cn.it.ws.cxf.b;
import java.util.ArrayList;
import java.util.List;
import cn.it.ws.cxf.bean.Employee;
/**员工管理的业务实现类
 * @author 李俊  2015年5月17日
 */
public class EmployeeManagerImpl implements EmployeeManager {
    private List<Employee> employees=new ArrayList<>();
    @Override
    public void add(Employee employee){
        //添加到集合中
        employees.add(employee);
    }
    @Override
    public List<Employee> query(){
        return employees;
    }
}


Spring配置信息:


<?xml version="1.0" encoding="UTF-8"?>
<beans
        xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:p="http://www.springframework.org/schema/p"
        xmlns:jaxws="http://cxf.apache.org/jaxws"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
      http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
    <bean id="employeeManagerImpl" class="cn.it.ws.cxf.b.EmployeeManagerImpl"></bean>
    <!-- 配置cxf
       地址:      http://192.168.114.10:8080/CXF_Server/ws/employeeManager
       组成 :  http://192.168.114.10:8080 +CXF_Server( 项目名)+ws(过滤的路径)+/employeeManager(自定义部分)
       服务类 :
       服务的实现类:
       拦截器
        -->
    <jaxws:server address="/employeeManager" serviceClass="cn.it.ws.cxf.b.EmployeeManager">
        <jaxws:serviceBean>
            <ref bean="employeeManagerImpl"/>
        </jaxws:serviceBean>
        <!-- 配置输入显示日志信息的拦截器   -->
        <jaxws:inInterceptors>
            <bean class="org.apache.cxf.interceptor.LoggingInInterceptor"></bean>
        </jaxws:inInterceptors>
        <jaxws:outInterceptors>
            <bean class="org.apache.cxf.interceptor.LoggingOutInterceptor"></bean>
        </jaxws:outInterceptors>
    </jaxws:server>
</beans>


IDEA下使用webservice


我们的Intellij idea是一个非常好用的java ide,当然了,它也支持webservice开发。非常好用…由于在网上见到的教程非常多,我就贴几个我认为比较好的教程:

http://www.biliyu.com/article/986.html

http://blog.csdn.net/u010323023/article/details/52926051

http://blog.csdn.net/dreamfly88/article/details/52350370


获取天气预报


我们现在webservice就基本入门了,现在我想要做的就是自己写的网站能够拿到天气预报的信息,于是我去http://www.webxml.com.cn/zh_cn/index.aspx找到了天气预报的服务

这个是天气预报的WSDL地址:http://ws.webxml.com.cn/WebServices/WeatherWS.asmx,那么我们只要解析该WSDL服务即可

59.jpg这里写图片描述

如果不想得到所有的信息,那么我们可以在服务上找到我们想要对应的数据,也就是说:

60.jpg这里写图片描述61.jpg这里写图片描述



总结

  • 应用webservice的原因就在于我们需要一些服务、这些服务是我们自己不能手动写的。比如天气预报,于是就出现了webService技术。webService能够让我们可以获取网上别人发布出来的服务。我们只要调用它,就可以获取相关的数据了。
  • Socket其实就是对TCP/IP协议的一个封装,而我们在网上使用的是HTTP协议。WebService也是Web应用程序。它也当然支持HTTP协议了。不过WebService需要给不同语言都能够使用,因此它使用XML来进行传输。
  • 于是,它就有自己一种协议:SOAP(简单对象访问协议)。其实SOAP就是Http+XML
  • 我们可以使用http-get方式访问webservice,由于它使用的是原生Socket来进行访问。会有点复杂。于是我们可以借助Http-Client 框架来访问WebService。Http-Client 框架比HTTP-GET方式会简单一点。但还是不够简洁。
  • 最后,我们可以使用Java自带的WsImport来实现本地代理。这种方法会将WebService翻译成Java类,我们使用类一样去访问WebService就行了。非常好用。
  • 我们是可以自己写webService的。对服务类上加上注解。通过EndPoint(端点服务)就能够把我们webService服务类发布出去了。
  • 为了让WDSL文件更加读取,可以使用注解的方式来写好对应的参数名称。
  • 也可以控制某方法是否被发布出去
  • SOAP其实上就是使用XML进行传输的HTTP协议。
  • SOA:面向服务架构。即插即用。也就是耦合非常低,用的时候加上就行了。
  • UDDI (Universal Description, Discovery and Integration)统一描述、发现、集成,其实就是一个webservice的目录结构,不过我们很少把webservice发布到上面去
  • 实现接口的webservice只是在类上对其的一种抽象而已,没什么大不了的。
  • CXF框架可以与spring无缝连接,就不用我们自己Endpoint了。它还能记录日志之类的。
  • 我们还可以使用Idea下的webservice,能够使用图形画面的方式获取本地代理和生成WSDL文件。
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
3月前
WebService rwsp:NoRunningCommunicationPointAvailable
WebService rwsp:NoRunningCommunicationPointAvailable
34 0
|
6月前
|
XML Java 网络架构
Webservice使用
Webservice使用
80 2
|
6月前
|
API 数据库 网络架构
REST WebService与SOAP WebService的比较
REST WebService与SOAP WebService的比较
|
6月前
|
XML 网络协议 网络架构
WebService - 基础详解
WebService - 基础详解
373 0
强!webservice中常用注解——@WebService @WebMethod大揭秘
强!webservice中常用注解——@WebService @WebMethod大揭秘
824 0
强!webservice中常用注解——@WebService @WebMethod大揭秘
|
XML 网络协议 JavaScript
WebService就是这么简单(一)
首先我们来谈一下为什么需要学习webService这样的一个技术吧….
293 0
WebService就是这么简单(一)
|
XML 缓存 IDE
WebService就是这么简单(二)
首先我们来谈一下为什么需要学习webService这样的一个技术吧….
227 0
WebService就是这么简单(二)
|
Java 网络架构
WebService就是这么简单(三)
首先我们来谈一下为什么需要学习webService这样的一个技术吧….
199 0
WebService就是这么简单(三)
|
XML Dubbo Java
WebService |学习笔记
快速学习 WebService
173 0
WebService |学习笔记