Java webservice详解

文章目录

  • 1 webservice概述
  • 2 webservice核心要素
    • 2.1 SOAP
    • 2.2 WSDL
  • 3 webservice的使用场景
  • 4 webservice的结构
  • 5 Java中的webservice
    • 5.1 webservice服务端
    • 5.2 webservice客户端
  • 6 WDSL文件说明
  • 7 webservice 请求与响应监控
  • 8 webservice 在Tomcat中发布
  • 9 在Spring中使用webservice

1 webservice概述

webservice 即 web 服务,因互联网而产生,通过 webservice 这种 web 服务,我们可以实现互联网应用之间的资源共享,比如我们想知道 手机号码归属地,列车时刻表,天气预报,省市区邮政编码等信息,由于我们自己的数据库中并没有这些信息,那么我们可以调用第三方提供的 webservice服务,获取这些信息;

webservice 是一种系统之间进行调用的技术,系统之间调用的技术有:httpClient、hessian、dubbo、webservice 等;WebService 是一种跨越编程语言,跨越操作系统,跨越终端的远程调用技术,比如一个系统是 Java 语言开发的,另一个系统是 PHP 语言开发的,他们之间要实现信息交互,则可以使用 webservice 进行数据交互;

??所以 webservice 实现了异构系统之间的通信,不管是采用什么语言编写的,不管部署在什么操作系统平台上,使用 webservice 都可以实现信息的交换;

2 webservice核心要素

2.1 SOAP

SOAP 英文全称为:Simple Object Access Protocol,即简单对象访问协议,它是基于 xml 格式的消息交换协议;

OAP 定义了信息交换的格式,它包含一个重要的信封 envelope,使用信封envelope 来包装要传递的信息,使用命名空间 namespace 来区分传递的信息;简单来说,在 WebService 中传递的信息就是一封信,SOAP 就是信的通用格式,它定义了一封信应该有信封,信封里装着信的内容;

信封(envlope)的格式是固定的,而信的内容(要传递的数据)可以自己定义;SOAP 协议传输的数据采用 xml 格式进行封装,采用 http 协议进行传输,即soap=xml+http;

2.2 WSDL

WSDL 英文全称为 Web Service Description Language,即 Web Service 描述语言;它使用 xml 对 Web Service 进行描述,比如提供服务的方法、参数、返回值、数据类型等信息进行描述;简单来说,wsdl 就是 webservice 服务的使用说明书;

3 webservice的使用场景

1、应用系统集成
多个应用系统集成在一起,则需要信息交换或通信,那么可以采用 webservice进行通信;

2、异构系统之间通信
异构系统,主要是指编程语言不同的系统;不同系统之间,特别是开发语言不同的系统之间,可以通过 webservice 进行信息交换;

3、软件复用
webservice 可以作为一个公共的服务,供客户端调用,避免软件重复开发工作;

4 webservice的结构

服务端:提供服务,供客户端调用;
客户端:调用服务,获得服务的数据;

在这里插入图片描述

5 Java中的webservice

各种编程语言下都有 webservice 技术,比如 php、c#、Java 等;由于 webservice 定义交互的格式,所以不同编程语言之间可以实现相互调用,数据交换和通信;
Java 中的 webservice,即 Java API for XML-Based Webservices,简称JAX-WS 规范;

JAX-WS 是 sun 公司随 Java 5 发布的一项 webservice 规范,在此之前是JAX-RPC,JAX-RPC 不是很完善;由于 JAX-RPC 并不是很完善,所以在 Java 5 发布后,随即发布了 JAX-RPC2.0,该版本已经比较成熟和完善,后来为了和之前的规范进行区分,又将其改名为JAX-WS 2.0;

Java 5 对应 JAX-WS 2.0 版本;
Java 6 对应 JAX-WS 2.1 版本;
Java 7 对应 JAX-WS 2.2 版本;
目前 JAX-WS 是 2.2.9

5.1 webservice服务端

1、定义一个服务接口及实现,并将实现类注解为@WebService,标注了该注解的类的方法就变为 webservice 方法;

public interface UserService {public String sayHi (String name);public String work (String work);public User getUser (User user);}
/*** 标注了该@WebService注解的类的方法就变为webservice方法*/
@WebService
public class UserServiceImpl implements UserService {@Overridepublic String sayHi(String name) {return "Hi, " + name;}@Overridepublic String work (String work) {return "He is working " + work;}@Overridepublic User getUser (User user) {user.setName(user.getName() + "-service");return user;}
}
public class User {private int id;private String name;private Date birthday;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}
}

2、通过 Endpoint 的 publish 方法,将上一步定义的服务发布出去;

public class Server {public static void main(String[] args) {//发布webserviceString wsAddress = "http://localhost:6868/01-ws-java-server/ws";Endpoint endpoint = Endpoint.publish(wsAddress, new UserServiceImpl());System.out.println("webservice发布成功:" + endpoint.isPublished());}
}

3、运行 main 方法;

4、 在 浏 览 器 里 输入 http://localhost:6868/01-ws-java-server/ws?wsdl 将 会 看 到webservice 的 wsdl 信息;有了服务端的 webservice 描述文件 wsdl,就可以根据这个描述文件开发客户端调用程序
在这里插入图片描述

5.2 webservice客户端

1、根据服务端的 wsdl 文件生成客户端调用代码:
在命令行输入命令(需要配置了 Java 环境变量):
wsimport -encoding [编码] -keep -p [包名] [发布的服务地址?wsdl]
比如:

wsimport -encoding utf8 -keep -p com.ws.stub -Xnocompile http://localhost:6868/01-ws-java-server/ws?wsdl

其中:
wsimport 命令
-encoding 指定生成代码的编码格式
-keep 保存生成的代码
-p 指定包名
-Xnocompile 表示生成的代码不编译

在这里插入图片描述
在这里插入图片描述
2、使用生成的代码调用服务端提供的服务;

public class Client {public static void main(String[] args) {//1.创建一个webservice的客户端UserServiceImplService userServiceImplService = new UserServiceImplService();//2.获取远程服务接口对象UserServiceImpl userService = userServiceImplService.getUserServiceImplPort();//3.直接调用远程服务接口对象的方法String hi= userService.sayHi("张三丰");System.out.println(hi);String work = userService.work("Java");System.out.println(work);User user = new User();user.setId(100);user.setName("张无忌");user.setBirthday(DateUtils.dateToXmlDate(new Date()));User userServer = userService.getUser(user);System.out.println(userServer.getId() + "--" + userServer.getName() + "--" + userServer.getBirthday());}
}

注意Date类型要使用工具类特殊处理

public class DateUtils {/*** 将Date类转换为XMLGregorianCalendar** @param date* @return*/public static XMLGregorianCalendar dateToXmlDate(Date date){Calendar cal = Calendar.getInstance();cal.setTime(date);DatatypeFactory dtf = null;try {dtf = DatatypeFactory.newInstance();XMLGregorianCalendar dateType = dtf.newXMLGregorianCalendar();dateType.setYear(cal.get(Calendar.YEAR));//由于Calendar.MONTH取值范围为0~11,需要加1dateType.setMonth(cal.get(Calendar.MONTH)+1);dateType.setDay(cal.get(Calendar.DAY_OF_MONTH));dateType.setHour(cal.get(Calendar.HOUR_OF_DAY));dateType.setMinute(cal.get(Calendar.MINUTE));dateType.setSecond(cal.get(Calendar.SECOND));return dateType;} catch (DatatypeConfigurationException e) {e.printStackTrace();}return null;}/*** 将XMLGregorianCalendar转换为Date** @param cal* @return*/public static Date xmlDate2Date(XMLGregorianCalendar cal){return cal.toGregorianCalendar().getTime();}
}

6 WDSL文件说明

service

  • 整个 webservice 的服务信息,比如服务名,包括所有的服务;

binding

  • 定义每个服务接口的消息格式和协议细节;

portType

  • 描述整个 webservice 可以被执行的操作及相关信息;

message

  • 定义操作的一个或多个数据参数;

types

  • 定义 webservice 使用的全部数据类型;

7 webservice 请求与响应监控

webservice 的请求和响应是 soap 格式的 xml,可以采用一个端口监听工具 TCPMon,通过这个工具,我们可以非常方便地监听目标端口请求与响应的数据;

TCPMon 相当于一个“ 拦截器”,所有我们向目标服务器发送的数据包和服务器返回的数据包都要经过这个拦截器(也可以叫作代理服务器),进而拦截到请求和响应的数据包;
在这里插入图片描述
如上图,如果不使用监控工具,我们是通过 http://xxx.xxx.xxx:8080 访问服务端的服务;如果使用监控工具,则通过访问监控工具,由监控工具请求服务端的,服务,然后再把结果返回给我们,则访问请求变为:http://xxx.xxx.xxx:9000
需要访问9000重新生成WDSL,并替换掉之前的WDSL,然后重新发起请求。

8 webservice 在Tomcat中发布

1、添加相关依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.ws</groupId><artifactId>03-ws-web-server</artifactId><version>1.0.0</version><dependencies><dependency><groupId>com.sun.xml.ws</groupId><artifactId>jaxws-rt</artifactId><version>2.2.10</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.8</source><target>1.8</target></configuration></plugin></plugins></build></project>

2、编写服务接口

public interface UserService {public String sayHi(String name);public String work(String work);public User getUser(User user);}

3、添加服务实现类,并标注@webservice注解

/*** 标注了该@WebService注解的类的方法就变为webservice方法*/
@WebService
public class UserServiceImpl implements UserService {@Overridepublic String sayHi(String name) {return "Hi, " + name;}@Overridepublic String work (String work) {return "He is working " + work;}@Overridepublic User getUser (User user) {user.setName(user.getName() + "-service");return user;}
}

4、在WEB-INF文件夹下创建webservice配置文件

<?xml version="1.0" encoding="UTF-8"?>
<endpoints xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime" version="2.0"><!-- 服务路径http://网站路径/ws/userService --><endpoint name="userService"implementation="com.ws.service.impl.UserServiceImpl"url-pattern="/ws/userService" /></endpoints>

5、在web,xml中添加WSServlet,servlet3.0也可以不添加如下配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://java.sun.com/xml/ns/javaee"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"id="WebApp_ID" version="3.0"><!-- Servlet 3.0或者以上不需要配置 --><servlet><servlet-name>jaxws</servlet-name><servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>jaxws</servlet-name><url-pattern>/ws/*</url-pattern></servlet-mapping></web-app>

调用和之前一样

9 在Spring中使用webservice

1、导入依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.ws</groupId><artifactId>05-ws-spring-web-server</artifactId><version>1.0.0</version><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>4.3.13.RELEASE</version></dependency><dependency><groupId>org.jvnet.jax-ws-commons.spring</groupId><artifactId>jaxws-spring</artifactId><version>1.9</version></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.8</source><target>1.8</target></configuration></plugin></plugins></build></project>

2、编写服务接口
3、编写接口的实现类,并添加@webservice注解,需要让spring将该类加载为一个bean,所以需要加上@servcice或者@Component注解

/*** 标注了该@WebService注解的类的方法就变为webservice方法*/
@Component
@WebService
public class UserServiceImpl implements UserService {@Overridepublic String sayHi(String name) {return "Hi, " + name;}@Overridepublic String work (String work) {return "He is working " + work;}@Overridepublic User getUser (User user) {user.setName(user.getName() + "-service");return user;}
}

4、添加spring配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><import resource="applicationContext-jaxws.xml"/></beans>

5、配置spring的jax-ws配置文件

<?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:context="http://www.springframework.org/schema/context"xmlns:ws="http://jax-ws.dev.java.net/spring/core"xmlns:wss="http://jax-ws.dev.java.net/spring/servlet"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsdhttp://jax-ws.dev.java.net/spring/core http://jax-ws.dev.java.net/spring/core.xsdhttp://jax-ws.dev.java.net/spring/servlet http://jax-ws.dev.java.net/spring/servlet.xsd"><context:component-scan base-package="com.ws.service.impl" /><!-- 绑定webservice地址,需要与web.xml的地址对应 --><!-- 访问:http://localhost:8080/webservice-server-spring-web//ws/userService"?wsdl --><!--alt + enter--><wss:binding url="/ws/userService"><wss:service><ws:service bean="#userServiceImpl" /></wss:service></wss:binding></beans>

6、配置web.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://java.sun.com/xml/ns/javaee"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"id="WebApp_ID" version="3.0"><!-- needed for ContextLoaderListener --><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext.xml</param-value></context-param><!-- Bootstraps the root web application context before servlet initialization --><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><!-- 用于配置地址栏请求路径 --><servlet><servlet-name>JaxWsServlet</servlet-name><servlet-class>com.sun.xml.ws.transport.http.servlet.WSSpringServlet</servlet-class></servlet><servlet-mapping><servlet-name>JaxWsServlet</servlet-name><url-pattern>/ws/*</url-pattern></servlet-mapping></web-app>

调用和之前一样

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/555550.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java net php_Java.netPHP比较 | php外包与php技术服务商

Java\.net\PHP比较首先&#xff0c;我们把Java 、.Net、 PHP应用方面占有率做个比较&#xff0c;简单的把目前主流应用分成两个大类&#xff0c;一个是企业应用&#xff0c;一个是Web网站应用&#xff0c;下面这个表格是我归纳的&#xff0c;不一定准确&#xff0c;但是能说明一…

HashMap、HashTable、ConcurrentHashMap、HashSet区别 线程安全类

HashMap专题&#xff1a;HashMap的实现原理–链表散列 HashTable专题&#xff1a;Hashtable数据存储结构-遍历规则&#xff0c;Hash类型的复杂度为啥都是O(1)-源码分析 Hash,Tree数据结构时间复杂度分析&#xff1a;HashMap, HashTable&#xff0c;HashSet,TreeMap 的时间复杂…

hibernate mysql cascade_Hibernate第五篇【inverse、cascade属性详解】

前言上一篇博文已经讲解了一对多和多对一之间的关系了&#xff0c;一对多和多对一存在着关联关系(外键与主键的关系)。本博文主要讲解Inverse属性、cascade属性。这两个属性对关联关系都有影响Inverse属性Inverse属性&#xff1a;表示控制权是否转移..true:控制权已转移【当前一…

java请编写公共类继承抽象类_(Java相关)怎么理解抽象类,继承和接口?

著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。作者&#xff1a;海子来源&#xff1a;博客园一.抽象类在了解抽象类之前&#xff0c;先来了解一下抽象方法。抽象方法是一种特殊的方法&#xff1a;它只有声明&#xff0c;而没有具体的实现。抽…

Maven:repositories、distributionManagement、pluginRepositories中repository的区别

一、repositories中的repository二、distributionManagement中的repository三、pluginRepositories中的repository 一、repositories中的repository 表示从什么库地址可以下载项目依赖的库文件&#xff0c;比如&#xff1a; <repositories><repository><id>…

maven配置之:<distributionManagement>snapshot快照库和release发布库

在使用maven过程中&#xff0c;我们在开发阶段经常性的会有很多公共库处于不稳定状态&#xff0c;随时需要修改并发布&#xff0c;可能一天就要发布一次&#xff0c;遇到bug时&#xff0c;甚至一天要发布N次。 我们知道&#xff0c;maven的依赖管理是基于版本管理的&#xff0c…

maven-compiler-plugin 插件详解

作用&#xff1a;指定maven编译的jdk版本和字符集,如果不指定,maven3默认用jdk 1.5 maven2默认用jdk1.3 <plugin> <!-- 指…

面试常见java异常题_Java异常面试题(含答案)

1、Java中异常分为哪两种&#xff1f;编译时异常运行时异常2、异常的处理机制有几种&#xff1f;异常捕捉&#xff1a;try…catch…finally&#xff0c;异常抛出&#xff1a;throws。3、如何自定义一个异常继承一个异常类&#xff0c;通常是RumtimeException或者Exception4、tr…

maven打包插件:maven-compiler-plugin、maven-dependency-plugin、maven-jar-plugin、maven-resources-plugin详解

最近开发的产品&#xff0c;我们是有四五个maven模块&#xff0c;开发阶段一直是在eclipse中运行的&#xff0c;然后快发版的时候&#xff0c;需要把这些项目打成jar包&#xff0c;通过命令去启动&#xff0c;那首先就得把这些模块项目打包&#xff0c;或者拷贝一些资源文件等等…

Java Web访问.action_java设置web首页访问action

index.jsp一般首页进的是静态页面如果需要首页是动态的页面 就需要先进action访问数据 再回到首页显示因为 welcome-file 必须是实际存在的文件&#xff0c;不能是action或者servlet路径如果直接把index.jsp改成action 会出现404index.action直接设置action&#xff0c;404和s…

spring boot中打包插件spring-boot-maven-plugin和maven-jar-plugin的关联

简介 用spring boot快速开发时&#xff0c;通常用spring-boot-maven-plugin插件将springboot的应用程序打包成jar文件&#xff0c;然后通过java -jar运行&#xff0c;很方便。但是如果是部署到服务器上&#xff0c;每次更改代码后替换的包都比较大&#xff0c;至少30MB以上&am…

简化java_JAVA之旅-简化java开发

为了降低java开发的复杂性&#xff0c;spring采取了以下4种关键策略基于POJO的轻量级和最小侵入行编程为使不让应用与框架绑死&#xff0c;一个bean不会实现&#xff0c;继承或者导入Spring API相关的任何东西&#xff0c;只是一个普通的java对象。2. 通过依赖注入和面相接口实…

Maven父子结构的项目依赖使用以及打包依赖_微服务项目(maven父子级项目)怎么打包

Maven父子结构的项目依赖使用以及打包依赖 1&#xff1a;在父子结构项目中&#xff0c;如果要是用其他模块的类。在当前项目中的pom中 加入 其他模块的配置 <dependency><groupId>com.spring.mySpring</groupId><artifactId>mySpring-utils</artif…

搭建一个完整的微服务项目

一.项目技术架构 1.技术栈 前台技术 Node.js、Npm、Vue.js、WebPack、Vue Cli、Element UI 后台架构 微服务架构&#xff1a;按照功能拆分N多个服务&#xff0c;每个服务可以独立技术选型,独立开发,独立部署,独立运维.&#xff0c;单个服务使用基于ssm的springboot&#xff0…

java 雅思_基于JAVA的雅思考试管理系统的设计与实现(SSH,MySQL)(含录像)

基于JAVA的雅思考试管理系统的设计与实现(SSH,MySQL)(含录像)(任务书,毕业论文12000字,程序代码,MySQL数据库)本文分析了基于JAVA的雅思考试管理系统的设计与实现技术&#xff0c;结合实际提出了本系统的总体结构设计和主要模块的功能实现。本系统分为二个子系统:管理员子系统&…

java开发利器 源码_Java开发的利器: 反编译工具 JD-GUI

老赵说起来也能算个Java程序员&#xff0c;可是写过的Java代码并不多&#xff0c;可老赵实实在在是从程序员干起的。虽然肚子里也装了不少的东西&#xff0c;可作为一件乐此不疲的事情&#xff0c;就是看那些所谓“高人”的代码。高人们的行事风格&#xff0c;十人十样&#xf…

Maven搭建Nexus私服

私服的介绍 1 什么是私服 私服是一种特殊的远程仓库&#xff0c;它是架设在局域网的仓库服务&#xff0c;私服代理广域网上的远程仓库&#xff0c;供局域网使用。 在企业开发中&#xff0c;私服的建设是有必要的&#xff0c;其好处如下&#xff1a; 1.1 节省资金、外网带宽…

java类加载面试题_java 类加载过程?【面试题详解】

今天爱分享给大家带来java 类加载过程?【面试题详解】&#xff0c;希望能够帮助到大家。java 类加载需要经历一下 7 个过程:加载加载时类加载的第一个过程&#xff0c;在这个阶段&#xff0c;将完成一下三件事情: 1. 通过一个类的全限定名获取该类的二进制流。2. 将该二进制流…

Java中Calendar类的常用方法

Calendar类常用方法的记录&#xff1a; 获取时间 // 使用默认时区和语言环境获得一个日历Calendar cal Calendar.getInstance();// 赋值时年月日时分秒常用的6个值&#xff0c;注意月份下标从0开始&#xff0c;所以取月份要1System.out.println("年:" cal.get(Cal…

Java啤酒生产系统描述_Java描述设计模式(03):工厂方法模式

一、工厂方法模式1、生活场景系统常见的数据导出功能&#xff1a;数据导出PDF、WORD等常见格式。2、工厂方法模式是类的创建模式&#xff0c;又叫做虚拟构造子(Virtual Constructor)模式或者多态性工厂(Polymorphic Factory)模式。工厂方法模式的用意是定义一个创建产品对象的工…