Java webservice详解「建议收藏」

Java webservice详解「建议收藏」Javawebservice详解1webservice概述2webservice核心要素2.1SOAP2.2WSDL3webservice的使用场景4webservice的结构5Java中的webservice5.1webservice服务端5.2webservice客户端6WDSL文件说明7webservice请求与响应监控7webservice在Tomcat中发布…

大家好,又见面了,我是你们的朋友全栈君。

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 { 
   

    @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 = "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,需要加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 使用的全部数据类型;

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 { 
   

    @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="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 { 
   

    @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="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.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
		http://jax-ws.dev.java.net/spring/core http://jax-ws.dev.java.net/spring/core.xsd
		http://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> 

  调用和之前一样

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/158523.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • wireshark抓包分析——TCP/IP协议[通俗易懂]

    wireshark抓包分析——TCP/IP协议[通俗易懂]本文来自网易云社区当我们需要跟踪网络有关的信息时,经常会说“抓包”。这里抓包究竟是什么?抓到的包又能分析出什么?在本文中以TCP/IP协议为例,简单介绍TCP/IP协议以及如何通过wireshark抓包分析。Wireshark是最著名的网络通讯抓包分析工具。功能十分强大,可以截取各种网络封包,显示网络封包的详细信息。Wireshark下载安装,略。注意,若在Windows系统安装Wireshar…

    2022年9月7日
    0
  • 求两个矢量的夹角(带正负)[通俗易懂]

    求两个矢量的夹角(带正负)[通俗易懂]文章目录1由点乘求夹角,再判断正负向量点乘求夹角:2由点乘和叉乘,使用atan2(y,x)求角度1由点乘求夹角,再判断正负向量点乘求夹角:ab=|a||b|cos<a,b>=a.xb.x+a.y*b.y  所以<a,b>=acos((ab)/(|a||b|));  结果为正值,需要判定正负,来确定角方向;由向量叉乘判断正负:  aXb=……

    2022年8月30日
    0
  • pytest的assert_java断言assert

    pytest的assert_java断言assert前言断言是写自动化测试基本最重要的一步,一个用例没有断言,就失去了自动化测试的意义了。什么是断言呢?简单来讲就是实际结果和期望结果去对比,符合预期那就测试pass,不符合预期那就测试failed

    2022年7月31日
    3
  • linux中的ldd命令简介

    linux中的ldd命令简介在linux中,有些命令是大家通用的,比如ls,rm,mv,cp等等,这些我觉得没有必要再细说了。而有些命令,只有开发人员才会用到的,这类命令,作为程序员的我们,是有必要了解的,有的甚至需要熟练使用。有的人总说,这些命令不重要,用的时候去查就行了,这么多么扯淡的说法啊。具体用法细节是可以可查,但至少得知道有ldd这个东西吧。连ldd都不知道,怎么知道ldd是干啥的呢?

    2022年4月28日
    74
  • php 2021永久激活码(最新序列号破解)「建议收藏」

    php 2021永久激活码(最新序列号破解),https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月19日
    56
  • goland 2021.1 激活码破解方法

    goland 2021.1 激活码破解方法,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月15日
    600

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号