WebService

无缺格式见:https://www.zybuluo.com/Spancymath/note/1623555java

什么是WebService?web

基于web的服务,使用Web(HTTP)方式,接收和响应外部系统的某种请求,从而实现远程调用。ajax

名词解释

  1. XML: Extensible Markup Language - 扩展性标记语言
    用于传输格式化数据
  2. WSDL: WebService Description Language - Web服务描述语言
    经过XML形式说明服务在什么地方
    经过XML形式说明服务提供什么样的方法
  3. SOAP: Simple Object Access Protocol - 简单对象访问协议
    SOAP = 在HTTP的基础上+XML数据
    组成:Envelope(必须)+ Headers(可选)+ Body(必须)

在Java项目中发布WS服务

  1. 在类上添加@WebService注解
  2. 经过EndPoint发布一个WebService
    a.给类添加@WebService注解后,类中的全部非静态、非final方法都将会对外公布
    b.若是不但愿某个方法不对外公开,能够在方法上添加@WebService(Exclude=true)
//一、添加注解
@WebService
public class OneService {
   //二、至少包含一个能够对外公开的服务
   public String sayHello(String name){
   System.err.println("invoke "+name);
   return "Hello "+name;
   }
   public static void main(String[] args) {
   //三、第一个参数称为Binding即绑定地址,
   //第二个参数是实现者,即谁提供服务
   Endpoint.publish("http://localhost:9999/one", new OneService());
   }
}
//4.在IE地址栏输入如下地址访问说明文件:
http://localhost:9999/one?wsdl
  1. 经过wsimport生成本地代码spring

    经常使用参数为:
    -d <目录> - 将生成.class文件。默认参数。
    -s <目录> - 将生成.java文件。
    -p <生成的新包名> -将生成的类,放于指定的包下。
    (wsdlurl) - http://server:port/service?wsdl,必须的参数。
    示例:
    C:/> wsimport –s . http://192.168.0.100/one?wsdl apache

  2. 总结
    WebService和Web服务器的区别:WebService是Web服务器的应用,Web服务器是WebService运行所必须的容器。
    WebService其内部是经过Socket实现的。编程

WebService的特色:服务器

  • WebService经过HTTP POST方式接受客户的请求
  • WebService与客户端之间通常使用SOAP协议传输XML数据.
  • 它自己就是为了跨平台或跨语言而设计的。

客户端调用WebService

  1. 经过wsimport生成客户端代码
  2. 经过客户端编程的方式调用
  3. 经过ajax调用 (js+XML)
var xhr = new XMLHttpRequest();
           function sedAjax() {
               var url = "http://localhost:8081/hello";
               var nameText = document.getElementById("name").value;
               var request = "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">" +
                   "<soap:Body><ns2:sayHi xmlns:ns2=\"http://server/\">" +
                   "<arg0>" + nameText + "</arg0></ns2:sayHi></soap:Body></soap:Envelope>";
               $.ajax({
                   url: url,
                   type: "post",
                   contentType: "application/soap+xml;charset=utf-8",
                   data: request,
                   success: function (data) {
                       alert($(data).find("return").text());
                   }
               })

           }
  1. 经过URLConnection调用

SOAP请求过程分析app

  • 使用get方式获取wsdl文件,称为握手。
    对于JDK1.6生成的ws服务,因为内部有一两个配置文件,因此会发出两次get请求。其余的通常为一次。
  • 用户发出请求将使用post方式。
  • 服务器响应成功。

CXF

  1. 使用ServerFactoryBean发布应用
  • 使用CXF发布一个服务,与JDK6发布一个服务彻底不一样
    即便是不使用@WebService注解,同样能够发布成功
    即便此类没有对外公布的方法同样能够发布成功
public class CxfServer1 implements ICxfServer1 {

   public String sayHi(String name) {
       return "Hello " + name;
   }

   public static void main(String[] args) {
       //声明实例,使用ServerFactoryBean发布服务
       //使用CXF发布一个服务,与JDK6发布一个服务彻底不一样
       //* 即便是不使用@WebService注解,同样能够发布成功
       //* 即便此类没有对外公布的方法同样能够发布成功
       ServerFactoryBean bean = new ServerFactoryBean();
       //绑定到发布地址的端口
       bean.setAddress("http://localhost:8080/cxf");
       //设置服务接口,若是没有接口,则为本类
       bean.setServiceClass(ICxfServer1.class);
       //设置接口实现类,即服务类
       bean.setServiceBean(new CxfServer1());
       //发布服务
       bean.create();

       System.err.println("启动成功");
   }
}
  1. 使用JaxWsServerFactoryBean(建议使用此类)发布应用
  • JaxWsServerFactoryBean是ServerFactoryBean的子类,也是功能扩展类。
  • 但在CXF的API文档中没有提供此类API,请经过查看源代码的方式获取此类的帮助。
  • 此类,必需要在被发布为服务的类上添加@WebService注解,若是不加注解,虽然不
    出错,但也不会对外暴露任何方法。
    使用此类生成的wsdl文件更加规范。
public class HelloImpl implements IHello {
   @Override
   public String sayHi(String name) {
       System.out.println("syaHi called");
       return "Hello2 " + name;
   }

   public static void main(String[] args) {
       //使用jaxWs对其进行发布
       JaxWsServerFactoryBean bean = new JaxWsServerFactoryBean();
       //设置访问地址
       bean.setAddress("http://localhost:8081/hello");
       //注册服务接口
       bean.setServiceClass(IHello.class);
       //注册服务实现类
       bean.setServiceBean(new HelloImpl());

       //添加消息拦截器
       bean.getInInterceptors().add(new LoggingInInterceptor());
       bean.getOutInterceptors().add(new LoggingOutInterceptor());

       //启动
       bean.create();
       System.out.println("服务启动完成...");
   }

WebService-CXF-Spring 基于web的cxf

  1. 因为cxf的web项目已经集成了Spring因此,cxf的服务类都是在spring的配置文件中完成的。如下是步骤:
  • 第一步:创建一个web项目。
  • 第二步:准备全部jar包。将cxf_home\lib项目下的全部jar包所有copy到新项目的lib目录下,里面已经包含了spring3.0的jar包。
  • 第三步:在web.xml中配置cxf的核心servlet,CXFServlet。
<servlet>
       <servlet-name>cxf</servlet-name>
       <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
       <!--<init-param>
           <param-name>config-location</param-name>
           <param-value>classpath:cxf-servlet.xml</param-value>
       </init-param>-->
       <load-on-startup>1</load-on-startup>
   </servlet>

   <servlet-mapping>
       <servlet-name>cxf</servlet-name>
       <url-pattern>/ws/*</url-pattern>
   </servlet-mapping>
  • 第四步:建立(最好是Copy)cxf-servlet.xml文件。这是一个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:jaxws="http://cxf.apache.org/jaxws"
      xmlns:soap="http://cxf.apache.org/bindings/soap"
      xsi:schemaLocation="http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans.xsd
      http://cxf.apache.org/bindings/soap
      http://cxf.apache.org/schemas/configuration/soap.xsd
      http://cxf.apache.org/jaxws
      http://cxf.apache.org/schemas/jaxws.xsd">
   <!-- 引入CXF Bean定义以下,早期的版本中使用 -->
   <import resource="classpath:META-INF/cxf/cxf.xml" />
   <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
   <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
   <!-- 简单发布,没有接口 -->
   <jaxws:endpoint id="helloService" address="/hello" implementor="com.zhang.server1.HelloImpl">
       <!--客户端请求的消息拦截器-->
       <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:endpoint>
相关文章
相关标签/搜索