2025年常用webservice方法_太极拳初学入门的基本要领

常用webservice方法_太极拳初学入门的基本要领1 什么是 webservice 先来考虑一个问题 如果我们要在自己的程序里面展示天气预报 那怎么弄 正确的做法是我们发送一个请求到一个系统 他会给我们返回来天气情况 这个就是一个 webservice 天气预报系统就相当于 webservice 的服务端 我们的系统就相当于客户端 如 http www webxml com cn 这个网站上面就列举了多个 webservice 服务站点 2

1、什么是webservice

先来考虑一个问题,如果我们要在自己的程序里面展示天气预报,那怎么弄?正确的做法是我们发送一个请求到一个系统,他会给我们返回来天气情况。这个就是一个webservice。天气预报系统就相当于webservice的服务端,我们的系统就相当于客户端。如http://www.webxml.com.cn这个网站上面就列举了多个webservice服务站点

2、JAVA中如何调用别人发布的webservice

2.1、获取webservice的wsdl文档

2.11、什么是wsdl文档

wsdl跟java一样,也是一种语言,是通过xml的形式说明该webservice如何调用。

2.12、如何获取wsdl文档

通过在webservice的url后面加?wsdl的方式,比如天气预报的的就是http://ws.webxml.com.cn/WebServices/WeatherWS.asmx?wsdl

2.13、WSDL解析

Wsdl文档从下往上读
Types – 数据类型定义的容器,它使用某种类型系统(一般地使用XML Schema中的类型系统)。(入参和出参的数据类型)
Message – 通信消息的数据结构的抽象类型化定义。使用Types所定义的类型来定义整个消息的数据结构(入参和出参)。
Operation – 对服务中所支持的操作的抽象描述,一般单个Operation描述了一个访问入口的请求/响应消息对(方法)。
PortType – 对于某个访问入口点类型所支持的操作的抽象集合,这些操作可以由一个或多个服务访问点来支持(服务类)。
Binding – 特定服务访问点与具体服务类的绑定(不看内容,看关系)。
Port – 定义为webservice单个服务访问点。
Service- 相关服务访问点的集合。

2.2、通过wsdl文档生成客户端调用代码

2.21、使用jdk自带的命令生成

配置java环境变量后在命令窗口中输入wsimport –s . http://xxxx.xx.xx/xxx?wsdl即可生成java代码
注意:-s不能分开,-s后面有个小点,用于指定源代码生成的目录。点即当前目录。如果使用了-s参数则会在目录下生成两份代码,一份为.class代码。一份为.java代码。.class代码,可以经过打包以后使用。.java代码可以直接Copy到我们的项目中运行
注意:可能会报错解析组件 ‘s:schema’ 时出错。在该组件中检测到 ‘s:schem’之类的,如果报错这个请移步:这里

2.3、生成代码后如何调用

先把生成的代码复制到项目中,然后通过读wsdl文档来调用,整体的调用代码类似于下面这样

//wsdl文档中service的name
SayHelloIntefaceService ss = new SayHelloIntefaceService();
//wsdl文档中portType的name
SayHelloInteface shf=ss.getSayHelloIntefacePort();
//wdl文档中complexType的name
String str=shf.sayhellow("lisi");
//str即为webservice的服务端返回的信息
System.out.println(str);

3、一个关于WebService的Demo

3.1、服务端

package com.bxoon;

import javax.jws.WebMethod;


public interface WebServiceI {

@WebMethod(exclude=true)
String helloWord(String name);

@WebMethod(exclude=true)
String helloWord2(String name);

}
package com.bxoon;


import javax.jws.WebService;
import javax.xml.ws.Endpoint;


@WebService
public class HelloWebService implements WebServiceI {


@Override
public String helloWord(String name) {
return"Hello: "+name;
}

@Override
public String helloWord2(String name){
return"Hello: "+name;
}

public static void main(String[] args) {
Endpoint.publish("http://127.0.0.1:8080/helloWord",new HelloWebService());
}

}

3.2 客户端

服务端启动之后通过访问http://127.0.0.1:8080/helloWord?wsdl来得到一个wsdl文档,类似于如下


然后通过命令

wsimport -s . http://127.0.0.1:8080/helloWord?wsdl

来生成具体的代码,生成的代码类似于


我们把对应的java类copy到客户端项目中,得到这样的目录结构


然后我们编写图中的Client类,代码如下

package com.bxoon;

public class Client {

public static void main(String[] args) {
HelloWebServiceService service = new HelloWebServiceService();
HelloWebService webService = service.getHelloWebServicePort();
String result = webService.helloWord("11");
System.out.println(result);
}
}

运行之后输出结果

Hello: 11

到此,一个简单的WebService的helloword程序就完成了,下面对具体的代码进行解释。

用Jdk1.6.0_21以后的版本发布一个WebService服务.与Web服务相关的类,都位于javax.xml.ws.*包中。
主要类有:
a) @WebService - 它是一个注解,用在类上指定将此类发布成一个webservice服务.
b) Endpoint – 此类为端点服务类,它的方法publish用于将一个已经添加了@WebService注解对象绑定到一个地址的端口上。Endpoint是jdk提供的一个专门用于发布服务的类,它的publish方法接收两个参数,一个是本地的服务地址,二是提供服务的类。它位于javax.xml.ws.*包中。
static Endpoint.publish(String address, Object implementor) 在给定地址处针对指定的实现者对象创建并发布端点。stop方法用于停止服务。

其他注意事项:

给类添加上@WebService注解后,类中所有的非静态方法都将会对外公布。不支持静态方法,final方法。

如果希望某个方法(非static,非final)不对外公开,可以在方法上添加@WebMethod(exclude=true),阻止对外公开。

如果一个类上,被添加了@WebService注解,则必须此类至少有一个可以公开的方法,否则将会启动失败。

服务类中不能没有方法

@WebMethod(exclude=true)屏蔽方法

4、其他调用webservice的方式

这里只写了一种最基本的调用webService的方式,实际上调用webService有很多种方式,下面一一介绍。

4.11、 使用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 = ''
+''
+''
+''+textVal+''
+'
'
+'
'
+'
';
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)

}
}
}

/pre>

h3>4.12、通过URLConnection调用

/h3>

pre class='language-javascript'>

//创建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 = " "xmlns:q0=\"http://server.rl.com/\" " +
"xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" " +
"xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">"
+""
+""
+"renliang "
+"
"
+"
"
+"

";


//获得输出流


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

eles = doc.selectNodes("//return");
for(Element ele : eles){
System.out.println(ele.getText());
}
}

/pre>

h3>4.13、使用jquery调用cxf

/h3>

pre class='language-javascript'>

$(function(){
$("#mybutton").click(function(){
var data = ''
+''
+''
+' sss'
+'
'
+'
'
+'

';



$.ajax({


url:'http://localhost:8080/cxf-web-server/services/hello',


type:'post',


dataType:'xml',


contentType:'text/xml;charset=UTF-8',


data:data,


success:function(responseText){


alert($(responseText).find('return').text());


},


error:function(){


alert("error");


}


})


})


})

/code>

code class='prism'>@WebService(


portName="myHelloService",修改端口名字


serviceName="HelloServices",修改服务访问点集合名字


name="HelloService",修改服务类的名字


targetNamespace="hello.rl.com" 修改命名空间名字


)

/code>

code class='prism'>@WebResult(name="sirHello")修改返回值的元素的父标签名字


@WebParam(name="sir")修改传入参数的元素的父标签名字

/code>

br /> jws的发布对java webservice框架产生了巨大的影响,经过大浪淘沙,目前java开发webservice的框架主要包括axis2和cxf。

br /> 这篇文章介绍了发布WebService的多种方式以及实现,

br /> a) SOAP1.1,1,2

br /> b) HTTP

br /> c) CORBA(Common Object Request Broker Architecture公共对象请求代理体系结构,早期语言使用的WS。C,c++,C#)

br /> d) 并可以与Spring进行快速无缝的整合

br /> e) 灵活的部署:可以运行有Tomcat,Jboss,Jetty(内置),IBMWS,BeaWS上面。

br /> bin 目录中是 CXF 框架中所提供的代码生成、校验、管理控制台工具(可执行命令)

br /> CXF 所有类(class)对应的 API 文档,为开发者使用 CXF 完成应用开发提供应有的帮助。

br /> 包含一个基本的 Service 暴露所需要的 web.xml 文件,及其它的配置文件。

br /> lib 目录中包含 CXF 及其运行时所需要的和可选的第三方支持类包(.jar 文件),可以根据不同项目所需的 CXF 特性选择所需要的支持类包。如果不想一一去区分的话,可

br /> 以直接在 Web 项目中包含所有的 CXF 及其运行时所需要的第三方支持类包(.jar 文件)即可。

br /> 其中 cxf-2.0.2-incubator.jar 是 CXF 框架的二进制包文件,包含了全部的模块(modules),cxf-manifest-incubator.jar 是列表清单文件 manifest jar 。

br /> jaxb-xjc.jar

br /> veliocity.jar

br /> velocity-dep.jar

br /> jaxws-api.jar

br /> saaj-api.jar

br /> saaj-impl.jar

br /> asm.jar (可选的,但是可以提升包装类型的性能)

br /> spring-beans.jar

br /> spring-context.jar

br /> spring-core.jar

br /> spring.web.jar

br /> jetty.jar

br /> jetty-sslengine.jar

br /> jetty-util.jar

br /> sl4j.jar & sl4j-jdk14.jar (可选的,但是可以提升日志 logging)

br /> jaxen.jar

br /> jdom.jar

br /> stax-utils.jar

br /> wss4j.jar

br /> xalan.jar

br /> xmlsec.jar

br /> jettison.jar (仅为 JSON 服务所需的)

br /> 列表了引用第三方 jar 包的相关许可协议。

br /> modules 目录中包含了 CXF 框架根据不同特性分开进行编译的二进制包文件。发布基于 CXF 框架的 Web 项目时,可以选择使用该目录下的所有 .jar 文件,也可以选择 lib 目 录中的 cxf-2.0.2-incubator.jar 文件。

br /> samples 目录中包含了所有随 CXF 二进制包发布的示例,包含这些示例的源代码和相关 Web 应用配置文件,可以方便地用 Ant 来编译运行测试这些示例,来了解 CXF 的开发和

code class='prism'>@WebService


@BindingType(value=javax.xml.ws.soap.SOAPBinding.SOAP12HTTP_BINDING)


public interface SayHelloInteface {


public String sayhellow(String name);


}

/code>

code class='prism'>@WebService


public class SayHellowIntefaceImpl implements SayHelloInteface {



@Override


public String sayhellow(String name) {


return name+"hello world";


}


}

/code>

code class='prism'>public static void main(String[] args) {


//运行


JaxWsServerFactoryBean jwsf=new JaxWsServerFactoryBean();


//CXF拦截器


jwsf.getInInterceptors().add(new LoggingInInterceptor());


jwsf.getOutInterceptors().add(new LoggingOutInterceptor());



jwsf.setAddress("http://127.0.0.1:8080/sayHello");


jwsf.setServiceClass(SayHelloInteface.class);


jwsf.setServiceBean(new SayHellowIntefaceImpl());


jwsf.create();


}

/code>

code class='prism'>SayHelloIntefaceService ss = new SayHelloIntefaceService();


SayHelloInteface shf=ss.getSayHelloIntefacePort();


String str=shf.sayhellow("lisi");


System.out.println(str);

/code>

code class='prism'>




cxf
org.apache.cxf.transport.servlet.CXFServlet


cxf
/services/*


60

/pre>

p>配置cxf-servlet.xml

/p>

pre class='language-javascript'>











/pre>

p>使用wsdl2java生成客户端代码

/p>

p>调用webservice

/p>

h2>8.WebService的工作原理

/h2>

p>再说WebService之前这里先说说RPC,什么是RPC呢?

/p>

pre class='language-javascript'>

RPC(Remote Procedure Call),远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。(来自百度百科)

/pre>

p>简单来说RPC是java中远程调用的一种技术或者约定,并不是一种具体的解决方案或者框架,而具体的框架有下面这些比较火的(排名不分先后)

/p>

p>SpringCloud(Spring的,基于Socket的,SOA架构的分布式框架)

/p>

p>Dubbo(x)(阿里巴巴的,基于Socket的,SOA架构的分布式框架)

/p>

p>WebService(跨语言的,基于SOAP协议,走xml数据或json数据)

/p>

p>Hessian(跨语言的,基于Binary-RPC协议,走二进制数据)

/p>

p>HttpClient(通常用于RESTful风格的调用,跨语言,基于http和json)

/p>

p>jdk原生(HttpURLConnection)

/p>

p>我们上面用的就是jdk原生的这种。本文也主要对这种方式的工作原理做简单解析,原理大概分为以下几个步骤

/p>

p>Service端会在程序启动的时候扫描有标注@WebService的类,然后通过反射方法找到这个类的需要发布的方法,然后在用户访问wsdl文档的时候把这些东西组成SOAP协议内容然后返回给用户浏览器,用户就可以得到wsdl文档。同时服务端在启动的时候会启动一个socket用来等待客户端的连接。

/p>

p>客户端通过wsdl文档生成了代码然后在程序里面调用,实际上是通过了一个socket发送了一个请求给服务端,请求里面有指明客户端需要调用哪个类的哪个方法,以及请求参数,请求报文类似于

/p>

pre class='language-javascript'>




2013-06-22T18:56:43.808+08:00


/code>

br />

br /> 可以很清楚的看到SOAP就只是把http的报文体换成了XML。

br /> 如果对笔者所述有所不明了,可以看看JAVA高级开发—webservice原理分析视频

编程小号
上一篇 2025-09-04 17:40
下一篇 2025-02-28 10:21

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/hz/140611.html