一、概述

  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. 初识Scrum

    团队作业起步 一.团队 队名:想吃蛋炒饭 成员: 许俊杰 肖豪雄 王重和 罗艺璇 曾舒妮 也许是我们队长的人的博客:许俊杰的博客 二.Scrum学习心得 Scrum是迭代式增量软件开发过程,通常用于敏 ...

  2. Android(java)学习笔记49:通过反射获取私有构造方法并且使用

    1. 反射获取私有构造方法并且使用: (1)获取字节码文件.class对象:          Class c = Class.forName("cn.itcast_01.Person&qu ...

  3. 2018.11.19 Struts2中Action类的书写方式

    方式1: 方式2: 方式3

  4. 在Spring整合aspectj实现aop的两种方式

    -----------------------------基于XML配置方案目标对象接口1 public interface IUserService { public void add(); pub ...

  5. Google TensorFlow 学习笔记一 —— TensorFlow简介

    "TensorFlow is an Open Source Software Library for Machine INtenlligence" 本笔记参考tensorflow. ...

  6. 43. Multiply Strings 字符串相乘

    1. 原始题目 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式. 示例 1: 输入: num1 = "2&qu ...

  7. [luoguP4306][JSOI2010]连通数

    \[Yeasion\] \[Nein\] 其实我很奇怪为什么我的正解和输出\(N \times N\)的效果是一样的.....嗯,大概是\(RP\)问题吧.... 嗯首先来看一下题目: 题目描述: 度 ...

  8. HDU 1312 Red and Black(最简单也是最经典的搜索)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1312 Red and Black Time Limit: 2000/1000 MS (Java/Oth ...

  9. 【转载】Atom 是一款各方面体验都很像 Sublime Text 的编辑器

    转载:http://www.appinn.com/atom-editor/ Atom 是一款各方面体验都很像 Sublime Text 的编辑器,它由 Github 出品,目前免费. Atom 功能的 ...

  10. input按钮选择功能

    <p> <input type="checkbox" class="ischecked" id="is_pinkage" ...