Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Web-第三十一天 WebService学习【悟空教程】

Web-第三十一天 WebService学习【悟空教程】

作者头像
Java帮帮
发布于 2018-08-06 09:32:26
发布于 2018-08-06 09:32:26
2.5K00
代码可运行
举报
运行总次数:0
代码可运行

Web-第三十一天 WebService学习【悟空教程】

Webservice 服务学习

1.认识webservice

什么是服务

简单的网络应用使用单一语言写成,它的唯一外部程序就是它所依赖的数据库。大家想想是不是这样呢?

  • 现在的应用程序变得越来越复杂,甚至只靠单一的应用程序无法完成全部的工作。更别说只使用一种语言了。
  • 大家在写应用程序查询数据库时,并没有考虑过为什么可以将查询结果返回给上层的应用程序,甚至认为,这就是数据库应该做的,其实不然,这是数据库通过TCP/IP协议与另一个应用程序进行交流的结果,而上层是什么样的应用程序,是用什么语言,数据库本身并不知道,它只知道接收到了一份协议,这就是SQL92查询标准协议。
  • 既然数据库可以依据某些标准对外部其他应用程序提供服务、而且不关心对方使用什么语言,那我们为什么就不能实现跨平台、跨语言的服务呢?只要我们用Java写的代码,可以被任意的语言所调用,我们就实现了跨平台,跨语言的服务!

复杂的网络应用

更为复杂的应用除了自己内部调用之外有可能还会对外部程序提供服务,更或是调用其他应用。

WebService定义: 顾名思义就是基于Web的服务。它使用Web(HTTP)方式,接收和响应外部系统的某种请求。从而实现远程调用。

Webservice理解:我们可以调用互联网上查询天气信息Web服务,然后将它嵌入到我们的程序(C/S或B/S程序)当中来,当用户从我们的网点看到天气信息时,他会认为我们为他提供了很多的信息服务,但其实我们什么也没有做,只是简单了调用了一下服务器上的一段代码而已。WebSerice可以将你的服务(一段代码)发布到互联网上让别人去调用,也可以调用别人机器上发布的WebService,就像使用自己的代码一样。

2.Webservice调用

2.1学习webservice调用的预备知识

名词1:XML. Extensible Markup Language -扩展性标记语言

XML,用于传输格式化的数据,是Web服务的基础。

namespace-命名空间。

xmlns=“http://javahelp.com.cn” 使用默认命名空间。

xmlns:javahelp=“http://javahelp.com.cn”使用指定名称的命名空间。

名词2:WSDL – WebService Description Language – Web服务描述语言。

通过XML形式说明服务在什么地方-地址。

通过XML形式说明服务提供什么样的方法 – 如何调用。

名词3:SOAP-Simple Object Access Protocol(简单对象访问协议)

SOAP作为一个基于XML语言的协议用于有网上传输数据。

SOAP = 在HTTP的基础上+XML数据。

SOAP是基于HTTP的。

SOAP的组成如下:

Envelope – 必须的部分。以XML的根元素出现。

Headers – 可选的。

Body – 必须的。在body部分,包含要执行的服务器的方法。和发送到服务器的数据。

2.2 webservice服务网址

Webservice服务网站:http://www.webxml.com.cn

2.3 WSDL解析

Wsdl文档从下往上读

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

2.4生成客户端代码

  • wsimport是jdk自带的,可以根据wsdl文档生成客户端调用代码的工具.当然,无论服务器端的WebService是用什么语言写的,都将在客户端生成Java代码.服务器端用什么写的并不重要.
  • wsimport.exe位于JAVA_HOME\bin目录下.
  • 常用参数为:-d<目录> - 将生成.class文件。默认参数。

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

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

wsdlurl - http://server:port/service?wsdl,必须的参数。

示例:

C:/> wsimport –s . http://192.168.0.100/one?wsdl

注意:-s不能分开,-s后面有个小点,用于指定源代码生成的目录。点即当前目录。

如果使用了-s参数则会在目录下生成两份代码,一份为.class代码。一份为.java代码。

.class代码,可以经过打包以后使用。.java代码可以直接Copy到我们的项目中运行。

调用webservice步骤

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

2.5消息体

  • SOAP1.1请求消息体
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
POST /WebServices/MobileCodeWS.asmx HTTP/1.1
Host: webservice.webxml.com.cn
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://WebXml.com.cn/getMobileCodeInfo"
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <getMobileCodeInfo xmlns="http://WebXml.com.cn/">
      <mobileCode>string</mobileCode>
      <userID>string</userID>
    </getMobileCodeInfo>
  </soap:Body>
</soap:Envelope>
SOAP1.1相应消息体 
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <getMobileCodeInfoResponse xmlns="http://WebXml.com.cn/">
      <getMobileCodeInfoResult>string</getMobileCodeInfoResult>
    </getMobileCodeInfoResponse>
  </soap:Body>
</soap:Envelope>

3.jdk发布webservice服务

注意:用Jdk1.6.0_21以后的版本发布一个WebService服务.

说明:在JDK1.6中JAX-WS规范定义了如何发布一个webService服务。JAX-WS是指Java Api for XML – WebService.

与Web服务相关的类,都位于javax.xml.ws.*包中。

主要类有:

@WebService - 它是一个注解,用在类上指定将此类发布成一个webservice服务.

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)屏蔽方法

使用myeclipse查看消息体

4.其他调用webservice的方式

  • 使用ajax调用
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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)
}
}
}
  • 通过URLConnection调用
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//创建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());
}

6.复杂消息请求

@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());

}

}

7.监听器

用于查看请求和相应的消息

8.wsdl文档元素名称修改

自动生成的文档的名字有时不规范,可以手动进行修改。

@WebService(

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

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

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

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

)

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

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

9.什么是cxf

Apache CXF = Celtix + Xfire

支持多种协议:

  • SOAP1.1,1,2
  • HTTP
  • CORBA(Common Object Request Broker Architecture公共对象请求代理体系结构,早期语言使用的WS。C,c++,C#)
  • 并可以与Spring进行快速无缝的整合
  • 灵活的部署:可以运行有Tomcat,Jboss,Jetty(内置),IBMWS,BeaWS上面。

bin(目录) bin 目录中是 CXF 框架中所提供的代码生成、校验、管理控制台工具(可执行命令) docs(目录) CXF 所有类(class)对应的 API 文档,为开发者使用 CXF 完成应用开发提供应有的帮助。 etc(目录) 包含一个基本的 Service 暴露所需要的 web.xml 文件,及其它的配置文件。 lib(目录) lib 目录中包含 CXF 及其运行时所需要的和可选的第三方支持类包(.jar 文件),可以根据不同项目所需的 CXF 特性选择所需要的支持类包。如果不想一一去区分的话,可 以直接在 Web 项目中包含所有的 CXF 及其运行时所需要的第三方支持类包(.jar 文件)即可。 其中 cxf-2.0.2-incubator.jar 是 CXF 框架的二进制包文件,包含了全部的模块(modules),cxf-manifest-incubator.jar 是列表清单文件 manifest jar 。

以下的 jar 包是所有 CXF 项目所必需的: cxf.jar commons-logging.jar geronimo-activation.jar (Or the Sun equivalent) geronimo-annotation.jar (Or the Sun equivalent) geronimo-javamail.jar (Or the Sun equivalent) neethi.jar jaxb-api.jar jaxb-impl.jar stax-api.jar XmlSchema.jar wstx-asl.jar xml-resolver.jar 对于 Java2WSDL 和 WSDL2Java,除了必需的之外,还需要再增加如下 jar 包: jaxb-xjc.jar veliocity.jar velocity-dep.jar 为了支持 JAX-WS ,除了必需的之外,还需要再增加如下 jar 包: jaxws-api.jar saaj-api.jar saaj-impl.jar asm.jar (可选的,但是可以提升包装类型的性能) 为了支持 XML 配置,除了必需的之外,还需要再增加如下 jar 包:aopalliance.jar spring-beans.jar spring-context.jar spring-core.jar spring.web.jar 为了独立的 HTTP 服务支持,除了必需的之外,还需要再增加如下 jar 包:geronimo-servlet.jar jetty.jar jetty-sslengine.jar jetty-util.jar sl4j.jar & sl4j-jdk14.jar (可选的,但是可以提升日志 logging) 为了支持 Aegis ,除了必需的之外,还需要再增加如下 jar 包: jaxen.jar jdom.jar stax-utils.jar 为了支持 WS-Security ,除了必需的之外,还需要再增加如下 jar 包:bcprov-jdk14.jar wss4j.jar xalan.jar xmlsec.jar 为了支持 HTTP Binding ,除了必需的之外,还需要再增加如下 jar 包:jra.jar jettison.jar (仅为 JSON 服务所需的) licenses(目录) 列表了引用第三方 jar 包的相关许可协议。 modules(目录) modules 目录中包含了 CXF 框架根据不同特性分开进行编译的二进制包文件。发布基于 CXF 框架的 Web 项目时,可以选择使用该目录下的所有 .jar 文件,也可以选择 lib 目 录中的 cxf-2.0.2-incubator.jar 文件。 samples(目录) samples 目录中包含了所有随 CXF 二进制包发布的示例,包含这些示例的源代码和相关 Web 应用配置文件,可以方便地用 Ant 来编译运行测试这些示例,来了解 CXF 的开发和 使用的方法。可以通过 samples 目录和它各个子目录下的 README.txt 的文件来详细了解示例的编译与运行的步骤。

10.环境搭建

JAVA_HOME 需要jdk的支持

CXF_HOME

ANT_HOME

CATALINA_HOME

Path = %JAVA_HOME%\bin;%CXF_HOME%\bin;%CATALINA_HOME%\bin;%ANT_HOME%\bin

CLASSPATH=.;%CXF_HOME%\lib\cxf-manifest.jar;.\build\classes

11.运行cxf例子

1.拷贝例子中的common_build.xml和java_first_pojo到没有中文目录的下

2. 执行ant server

3.执行ant client

4. 执行ant war

5. 执行ant deploy –Dtomcat=true将项目发布到tomcat的服务器上。

发布到tomcat中:访问http://localhost:8080/helloworld/services/hello_world?wsdl

服务路径由cxf-servlet.xml来配置

6.卸载部署包

停止tomcat后卸载应用:ant undeploy –Dtomcat=true

7.清理构建目录

ant clean

12.实现cxf第一个示例

  • 创建java项目
  • 引入所有依赖包
  • 创建服务类

用两个不同的类发布应用:

ServerFactoryBean(不需要使用@webservice) 生成的文档不规范,不建议使用

JaxWsServerFactoryBean(建议使用此类,需要使用@webservice) 生成的文档不规范,可以发布SOAP1.1,SOAP1.2的协议,当cxf的服务类中没有方法时也可以发布成功,不报错。如果使用SOAP1.2需要用@bindType注解指定

当使用SOAP1.2时wsimport命令失效,需要使用cxf的wsdl2java

建议:发布服务的时候使用SOAP1.2,客户端调用的时候使用SOAP1.1

@WebService

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

public class HelloService {

public static void main(String[] args) {

//创建服务工厂对象

//ServerFactoryBean sfb = new ServerFactoryBean();

JaxWsServerFactoryBean sfb = new JaxWsServerFactoryBean ();

//设置服务地址

sfb.setAddress("http://127.0.0.1:7777/hello");

//设置服务类

sfb.setServiceClass(HelloService.class);

//设置服务对象的实例

sfb.setServiceBean(new HelloService());

//发布服务

sfb.create();

}

public String sayHello(String name){

return name+ " hello";

}

}

  • 通过wsimport(SOAP1.1)生成客户端代码
  • 调用webservice

13.wsdl2java

在cxf中,也提供了一个用于生成客户端调用代码的工具。它的功能就如同wsimport一样。

先让我们了解一下cxf的wsdl2java工具,可以生成一堆客户端调用的代码。既可以生成SOAP1.1也可以生成SOAP1.2

此工具位于cxf_home/bin目录下。参数与wsimport有所不同。

它包含以下参数:

  • -d参数,指定代码生成的目录。
  • -p参数,指定生成的新的包结构。

需要说明的是,由于wsdl2java是根据jdk1.7生成的本地代码,所以,需要对生成的代码做一点点修改。

在命令行执行:

wsdl2java –d . http://127.0.0.1:6666/helloworld?wsdl

SOAP1.2消息 POST /WebServices/MobileCodeWS.asmx HTTP/1.1 Host: webservice.webxml.com.cn Content-Type: application/soap+xml; charset=utf-8 Content-Length: length <?xml version="1.0" encoding="utf-8"?> <soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope"> <soap12:Body> <getMobileCodeInfo xmlns="http://WebXml.com.cn/"> <mobileCode>string</mobileCode> <userID>string</userID> </getMobileCodeInfo> </soap12:Body> </soap12:Envelope> HTTP/1.1 200 OK Content-Type: application/soap+xml; charset=utf-8 Content-Length: length <?xml version="1.0" encoding="utf-8"?> <soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope"> <soap12:Body> <getMobileCodeInfoResponse xmlns="http://WebXml.com.cn/"> <getMobileCodeInfoResult>string</getMobileCodeInfoResult> </getMobileCodeInfoResponse> </soap12:Body> </soap12:Envelope>

14.使用JaxWsServerFactoryBean调用接口服务类

  • 创建服务接口

@WebService//注意注解加在接口上

public interface HI {

public String sayHi(String name);

}

  • 创建接口实现类
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class HIImpl implements HI {
@Override
public String sayHi(String name) {
// TODO Auto-generated method stub
return name + " hello";
}
}
  • 创建发布服务类
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static void main(String[] args) {
JaxWsServerFactoryBean jf = new JaxWsServerFactoryBean();
jf.setAddress("http://127.0.0.1:5555/hi");
jf.setServiceClass(HI.class);
jf.setServiceBean(new HIImpl());
jf.create();
}
  • 生成客户端代码
  • 调用客户端
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Client {
public static void main(String[] args) {
HIService hs = new HIService();
HI serviceClass = hs.getHIPort();
System.out.println(serviceClass.sayHi("张三"));
}
}

15.拦截输入输出消息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
LoggingInInterceptor – 信息输入时的拦截器 –请求
LoggingOutInterceptor –信息输出时的拦截器-响应
public class InterServer {
public static void main(String[] args) {
JaxWsServerFactoryBean jf = new JaxWsServerFactoryBean();
jf.getInInterceptors().add(new LoggingInInterceptor());
jf.getOutInterceptors().add(new LoggingOutInterceptor());
jf.setAddress("http://127.0.0.1:5555/hi");
jf.setServiceClass(HI.class);
jf.setServiceBean(new HIImpl());
jf.create();
}
}

16.在web项目中创建类的cxf服务

  • 创建web项目
  • 导入所有包
  • 创建服务类,必须指定注解@webService
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
配置web.xml
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
 <servlet>
 <servlet-name>cxf</servlet-name>
 <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
 </servlet>
 <servlet-mapping>
 <servlet-name>cxf</servlet-name>
 <url-pattern>/services/*</url-pattern>
 </servlet-mapping>
 <session-config>
 <session-timeout>60</session-timeout>
 </session-config>
</web-app>
  • 创建cxf的核心配置文件cxf-servlet.xml
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?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:jaxrs="http://cxf.apache.org/jaxrs" xmlns:cxf="http://cxf.apache.org/core"
xsi:schemaLocation="http://www.springframework.org/schema/beans
          http://www.springframework.org/schema/beans/spring-beans.xsd
            http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd
            http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
            http://cxf.apache.org/core http://cxf.apache.org/schemas/core.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="hello" address="/hello" implementor="com.rl.cxf.web.server.HelloService">
<jaxws:outInterceptors>
<bean class="org.apache.cxf.interceptor.LoggingInInterceptor"></bean>
</jaxws:outInterceptors>
<jaxws:inInterceptors>
<bean class="org.apache.cxf.interceptor.LoggingOutInterceptor"></bean>
</jaxws:inInterceptors>
</jaxws:endpoint>
</beans>

17.修改cxf-servlet.xml的位置和文件名

  • 第一种方式
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
 <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.xml</param-value>
</init-param>
 <load-on-startup>1</load-on-startup>
 </servlet>
 <servlet-mapping>
 <servlet-name>cxf</servlet-name>
 <url-pattern>/services/*</url-pattern>
 </servlet-mapping>
</web-app>
  • 第二种方式
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
 </listener>
 <context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>classpath:cxf.xml</param-value>
 </context-param>
 <servlet>
 <servlet-name>cxf</servlet-name>
 <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
 </servlet>
 <servlet-mapping>
 <servlet-name>cxf</servlet-name>
 <url-pattern>/services/*</url-pattern>
 </servlet-mapping>
</web-app>

18.在web项目中创建接口的cxf服务

  • 创建服务接口在接口上加@webservice
  • 创建服务接口的实现类
  • 在web.xml中配置CXFServlet
  • 配置cxf-servlet.xml
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<jaxws:server id="bye" address="/bye" serviceClass="com.rl.cxf.web.inter.ByeInter">
<jaxws:serviceBean>
<bean class="com.rl.cxf.web.inter.ByeInterImpl"></bean>
</jaxws:serviceBean>
<jaxws:outInterceptors>
<bean class="org.apache.cxf.interceptor.LoggingInInterceptor"></bean>
</jaxws:outInterceptors>
<jaxws:inInterceptors>
<bean class="org.apache.cxf.interceptor.LoggingOutInterceptor"></bean>
</jaxws:inInterceptors>
</jaxws:server>
  • 使用wsdl2java生成客户端代码
  • 调用webservice

19.使用jquery调用cxf

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$(function(){
$("#mybutton").click(function(){
var data = \'<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:q0="http://server.web.cxf.rl.com/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">\'
  +\'<soapenv:Body>\'
  +\'<q0:sayHello>\'
  +\'   <arg0>sss</arg0>\'
  +\' </q0:sayHello>\'
  +\'</soapenv:Body>\'
  +\'</soapenv:Envelope>\';
$.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");
}
})
})
})

20.jquery调用cxf的ws小练习

实现添加人,和查询人。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="js/jquery-1.6.2.js"></script>
<script type="text/javascript">
$(function(){
//保存用户
$("#save").click(function(){
var name = $("#name").val();
var age = $("#age").val();
var gender = $("#gender").val();
$.ajax({
url:"http://localhost:8080/cxf_web_server/services/person",
type:"POST",
dataType:"xml",
contentType:"text/xml;charset=UTF-8",
data:\'<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"xmlns:q0="http://server.javahelp.com.cn/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">\'
+\'<soapenv:Body>\'
+\'<q0:addPerson>\'
+\'<arg0>\'
+\'<age>\'+age+\'</age> \'
+\'<gender>\'+gender+\'</gender> \'
+\'<name>\'+name+\'</name> \'
+\'</arg0>\'
+\'</q0:addPerson>\'
+\'</soapenv:Body>\'
+\'</soapenv:Envelope>\',
success:function(data){
alert(\'保存成功\');
},
error:function(){
alert("system error");
}
});
});
//查询用户
$("#query").click(function(){
$.ajax({
url:"http://localhost:8080/cxf_web_server/services/person",
type:"POST",
dataType:"xml",
contentType:"text/xml;charset=UTF-8",
data:\'<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"xmlns:q0="http://server.javahelp.com.cn/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">\'
+\' <soapenv:Body>\'
+\' <q0:queryPersonAll /> \'
+\' </soapenv:Body>\'
+\' </soapenv:Envelope>\',
success:function(data){
var doc = $(data).find(\'return\');
$("#mydiv").empty();
var result = \'\';
doc.each(function(){
var name = $(this).find(\'name\').text();
var age = $(this).find(\'age\').text();
var gender = $(this).find(\'gender\').text();
result = result + name + "   "+ age + "   " + gender + "<br>";
});
$("#mydiv").append(result);
},
error:function(){
alert("system error");
}
});
});
});
</script>
</head>
<body>
姓名:<input id="name" type="text"><br>
年龄:<input id="age" type="text"><br>
性别:<input id="gender" type="text"><br>
<input id="save" type="button" value="保存"><input id="query" type="button" value="查询"><br>
<div id="mydiv" style="width:300px;height:300px; border:1px solid;">
</div>
</body>
</html>
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-07-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java帮帮 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
基于Spring + CXF框架的Web Service
1、用CXF编写基于Spring的Web service,也是需要分为Server服务器端、Client客户端的。
别先生
2020/12/01
1.3K0
基于Spring + CXF框架的Web Service
web项目使用cxf+spring搭建WebService,并部署到远程
说明服务发布成功,访问该项目http://localhost:8080/CXFWebservice/webservice
故久
2020/06/04
6570
常用webservice方法_太极拳初学入门的基本要领
先来考虑一个问题,如果我们要在自己的程序里面展示天气预报,那怎么弄?正确的做法是我们发送一个请求到一个系统,他会给我们返回来天气情况。这个就是一个webservice。天气预报系统就相当于webservice的服务端,我们的系统就相当于客户端。如http://www.webxml.com.cn这个网站上面就列举了多个webservice服务站点
全栈程序员站长
2022/11/08
1.6K0
常用webservice方法_太极拳初学入门的基本要领
CXF集成Spring实现webservice的发布与请求
CXF集成Spring实现webservice的发布(服务端) 目录结构: 主要代码: package com.cxf.spring.pojo; public class User { int id ; String name = null; String address = null; String email = null; public int getId() { return id
JQ实验室
2022/02/09
5880
CXF集成Spring实现webservice的发布与请求
java调用WebService(一)
因工作需要和一个Sap相关系统以WebService的方式进行接口联调,之前仅听过这种技术,但并没有实操过,所以将本次开发相关的踩坑进行记录
matinal
2023/10/13
1.1K0
远程调用服务框架-CXF(WebServic)
本文介绍了如何利用阿里巴巴的开源项目Dubbo,实现高性能的服务化架构。首先介绍了Dubbo的基本概念和架构设计,然后详细讲解了如何使用Dubbo搭建服务化架构,并总结了在实践过程中需要注意的要点。本文对于实际项目中使用Dubbo搭建服务化架构具有一定的参考价值。
李家酒馆酒保
2017/12/27
1.8K0
远程调用服务框架-CXF(WebServic)
springMvc项目集成cxf实现webService通信方式的详细步骤
 添加webService服务接口的bean文件 applicationContext-cxf.xml
跟着飞哥学编程
2022/11/30
1.9K0
springMvc项目集成cxf实现webService通信方式的详细步骤
WebService就是这么简单
WebService介绍 首先我们来谈一下为什么需要学习webService这样的一个技术吧…. 问题一 如果我们的网站需要提供一个天气预报这样一个需求的话,那我们该怎么做????? 天气预报这么一个功能并不是简单的JS组件就能够实现的,它的数据是依赖数据库分析出来的,甚至需要卫星探测..我们个人建站是不可能搞这么一个数据库的吧。 那么既然我们自己干不了,我们可以去找别人吗???我们从搜索引擎搜索,可以发现很多提供天气预报的网站,但是它返回的是一个网页,而我们仅仅需要的是对应的数据! 我们可能就在想,我们能
Java3y
2018/04/02
12.6K0
WebService就是这么简单
面试题-web service接口如何测试?
接口相关的测试,http 协议的接口大家平常基础的很多,基本上问题不大。webservice 接口如何测试呢?需先了解什么是 webservice 接口,和 http 协议的接口有什么不一样?
上海-悠悠
2021/03/03
2.6K0
面试题-web service接口如何测试?
WebService使用介绍(三)
exclude:设置为true表示此方法不是webservice方法,反之则表示webservice方法
HUC思梦
2020/09/03
2.8K0
WebService使用介绍(三)
cxf框架调用webservice_webservice json
Ant做为一种工具已经广泛被使用,并且历史悠久。 使用ant的内置命令,可以编译java源文件(javac),运行java文件(java),给class文件打包(jar、war、ear), 也可以创建(mkdir)、删除(del)、拷贝(copy),甚至可以使用ant执行sql文件。 由于ant是用xml语言写成的文件,并取默认名为build.xml文件。 所以,今后大家应该在见到名为build.xml文件时知道这是一个ant的文件。
全栈程序员站长
2022/09/29
2.1K0
cxf框架调用webservice_webservice json
Web Service简单入门示例
我们一般实现Web Service的方法有非常多种。当中我主要使用了CXF Apache插件和Axis 2两种。
全栈程序员站长
2022/07/05
4220
WebService客户端调用的5种常见方式
到此一个简单的webservice服务端项目就搭建完成了,这里我在application.properties文件中把端口改成8081:
科技新语
2024/11/21
9070
WebService客户端调用的5种常见方式
day46_Webservice学习笔记_02
开发步骤:   第一步:导入jar包   第二步:创建SEI接口,要在接口上加入注解:@WebService
黑泽君
2018/10/11
3K0
day46_Webservice学习笔记_02
cxf webservice整合spring 原
     前端建模:CXF 提供了前端建模的概念,允许您使用不同的前端 API 来创建 Web 服务。API 允许您使用简单的工厂 Bean 并通过 JAX-WAS 实现来创建 Web 服务。它还允许您创建动态 Web 服务客户端。     工具支持:CXF 提供了用于在 Java Bean、Web 服务和 WSDL 之间进行转换的不同工具。它提供了对 Maven 和 Ant 集成的支持,并无缝地支持 Spring 集成。     RESTful 服务支持:CXF 支持代表性状态传输(Representational State Transfer,RESTful )服务的概念,并支持 Java 平台的 JAX-RS 实现。(本系列的第 2 部分将提供有关 RESTful 服务的更多信息。)     对不同传输和绑定的支持:CXF 支持不同种类的传输,从 XML 到逗号分隔值 (CSV)。除了支持 SOAP 和 HTTP 协议绑定之外,它还支持 Java Architecture for XML Binding (JAXB) 和 AEGIS 数据绑定。     对非 XML 绑定的支持:CXF 支持非 XML 绑定,例如 JavaScript Object Notation (JSON) 和 Common Object Request Broker Architecture (CORBA)。它还支持 Java 业务集成(Java Business Integration,JBI)体系架构和服务组件体系架构(Service Component Architecture,SCA)。     code first 或者 xml first  : 支持使用code first 或者 xml first 的方式来创建web服务。  一  借助 annotation 创建独立启动的web 服务。         准备: 新建工程 导入需要的jar 包:                      依赖的包:                             commons-logging-1.1.jar                             geronimo-activation_1.1_spec-1.0-M1.jar (or Sun's Activation jar)                             geronimo-annotation_1.0_spec-1.1.jar (JSR 250)                             geronimo-javamail_1.4_spec-1.0-M1.jar (or Sun's JavaMail jar)                             geronimo-servlet_2.5_spec-1.1-M1.jar (or Sun's Servlet jar)                             geronimo-ws-metadata_2.0_spec-1.1.1.jar (JSR 181)                             jaxb-api-2.1.jar                             jaxb-impl-2.1.6.jar                             jaxws-api-2.1.jar                             jetty-6.1.5.jar                             jetty-util-6.1.5.jar                             neethi-2.0.jar                             saaj-api-1.3.jar                             saaj-impl-1.3.jar                             stax-api-1.0.1.jar                             wsdl4j-1.6.1.jar                             wstx-asl-3.2.1.jar                             XmlSchema-1.2.jar                             xml-resolver-1.2.jar                         spring jar 包, 用来支持xml配置:                             aopalliance-1.0.jar          
尚浩宇
2018/08/17
8510
WebService入门之CXF教程
Apache CXF是一个开源的Service框架,可以用于简化用户的service开发,基于CXF开发的应用可提供SOAP、XML/HTTP、RESTFUL HTTP或CORBA等服务。CXF底层页可以使用不同的传输协议,包括HTTP、JMS或JBI等。
星哥玩云
2022/07/03
2.6K0
WebService入门之CXF教程
Web Service进阶(一)运行原理[通俗易懂]
利用清明小假期,温习了一遍Web Service的相关内容,对其工作原理进行了简要总结。以供有需求的朋友和自己日后参考。文章若有不当之处,敬请朋友们提出宝贵建议,以求共勉。
全栈程序员站长
2022/09/15
6410
Web Service进阶(一)运行原理[通俗易懂]
老司机带你玩转web service
当大型需求被数个公司分割开来,各公司系统相互交换数据的问题就会接踵而来。毕竟是多家不同的公司的产品,研发开发语言、采用技术框架基本上是百花齐放。怎样让自家系统提供的服务具有跨平台、跨语言、跨各种防火墙
xiangzhihong
2018/02/05
1.3K0
老司机带你玩转web service
Java webservice详解「建议收藏」
  webservice 即 web 服务,因互联网而产生,通过 webservice 这种 web 服务,我们可以实现互联网应用之间的资源共享,比如我们想知道 手机号码归属地,列车时刻表,天气预报,省市区邮政编码等信息,由于我们自己的数据库中并没有这些信息,那么我们可以调用第三方提供的 webservice服务,获取这些信息;
全栈程序员站长
2022/09/14
4K0
Java webservice详解「建议收藏」
使用JQuery、Ajax来调用WebService服务 基于Spring + CXF框架的Web Service
1、在之前的基础上修改的,如果想使用JQuery、Ajax来调用WebService服务,必须需要先获取到请求的参数值,我的参数值是下面的这部分,如何获取到这参数值呢,只需要在客户端配置出拦截器即可,后台打印的参数,然后配置到自己需要的地方即可。
别先生
2020/12/01
2.3K0
使用JQuery、Ajax来调用WebService服务
    


基于Spring + CXF框架的Web Service
相关推荐
基于Spring + CXF框架的Web Service
更多 >
LV.1
上海满吉教育科技有限公司CEO
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验