首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
【OpenCV】Chapter2.图像的数值运算
OpenCV的cv2.add()对两张相同大小和类型的图像进行加法运算,或对一张图像与一个标量进行加法运算。 下面这段程序比较了OpenCV 加法和Numpy直接相加的区别。 需要注意的是,常见RGB图像的颜色空间是8位,即RGB数值范围为0—255。cv2.add() 是饱和运算(相加后如大于255则结果为255),而Numpy加法是模运算,即超出255之后,除以255的余数作为数值。
zstar
2022/09/22
1K0
【OpenCV】Chapter2.图像的数值运算
【CV 向】OpenCV 图形绘制指南
Python OpenCV 是一个功能强大的计算机视觉库,除了图像处理和计算机视觉任务外,它还提供了丰富的功能来绘制各种图形。无论是在计算机视觉应用中标记感兴趣区域,还是在图像上绘制几何形状或文本,OpenCV 都为我们提供了简单易用的方法。本文将介绍如何利用 Python OpenCV 进行图形绘制。
繁依Fanyi
2023/10/12
7980
【CV 向】OpenCV 图形绘制指南
[Python图像处理] 二.OpenCV和Numpy读取修改像素、几何图形绘制
该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类应用。希望文章对您有所帮助,如果有不足之处,还请海涵~
Eastmount
2021/12/02
2.6K0
[Python图像处理] 二.OpenCV和Numpy读取修改像素、几何图形绘制
OpenCV 处理中文路径、绘制中文文字的烦恼,这里通通帮你解决!
在 OpenCV 中,由于编码的缘故,对于中文的处理并不是很友好,比如中文路径的图片读取和写入以及在图片上绘制中文文字等,这几个问题都是笔者经常遇到的,本文列出这几个问题的解决办法,希望能够帮助到大家。
机器视觉CV
2020/07/23
9.1K0
OpenCV 处理中文路径、绘制中文文字的烦恼,这里通通帮你解决!
Python OpenCV与中文相关的三个常见问题
--------------------------------------------------------------------------
Color Space
2020/05/19
3.9K0
OpenCV学习笔记(Python)
警告: 就算图像的路径是错的, OpenCV 也不会提醒你的,但是当你使用命 令print img时得到的结果是None。
一点儿也不潇洒
2018/08/07
3.8K0
OpenCV学习笔记(Python)
Python-OpenCV:cv2.imread(),cv2.imshow(),cv2.imwrite()
本机使用python 2.7.10下调试代码均通过,一下学习需要有一定的代码阅读能力,一下学习只介绍函数方法:
狼啸风云
2020/12/18
6.2K0
Python-OpenCV:cv2.imread(),cv2.imshow(),cv2.imwrite()
文字载体图像
算法:文字载体图像是为了更好地检测出人脸,在图像上绘制不同颜色和大小等特性的文字的基础操作。除此之外,还有绘制直线、矩形、圆、椭圆等多种几何图形,并且可以在图像中的指定位置添加文字说明。
裴来凡
2022/05/28
1K0
文字载体图像
OpenCV 系列教程1 | OpenCV 的 GUI 特性
Matplotlib是一个用于Python的绘图库,它提供了多种绘图方法。在这里,将学习如何使用 Matplotlib 显示图像。可以使用 Matplotlib 放大图片,保存图片等。
机器视觉CV
2019/07/15
3.7K0
OpenCV 系列教程1 | OpenCV 的 GUI 特性
OpenCV4.2图像修复重建函数体验---鸡肋
上次看到OpenCV4.2的changelog之后一直想尝试一下新的图像修复重建功能,看下面显示的结果很不错,想试试是否真的如此好用。
Color Space
2020/05/19
8050
OpenCV实现人脸检测和68点定位
考虑到免费开源,OpenCV 就可以很好的实现这个功能。 这里使用OpenCV提供好的人脸分类模型xml:haarcascade_frontalface_alt_tree.xml。 同时利用Dlib官方给的人脸识别预测器“shape_predictor_68_face_landmarks.dat”进行68点标定(利用OpenCV进行图像化处理,在人脸上画出68个点,并标明序号)。
荣仔_最靓的仔
2021/02/02
4.9K1
OpenCV实现人脸检测和68点定位
opencv-python 基本例子3个
其中的内容均参考自官网的说明: http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_tutorials.html
py3study
2020/01/09
1.2K0
opencv-python 基本例子3个
Python-OpenCV 处理图像(一):基本操作
第一种方式使用cv2.cv的LoadImage、ShowImage和SaveImage函数
bear_fish
2018/09/19
1.9K0
Python-OpenCV(1)
本文介绍了如何使用Python和OpenCV库进行数字图像处理,包括图像的读取、显示、保存以及基本的图像处理操作,如直线、圆、矩形、椭圆的绘制,还有文字输入等。此外,还介绍了OpenCV中的绘图函数,包括直线、圆、矩形、椭圆等基本形状的绘制,以及输入文字的操作。
GavinZhou
2018/01/02
1.3K0
Python-OpenCV(1)
计算机视觉:2.6~4.5 颜色空间、数据结构与绘图
最常见的色彩空间就是RGB,人眼也是基于RGB的色彩空间去分辨颜色的。 OpenCV默认使用的是BGR。BGR和RGB色彩空间的区别在于图片在色彩通道上的排列顺序不同。
DioxideCN
2022/08/05
1.1K0
计算机视觉:2.6~4.5 颜色空间、数据结构与绘图
[python opencv 计算机视觉零基础到实战] 十八、用鼠标进行画画
putText方法接收图像,文字内容, 坐标 ,字体,大小,颜色,字体厚度这几个参数,我们用中文的函数原型说明如下:
1_bit
2022/01/06
1.3K0
[python opencv 计算机视觉零基础到实战] 十八、用鼠标进行画画
Halcon缺陷检测实例转OpenCV实现(一)
Halcon中对应的例子为novelty_detection_dyn_threshold.hdev,如下:
Color Space
2020/12/08
1.4K0
open-CV的初步学习
注意:在调用显示图像的API后,要调用cv.waitKey()给图像绘制留下时间,否则窗口会出现无响应情况,并且图像无法显示出来。
shaoshaossm
2022/12/26
7610
open-CV的初步学习
opencv︱图片与视频的读入、显示、写出、放缩与基本绘图函数介绍
opencv中读入、显示、写出图片:cv2.imread(), cv2.imshow(), cv2.imwrite()
悟乙己
2019/05/26
5.8K0
OpenCV应用 | 计算两条曲线之间的最小距离(附源码)
导读 本文主要介绍使用OpenCV计算两条曲线之间的最小距离。 实现目标 【计算两条曲线之间的最小距离】 测试图像: 动态效果演示: 实现步骤与代码 实现步骤: ① 分别找到两条曲线的轮廓; ② 计算每条曲线轮廓点与另一条轮廓上点的距离; ③ 记录距离最小值与对应最小值时的点坐标; ④ 绘制结果。 代码实现与演示: # -*- coding: cp936 -*- import numpy as np import math import cv2 def cal_pt_distance(pt1,
Color Space
2021/09/15
3.8K0
OpenCV应用 | 计算两条曲线之间的最小距离(附源码)
相关推荐
【OpenCV】Chapter2.图像的数值运算
更多 >
LV.0
这个人很懒,什么都没有留下~
目录
  • Webservice 服务学习
  • 1.认识webservice
  • 2.Webservice调用
    • 2.1学习webservice调用的预备知识
    • 2.2 webservice服务网址
    • 2.3 WSDL解析
    • 2.4生成客户端代码
    • 2.5消息体
  • 3.jdk发布webservice服务
  • 4.其他调用webservice的方式
  • 6.复杂消息请求
  • 7.监听器
  • 8.wsdl文档元素名称修改
  • 9.什么是cxf
  • 10.环境搭建
  • 11.运行cxf例子
  • 12.实现cxf第一个示例
  • 13.wsdl2java
  • 14.使用JaxWsServerFactoryBean调用接口服务类
  • 15.拦截输入输出消息
  • 16.在web项目中创建类的cxf服务
  • 17.修改cxf-servlet.xml的位置和文件名
  • 18.在web项目中创建接口的cxf服务
  • 19.使用jquery调用cxf
  • 20.jquery调用cxf的ws小练习
加入讨论
的问答专区 >
1作者擅长5个领域
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档