admin管理员组文章数量:1794759
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
webservice 即 web 服务,因互联网而产生,通过 webservice 这种 web 服务,我们可以实现互联网应用之间的资源共享,比如我们想知道 手机号码归属地,列车时刻表,天气预报,省市区邮政编码等信,由于我们自己的数据库中并没有这些信,那么我们可以调用第三方提供的 webservice服务,获取这些信;
webservice 是一种系统之间进行调用的技术,系统之间调用的技术有:httpClient、hessian、dubbo、webservice 等;WebService 是一种跨越编程语言,跨越操作系统,跨越终端的远程调用技术,比如一个系统是 Java 语言开发的,另一个系统是 PHP 语言开发的,他们之间要实现信交互,则可以使用 webservice 进行数据交互;
??所以 webservice 实现了异构系统之间的通信,不管是采用什么语言编写的,不管部署在什么操作系统平台上,使用 webservice 都可以实现信的交换;
2 webservice核心要素 2.1 SOAPSOAP 英文全称为:Simple Object Access Protocol,即简单对象访问协议,它是基于 xml 格式的消交换协议;
OAP 定义了信交换的格式,它包含一个重要的信封 envelope,使用信封envelope 来包装要传递的信,使用命名空间 namespace 来区分传递的信;简单来说,在 WebService 中传递的信就是一封信,SOAP 就是信的通用格式,它定义了一封信应该有信封,信封里装着信的内容;
信封(envlope)的格式是固定的,而信的内容(要传递的数据)可以自己定义;SOAP 协议传输的数据采用 xml 格式进行封装,采用 http 协议进行传输,即soap=xml+http;
2.2 WSDLWSDL 英文全称为 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 { @Override public String sayHi(String name) { return "Hi, " + name; } @Override public String work (String work) { return "He is working " + work; } @Override public 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) { //发布webservice String wsAddress = "localhost:6868/01-ws-java-server/ws"; Endpoint endpoint = Endpoint.publish(wsAddress, new UserServiceImpl()); System.out.println("webservice发布成功:" + endpoint.isPublished()); } }3、运行 main 方法;
4、 在 浏 览 器 里 输入 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 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,需要加1 dateType.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 使用的全部数据类型;
webservice 的请求和响应是 soap 格式的 xml,可以采用一个端口监听工具 TCPMon,通过这个工具,我们可以非常方便地监听目标端口请求与响应的数据;
TCPMon 相当于一个“ 拦截器”,所有我们向目标服务器发送的数据包和服务器返回的数据包都要经过这个拦截器(也可以叫作代理服务器),进而拦截到请求和响应的数据包; 如上图,如果不使用监控工具,我们是通过 xxx.xxx.xxx:8080 访问服务端的服务;如果使用监控工具,则通过访问监控工具,由监控工具请求服务端的,服务,然后再把结果返回给我们,则访问请求变为:xxx.xxx.xxx:9000 需要访问9000重新生成WDSL,并替换掉之前的WDSL,然后重新发起请求。
8 webservice 在Tomcat中发布1、添加相关依赖
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="maven.apache/POM/4.0.0" xmlns:xsi="www.w3/2001/XMLSchema-instance" xsi:schemaLocation="maven.apache/POM/4.0.0 maven.apache/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 { @Override public String sayHi(String name) { return "Hi, " + name; } @Override public String work (String work) { return "He is working " + work; } @Override public User getUser (User user) { user.setName(user.getName() + "-service"); return user; } }4、在WEB-INF文件夹下创建webservice配置文件
<?xml version="1.0" encoding="UTF-8"?> <endpoints xmlns="java.sun/xml/ns/jax-ws/ri/runtime" version="2.0"> <!-- 服务路径网站路径/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="www.w3/2001/XMLSchema-instance" xmlns="java.sun/xml/ns/javaee" xsi:schemaLocation="java.sun/xml/ns/javaee java.sun/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中使用webservice1、导入依赖
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="maven.apache/POM/4.0.0" xmlns:xsi="www.w3/2001/XMLSchema-instance" xsi:schemaLocation="maven.apache/POM/4.0.0 maven.apache/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 { @Override public String sayHi(String name) { return "Hi, " + name; } @Override public String work (String work) { return "He is working " + work; } @Override public User getUser (User user) { user.setName(user.getName() + "-service"); return user; } }4、添加spring配置文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="www.springframework/schema/beans" xmlns:xsi="www.w3/2001/XMLSchema-instance" xsi:schemaLocation="www.springframework/schema/beans www.springframework/schema/beans/spring-beans.xsd"> <import resource="applicationContext-jaxws.xml"/> </beans>5、配置spring的jax-ws配置文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="www.springframework/schema/beans" xmlns:xsi="www.w3/2001/XMLSchema-instance" xmlns:context="www.springframework/schema/context" xmlns:ws="jax-ws.dev.java/spring/core" xmlns:wss="jax-ws.dev.java/spring/servlet" xsi:schemaLocation="www.springframework/schema/beans www.springframework/schema/beans/spring-beans.xsd www.springframework/schema/context www.springframework/schema/context/spring-context.xsd jax-ws.dev.java/spring/core jax-ws.dev.java/spring/core.xsd jax-ws.dev.java/spring/servlet jax-ws.dev.java/spring/servlet.xsd"> <context:component-scan base-package="com.ws.service.impl" /> <!-- 绑定webservice地址,需要与web.xml的地址对应 --> <!-- 访问: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="www.w3/2001/XMLSchema-instance" xmlns="java.sun/xml/ns/javaee" xsi:schemaLocation="java.sun/xml/ns/javaee java.sun/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>调用和之前一样
本文标签: 详解javawebservice
版权声明:本文标题:Java webservice详解 内容由林淑君副主任自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.xiehuijuan.com/baike/1686932135a119610.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论