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> 

  调用和之前一样

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • Java之StringUtils的常用方法

    Java之StringUtils的常用方法StringUtils方法的操作对象是 Java.lang.String类型的对象,是JDK提供的String类型操作方法的补充,并且是null安全的(即如果输入参数String为null则不会抛出NullPointerException,而是做了相应处理,例如,如果输入为null则返回也是null等,具体可以查看源代码)。除了构造器,StringUtils…

  • SQL数据库之索引优缺点

    SQL数据库之索引优缺点 SQL数据库之索引使用原则及利弊 索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。 优点通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。  可以大大加快数据的检索速度,这也是创建索引的最主要的原因。  可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。  在使用分组和排序子句进行数据检索时,…

  • 如何看apache的版本号

    如何看apache的版本号

  • Go语言爱好者周刊:第 3 期

    Go语言爱好者周刊:第 3 期这里记录每周值得分享的Go语言相关内容,周日发布。欢迎投稿,推荐或自荐文章/软件/资源等,请提交issue[1]。鉴于大部分人可能没法坚持把英文文章看完,因此,周…

  • 01.分布式文件系统FastDFS

    01.分布式文件系统FastDFS

  • Spring+Quartz实现定时任务的配置方法[通俗易懂]

    Spring+Quartz实现定时任务的配置方法[通俗易懂]&lt;?xmlversion="1.0"encoding="UTF-8"?&gt;&lt;beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.spring

发表回复

您的电子邮箱地址不会被公开。

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