基于web的服务,服务器整理资源供多个客户端应用访问,是一种多个跨平台跨语言的应用间通信整合的方案

使用场景:天气预报、股票、地图,火车票

schema约束复习

  1. <!-- book.xsd,定义schema约束 -->
  2. <?xml version="1.0" encoding="UTF-8"?>
  3. <schema xmlns="http://www.w3.org/2001/XMLSchema";
  4. targetNamespace="http://www.mabaoqing.cn"; elementFormDefault="qualified">
  5. <element name="书架">
  6. <!-- 可以有多个不同的子标签,须在下方使用element定义· -->
  7. <complexType>
  8. <!-- 集合,默认最小最大均为1,设置为无最大限制 -->
  9. <sequence maxOccurs="unbounded">
  10. <element name="书">
  11. <complexType>
  12. <sequence>
  13. <element name="书名" type="string"></element>
  14. <element name="作者" type="string"></element>
  15. <element name="价格" type="double"></element>
  16. </sequence>
  17. </complexType>
  18. </element>
  19. </sequence>
  20. </complexType>
  21. </element>
  22. </schema>
  23. <!-- xml文档引用schema定义的book.xsd文档 -->
  24. <?xml version="1.0" encoding="UTF-8"?>
  25. <书架 xmlns="http://www.mabaoqing.cn";
  26. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
  27. xsi:schemaLocation="http://www.mabaoqing.cn book.xsd">
  28. <!--
  29. Schema规范:★★★★★
  30. 1.所有标签和属性必须在schema中定义
  31. 2.所有schema文件必须有个id,在这里叫namespace(ns,如xmlns引入)
  32. 3.ns由targetNamespace属性指定,值是一个url(可能不存在)
  33. 定义自己的用targetNamespace,引入用xmlns属性
  34. 如果引入的schema不是w3c定义的,必须指定schema文件的位置(xsi(别名):schemaLocation),spring中常用
  35. xmlns通常写为自己的schema,否则需要为xml中每个标签加别名前缀,如xsi:书架
  36. -->
  37. <书>
  38. <书名>海底两万里</书名>
  39. <作者>鲁宾孙</作者>
  40. <价格>58.0</价格>
  41. </书>
  42. </书架>

几个重要术语

WSDL:webservice definition language,webservice定义语言

  • 定义了webservice的服务器段和客户端应用交互传递请求和响应数据的格式和方式。
  • 一个webservice对应一个唯一的wsdl文档。

SOAP:simple object access protocal,简单对象访问协议

  • 一种简单的,基于HTTP、XML的网络传输协议,用于在web上交换结构化的数据。
  • soap消息:请求和响应消息

SEI:webservice endpoint interface,webservice终端接口

  • 就是webservice用来处理请求的接口

CXF:Celtix + XFires,一个apache的用于开发webservice服务器和客户端的框架。

WebService请求流程

wsdl基本结构

  • wsdl:definitions:根标签

    • wsdl:types:schema定义了标签结构
    • wsdl:message:用来定义消息的结构

      • part:引用types中定义的标签片段
    • wsdl:portType:用来定义服务器端的SEI

      • operation:用来指定SEI中的方法

        • input/output:引用message
    • wsdl:binding:定义SEI的实现类(type属性引用portType标签)

    • wsdl:service: 服务器端的一个webservice容器

      • name:用于指定容器类(get方法)

      • port:用于指定一个服务器处理请求的入口(SEI的实现)

        • binding属性引用上面定义的binding
        • address:服务器地址

JDK1.6+开发WebService

  • 接口:@WebService类注解,@WebMethod方法注解
  • 实现:@WebService类注解
  • 发布:EndPoint.publish(address, implmentor);

根据wsdl调用webservice

cmd命令行进入相应目录,使用以下命令生成服务器端提供的类源文件:

  1. wsimport -keep url/file(jdk)

  2. wsdl2java url/file(cxf,添加path路径)

java调用.net的webservice错误处理:

将wsdl文档中的所有

改为:

<s:any minOccurs="2" maxOccurs="2"/

CXF所需的jar包及依赖

  1. <properties>
  2. <cxf.version>3.1.12</cxf.version>
  3. </properties>
  4. <dependencies>
  5. <dependency>
  6. <groupId>org.apache.cxf</groupId>
  7. <artifactId>cxf-rt-frontend-jaxws</artifactId>
  8. <version>${cxf.version}</version>
  9. </dependency>
  10. <dependency>
  11. <groupId>org.apache.cxf</groupId>
  12. <artifactId>cxf-rt-transports-http</artifactId>
  13. <version>${cxf.version}</version>
  14. </dependency>
  15. <!-- Jetty is needed if you're are not using the CXFServlet -->
  16. <dependency>
  17. <groupId>org.apache.cxf</groupId>
  18. <artifactId>cxf-rt-transports-http-jetty</artifactId>
  19. <version>${cxf.version}</version>
  20. </dependency>
  21. </dependencies>

CXF拦截器

分类:入/出,客户端/服务器端

客户端:ClientProxy.getClient(obj).getInInterceptors().add(new LoggingInInterceptor());

服务器:EndpointImpl endpoint = (EndpointImpl) publish;

​ endpoint.getOutInterceptors().add(new LoggingInInterceptor());

自定义拦截器:extends AbstractPhaseInterceptor

添加构造方法指定拦截时间

  1. public MyInteceptor() {
  2. super(Phase.PRE_PROTOCOL); //协议化时进行拦截
  3. }

CXF集成Spring发布

首先配置服务器端的web.xml

  1. <context-param>
  2. <param-name>contextConfigLocation</param-name>
  3. <param-value>classpath:spring.xml</param-value>
  4. </context-param>
  5. <listener>
  6. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  7. </listener>
  8. <servlet>
  9. <servlet-name>cxfServlet</servlet-name>
  10. <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
  11. <load-on-startup>1</load-on-startup>
  12. </servlet>
  13. <servlet-mapping>
  14. <servlet-name>cxfServlet</servlet-name>
  15. <url-pattern>/*</url-pattern>
  16. </servlet-mapping>

spring.xml

  1. <beans xmlns="http://www.springframework.org/schema/beans";
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; xmlns:jaxws="http://cxf.apache.org/jaxws";
  3. xsi:schemaLocation="http://www.springframework.org/schema/beans
  4. http://www.springframework.org/schema/beans/spring-beans.xsd
  5. http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd";>
  6. <!-- 低版本还会有个 cxf-extension-soap.xml 文件 -->
  7. <import resource="classpath:META-INF/cxf/cxf.xml" />
  8. <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
  9. <jaxws:endpoint id="orderWS" implementor="cn.mbq.cxf.spring.OrderWSImpl" address="/OrderWS" >
  10. <!-- 配置服务器端的入拦截器 -->
  11. <jaxws:inInterceptors>
  12. <bean class="org.apache.cxf.interceptor.LoggingInInterceptor"></bean>
  13. </jaxws:inInterceptors>
  14. </jaxws:endpoint>
  15. </beans>

然后配置客户端,首先生成服务器端代码,再添加配置文件:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans";
  3. xmlns:jaxws="http://cxf.apache.org/jaxws"; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. http://www.springframework.org/schema/beans/spring-beans.xsd
  6. http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd";>
  7. <!-- OrderWS orderWS = context.getBean("orderClient") -->
  8. <jaxws:client id="orderClient" serviceClass="cn.mbq.cxf.spring.OrderWS"
  9. address="http://localhost:8080/ws_cxf_spring/OrderWS";/>
  10. </beans>

Ajax跨域访问

localhost与ip地址不再同一域内

仍然请求本地服务器,在本地服务器请求外网资源(使用URL获取HttpURLConnection对象)

  1. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  2. int id = Integer.parseInt(req.getParameter("id"));
  3. String requestData = "<soapenv:Envelope xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'; xmlns:q0='http://spring.cxf.mbq.cn/'; xmlns:xsd='http://www.w3.org/2001/XMLSchema'; xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'><soapenv:Body><q0:getOrderById><arg0>"; + id + "</arg0></q0:getOrderById></soapenv:Body></soapenv:Envelope>";
  4. URL url = new URL("http://192.168.199.203:8080/ws_cxf_spring/OrderWS";);
  5. HttpURLConnection connection = (HttpURLConnection) url.openConnection();
  6. connection.setRequestMethod("POST");
  7. connection.setDoOutput(true);
  8. connection.setDoInput(true);
  9. connection.setRequestProperty("Content-Type", "text/xml;charset=utf-8");
  10. OutputStream os = connection.getOutputStream();
  11. os.write(requestData.getBytes("utf-8"));
  12. os.flush();
  13. int code = connection.getResponseCode();
  14. if(code==200){
  15. InputStream in = connection.getInputStream();
  16. byte[] buffer = new byte[1024];
  17. int len = 0;
  18. while((len=in.read(buffer))>0) {
  19. resp.getOutputStream().write(buffer, 0, len);
  20. }
  21. }
  22. }

WebService学习小结的更多相关文章

  1. 调用webService学习小结

    这段时间项目进行到了最后时刻,但是还有很多需求没有搞清楚,眼看deadline越来越近,压力也越来越大.现在我的主要工作是将别人开发好的一个系统给加载到我们系统中,使用的方法是通过webService ...

  2. webService学习之路(三):springMVC集成CXF后调用已知的wsdl接口

    webService学习之路一:讲解了通过传统方式怎么发布及调用webservice webService学习之路二:讲解了SpringMVC和CXF的集成及快速发布webservice 本篇文章将讲 ...

  3. flex学习小结

    接触到flex一个多月了,今天做一个学习小结.如果有知识错误或者意见不同的地方.欢迎交流指教. 画外音:先说一下,我是怎么接触到flex布局的.对于正在学习的童鞋们,我建议大家没事可以逛逛网站,看看人 ...

  4. Python 学习小结

    python 学习小结 python 简明教程 1.python 文件 #!/etc/bin/python #coding=utf-8 2.main()函数 if __name__ == '__mai ...

  5. react学习小结(生命周期- 实例化时期 - 存在期- 销毁时期)

    react学习小结   本文是我学习react的阶段性小结,如果看官你是react资深玩家,那么还请就此打住移步他处,如果你想给一些建议和指导,那么还请轻拍~ 目前团队内对react的使用非常普遍,之 ...

  6. objective-c基础教程——学习小结

    objective-c基础教程——学习小结   提纲: 简介 与C语言相比要注意的地方 objective-c高级特性 开发工具介绍(cocoa 工具包的功能,框架,源文件组织:XCode使用介绍) ...

  7. pthread多线程编程的学习小结

    pthread多线程编程的学习小结  pthread 同步3种方法: 1 mutex 2 条件变量 3 读写锁:支持多个线程同时读,或者一个线程写     程序员必上的开发者服务平台 —— DevSt ...

  8. ExtJs学习笔记之学习小结LoginDemo

    ExtJs学习小结LoginDemo 1.示例:(登录界面) <!DOCTYPE html> <html> <head> <meta charset=&quo ...

  9. [未完成]WebService学习第一天学习笔记

    [未完成]WebService学习第一天学习笔记[未完成]WebService学习第一天学习笔记

随机推荐

  1. Linux内存管理之页面回收【转】

    转自:http://blog.csdn.net/bullbat/article/details/7311205 请求调页机制,只要用户态进程继续执行,他们就能获得页框,然而,请求调页没有办法强制进程释 ...

  2. 30 分钟学会 Flex 布局

    30 分钟学会 Flex 布局 有酒   617 人赞同了该文章 为什么我要写这一篇关于 Flex 布局的教程? 因为它十分简单灵活,区区简单几行代码就可以实现各种页面的的布局,以前我在学习页面布局的 ...

  3. 小程序收集formid跳转后收集不到

    为了突破微信小程序模板消息限制,需收集到足够的推送码,即每次提交表单时获取到的formId.一个formId代表着开发者有向当前用户推送模板消息的一次权限.当表单组件中的属性report-submit ...

  4. (2).net web api 请求方式与参数

    一.GET 二.POST 如果方法名前缀不带GET 默认为POST请求方法 1.无参数 2.带一个参数 客户端请求时,名称必须为空,不能是dictCategory.不是空的话,会返回空数据 [ ] 3 ...

  5. (1)powershell使用帮助

    一.更新下载帮助 初始powershell是没有文档的,需要用指令更新下载到本地 管理员运行 update-help 好像有的模块需要FQ才能下载 ?? 帮助文档的开源地址  github.com/p ...

  6. Doki Doki Literature Club

    Doki Doki Literature Club! is a visual novel developed by Team Salvato. The protagonist is invited b ...

  7. 洛谷——2871[USACO07DEC]手链Charm Bracelet——01背包

    题目描述 Bessie has gone to the mall's jewelry store and spies a charm bracelet. Of course, she'd like t ...

  8. Flash3D学习计划(二)——理解世界,取景,投影变换,并理解投影坐标系

    各种坐标系都是有用的,因为某些信息只能在特定场景中才有意义. 一. 世界坐标系 世界坐标系是一个特殊的坐标系,它建立了描述其他坐标系所需要的参考框架.这就意味着,能够用世界坐标系描述其他坐标系的位置, ...

  9. Radius报文解析

    RADIUS ,是远程认证拨号用户服务的简称.RADIUS原先设计的目的是为拨号用户进行认证和计费.后来经过多次改进,形成了一项通用的认证计费协议,主要完成在网络接入设备和认证服务器之间承载认证.授权 ...

  10. MailKit---如何知道文件夹下有多少封未读邮件

    如果在mailkit中,文件夹已经选中并打开了的话,那直接使用ImapFolder.Unread属性就可以获取到有多少封未读邮件了. 如果文件夹没有打开,那么你还可以使用查询状态的方法来获取未读状态的 ...