一、概述

  1.是什么

  Web service是一个平台独立的,低耦合的,自包含的、基于可编程的web的应用程序,可使用开放的XML标准通用标记语言下的一个子集)标准描述、发布、发现、协调和配置这些应用程序,用于开发分布式的互操作的应用程序。[1] 
  Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件, 就可相互交换数据或集成。依据Web Service规范实施的应用之间, 无论它们所使用的语言、 平台或内部协议是什么, 都可以相互交换数据。Web Service是自描述、 自包含的可用网络模块, 可以执行具体的业务功能。Web Service也很容易部署, 因为它们基于一些常规的产业标准以及已有的一些技术,诸如标准通用标记语言下的子集XML、HTTP。Web Service减少了应用接口的花费。Web Service为整个企业甚至多个组织之间的业务流程的集成提供了一个通用机制。

  // 来自百度百科

  提供webService的参考网址http://www.webxml.com.cn/zh_cn/web_services.aspx

  主要作用是使不同软件系统之间实现互联互通!

  2.必会基础知识 

名词1:XML. Extensible Markup Language -扩展性标记语言
XML,用于传输格式化的数据,是Web服务的基础。
namespace-命名空间。
xmlns=“http://itcast.cn” 使用默认命名空间。
xmlns:itcast=“http://itcast.cn”使用指定名称的命名空间。 名词2:WSDL – WebService Description Language – Web服务描述语言。
通过XML形式说明服务在什么地方-地址。
通过XML形式说明服务提供什么样的方法 – 如何调用。
   重点掌握的关系图:——拿到一个WSDL读取方式是从后往前读
  
名词3:SOAP-Simple Object Access Protocol(简单对象访问协议)
SOAP作为一个基于XML语言的协议用于有网上传输数据。
SOAP = 在HTTP的基础上+XML数据。
SOAP是基于HTTP的。
SOAP的组成如下:
Envelope – 必须的部分。以XML的根元素出现。
Headers – 可选的。
Body – 必须的。在body部分,包含要执行的服务器的方法。和发送到服务器的数据。

  其中,WSDL的教程(以及SOAP教程)可以参考菜鸟教程

二、基本入门操作  

  1.生成客户端代码

    使用的是JDK1.6+的wsimport命令,其中两个参数的含义是:

      

  -d<目录>  - 将生成.class文件。默认参数。

  -s<目录>  - 将生成.java文件和class文件。

  -p<生成的新包名> -将生成的类,放于指定的包下。

 

    示例:

    

    // 1表示当前目录,2表示WSDL的地址(当然不限于网络地址,可以另存为.wsdl的本地文件,然后使用本地路径D:/...)

  2.webService客户端调用  

  步骤如下:  

调用webservice步骤
)打开WSDL文档
)从下往上读WSDL文档,先找到Services(服务访问点集合),根据Services里面binding属性找到binding元素,再根据binding元素的type属性找到绑定的portType(服务类)
)根据WSDL的地址生成客户端代码wsimport -s . -p com.rl.trans d:/wsCode/EnglishChinese.wsdl
)把客户端代码拷贝到项目中
)创建服务访问点集合对象
)根据服务访问点获得服务类
)调用服务类的方法

  示例:

    先把上面生成的代码复制到工程

    再在工程中建立测试的类:

  public static void main(String[] args) {
// 创建服务访问点集合
MobileCodeWS mc = new MobileCodeWS();
// 根据服务访问点获得绑定的类
MobileCodeWSSoap serviceClass = mc.getMobileCodeWSSoap();
// 调用具体业务逻辑
String info = serviceClass.getMobileCodeInfo("13407966980", null);
System.out.println("info = " + info);
}

  结果:

  

  另外一个含有mp3(字节流)的示例如下:

public static void main(String[] args) throws Exception {
//创建服务访问点集合
EnglishChinese ec = new EnglishChinese();
//获得服务类
EnglishChineseSoap serviceClass = ec.getEnglishChineseSoap();
//调用服务方法
ArrayOfString aos = serviceClass.translatorString("hello"); List<String> strList = aos.getString();
for(String result : strList){
System.out.println(result);
}
//调用服务方法
byte[] mp3 = serviceClass.getMp3("1059.mp3");
OutputStream out = new FileOutputStream(new File("d:/wsCode/hello.mp3"));
out.write(mp3);
out.flush();
out.close();
}

  3.使用jdk发布webService服务的发布

  步骤如下:

a)@WebService - 它是一个注解,用在类上指定将此类发布成一个webservice服务.
b)Endpoint – 此类为端点服务类,它的方法publish用于将一个已经添加了@WebService注解对象绑定到一个地址的端口上。Endpoint是jdk提供的一个专门用于发布服务的类,它的publish方法接收两个参数,一个是本地的服务地址,二是提供服务的类。它位于javax.xml.ws.*包中。
static Endpoint.publish(String address, Object implementor) 在给定地址处针对指定的实现者对象创建并发布端点。stop方法用于停止服务。
其他注意事项:
1)给类添加上@WebService注解后,类中所有的非静态方法都将会对外公布。不支持静态方法,final方法。
2)如果希望某个方法(非static,非final)不对外公开,可以在方法上添加@WebMethod(exclude=true),阻止对外公开。
3)如果一个类上,被添加了@WebService注解,则必须此类至少有一个可以公开的方法,否则将会启动失败。
4)服务类中不能没有方法
5)@WebMethod(exclude=true)屏蔽方法

  示例:

    服务类:

@WebService
public class HelloServer {
public String sayHello(String name) {
return "hello "+name+" welcome to webService Server";
}
}

    发布服务:

public class ServerPublish {
public static void main(String[] args) {
// 使用JDK发布ws服务,包含发布地址与服务类的两个参数
Endpoint.publish("http://127.0.0.1:8080/hello", new HelloServer());
}
}

    结果:请注意访问地址!

  

  //可以使用第二点客户端的调用进行测试

  4.其它调用webService的方式

    使用原生AJAX调用:

var xhr;
function invoke(){
if(window.ActiveXObject){
xhr = new ActiveXObject("Microsoft.XMLHTTP");
}else{
xhr = new XMLHttpRequest();
}
//指定请求地址
var url = "http://127.0.0.1:7777/hello?wsdl";
//定义请求类型和地址和异步
xhr.open("POST", url, true);
//设置Content-Type
xhr.setRequestHeader("Content-Type", "text/xml;charset=UTF-8");
//指定回调方法
xhr.onreadystatechange = back; var textVal = document.getElementById("mytext").value;
//组装消息体的数据
var data = '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:q0="http://server.hm.com/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">'
+'<soapenv:Body>'
+'<q0:sayHello>'
+'<arg0>'+textVal+'</arg0>'
+'</q0:sayHello>'
+'</soapenv:Body>'
+'</soapenv:Envelope>';
xhr.send(data); }
function back(){
if(xhr.readyState == 4){
if(xhr.status == 200){
var doc = xhr.responseXML;
alert(doc);
alert(xhr.responseText);
var tag = doc.getElementsByTagName("return")[0];
alert(tag) }
}

    使用JQuery封装的AJAX调用:http://www.cnblogs.com/2013likong/p/3472144.html

    使用URLConnection调用

//创建url地址
URL url = new URL("http://192.168.1.104:8080/hello");
//打开连接
URLConnection conn = url.openConnection();
//转换成HttpURL
HttpURLConnection httpConn = (HttpURLConnection) conn;
//打开输入输出的开关
httpConn.setDoInput(true);
httpConn.setDoOutput(true);
//设置请求方式
httpConn.setRequestMethod("POST");
//设置请求的头信息
httpConn.setRequestProperty("Content-type", "text/xml;charset=UTF-8");
//拼接请求消息
String data = "<soapenv:Envelope xmlns:soapenv=" +
"\"http://schemas.xmlsoap.org/soap/envelope/\" " +
"xmlns:q0=\"http://server.rl.com/\" " +
"xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" " +
"xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">"
+"<soapenv:Body>"
+"<q0:sayHello>"
+"<arg0>renliang</arg0> "
+"</q0:sayHello>"
+"</soapenv:Body>"
+"</soapenv:Envelope>";
//获得输出流
OutputStream out = httpConn.getOutputStream();
//发送数据
out.write(data.getBytes());
//判断请求成功
if(httpConn.getResponseCode() == 200){
//获得输入流
InputStream in = httpConn.getInputStream();
//使用输入流的缓冲区
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
StringBuffer sb = new StringBuffer();
String line = null;
//读取输入流
while((line = reader.readLine()) != null){
sb.append(line);
}
//创建sax的读取器
SAXReader saxReader = new SAXReader();
//创建文档对象
Document doc = saxReader.read(new StringReader(sb.toString()));
//获得请求响应return元素
List<Element> eles = doc.selectNodes("//return");
for(Element ele : eles){
System.out.println(ele.getText());
}

  5.复杂数据类型传输

@WebService
public class TestComplexServer { List<Person> pList = new ArrayList<Person>(); public void addPerson(Person person){
pList.add(person);
} public List<Person> getPersonList(){
return pList;
} public static void main(String[] args) {
Endpoint.publish("http://192.168.1.104:8888/person", new TestComplexServer());
}
}

  测试代码:

public static void main(String[] args) {

        //创建服务访问点集合
PersonServerService pss = new PersonServerService();
//根据服务访问点获得绑定的类
PersonServer server = pss.getPersonServerPort();
//调用具体业务逻辑
Person person = new Person();
person.setId(1);
person.setName("zhaoliu");
person.setAge(20);
person.setAddress("xiangyashan"); Person person1 = new Person();
person1.setId(2);
person1.setName("tianqi");
person1.setAge(25);
person1.setAddress("gaolaozhang"); //调用添加人的webservice服务方法
/*server.addPerson(person);
server.addPerson(person1);*/
//调用查询所有人的webservice服务方法
List<Person> pList = server.getPersonAll();
for(Person p : pList){
System.out.println("id: "+p.getId()+" name:"+p.getName() + " age:"+p.getAge() + " address:"+p.getAddress());
}
}

  7.修改WSDL文档

  WSDL文档并非一经发布便不可更改,可供修改项如下:

自动生成的文档的名字有时不规范,可以手动进行修改。
@WebService(
portName="myHelloService",修改端口名字
serviceName="HelloServices",修改服务访问点集合名字
name="HelloService",修改服务类的名字
targetNamespace="hello.rl.com" 修改命名空间名字
) @WebResult(name="sirHello")修改返回值的元素的父标签名字——在方法返回值前加注解修改
@WebParam(name="sir")修改传入参数的元素的父标签名字——在方法参数前加注解修改

  webService参考教程http://www.cnblogs.com/yangang2013/p/5708647.html

WebService第一天——概述与入门操作的更多相关文章

  1. jquery实战第一讲---概述及其入门实例

    就在5月28号周四下午五点的时候,接到xxx姐姐的电话,您是xxx吗?准备一下,周五上午八点半去远洋面试,一路风尘仆仆,颠颠簸簸,由于小编晕车,带着晕晕乎乎的脑子,小编就稀里糊涂的去面试了,温馨提醒, ...

  2. Lucene第一讲——概述与入门

    一.概述 1.什么是Lucene? Lucene是apache下的一个开源的全文检索引擎工具包. 它为软件开发人员提供一个简单易用的工具包(类库),以方便的在目标系统中实现全文检索的功能. 2.能干什 ...

  3. Solr第一讲——概述与入门

    一.solr介绍 1.什么是solr Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器.Solr可以独立运行在Jetty.Tomcat等这些Serv ...

  4. WebService第一天

    WebService第一天 [课程安排]: 整体安排:2天: 第一天:webservice入门,JDK规范和实现:jax-ws,相关概念 第二天:CXF框架,和spring的集成开发.Hessian的 ...

  5. MySql概述及入门(五)

    MySql概述及入门(五) MySQL集群搭建之读写分离 读写分离的理解 为解决单数据库节点在高并发.高压力情况下出现的性能瓶颈问题,读写分离的特性包括会话不开启事务,读语句直接发送到 salve 执 ...

  6. MySQL概述及入门(四)

    MySql概述及入门(四) 什么是MySQL的锁? 数据库锁定机制,就是数据库为了保证数据的一致性,而使各种共享资源在被并发访问变得有序所设计的一种规则,简单说,就是不让别人动 总的来说,MySQL各 ...

  7. 原创 C++应用程序在Windows下的编译、链接:第一部分 概述

    本文是对C++应用程序在Windows下的编译.链接的深入理解和分析,文章的目录如下: 我们先看第一章概述部分. 1概述 1.1编译工具简介 cl.exe是windows平台下的编译器,link.ex ...

  8. [EntLib]微软企业库5.0 学习之路——第一步、基本入门

    话说在大学的时候帮老师做项目的时候就已经接触过企业库了但是当初一直没明白为什么要用这个,只觉得好麻烦啊,竟然有那么多的乱七八糟的配置(原来我不知道有配置工具可以进行配置,请原谅我的小白). 直到去年在 ...

  9. Mysql的二进制安装和基础入门操作

    前言:Mysql数据库,知识非常的多,要想学精学通这块知识,估计也要花费和学linux一样的精力和时间.小编也是只会些毛皮,给大家分享一下~ 一.MySQL安装 (1)安装方式: 1 .程序包yum安 ...

随机推荐

  1. day2-基础 变量,判断,循环

    1.第一个程序 print ("Hello World!") 输出: 1 Hello World 2.第一个变量 a = ( print (a) 输出: Hello World 3 ...

  2. 源码安装mysql,及主从同步

    源码安装mysql [可选] 如果用源码安装cmake软件: cd /home/oldboy/tools/ tar xf cmake-.tar.gz cd cmake- ./configure #CM ...

  3. python自动化下载yunfile(未完成)

    参考https://www.cnblogs.com/qqandfqr/p/7866650.html import re import requests import pytesseract impor ...

  4. xml解析-jaxp之dom解析

    package day06_parser.dom; /** * xml的解析技术:JAXP是Java API for XML Processing的英文字头缩写, * 中文含义是:用于XML文档处理的 ...

  5. python:线程进阶

    1,守护线程 import time from threading import Thread def func(): print('开始执行子线程') time.sleep(3) print('子线 ...

  6. luogu P2424 约数和

    嘟嘟嘟 求出[L, R]中每一个数的约数再相加必定会超时,所以换一种思路:枚举约数d. 对于一个约数d,能整除他的数可以写成k * d, (1 <= k <= ⌊n / d⌋),因此约数d ...

  7. 线段tree~讲解+例题

    最近学习了线段树这一重要的数据结构,有些许感触.所以写一篇博客来解释一下线段树,既是对自己学习成果的检验,也希望可以给刚入门线段树的同学们一点点建议. 首先声明一点,本人是个蒟蒻,如果在博客中有什么不 ...

  8. Entity Framework 三

    DbContext:上下文 EDM将生成从System.Data.Entity.DbContext类派生的SchoolDBEntities类,如下所示.派生DbContext的类在实体框架中被称为上下 ...

  9. 书籍《深入理解Spring Cloud 与微服务构建》勘误、源码下载

    转载请标明出处: https://blog.csdn.net/forezp/article/details/79638403 本文出自方志朋的博客 文章勘误 错误在所难免,欢迎大家批评指正,在文章下方 ...

  10. SpringBoot非官方教程 | 第七篇:springboot开启声明式事务

    转载请标明出处: http://blog.csdn.net/forezp/article/details/70833629 本文出自方志朋的博客 springboot开启事务很简单,只需要一个注解@T ...