IDEA 开发一个简单的 web service 项目,并打包部署到 Tomcat

news2025/2/25 12:38:30

文章目录

  • 实现的效果
  • 一、创建 web service 项目
  • 二、测试类运行 web service 服务端
  • 三、IDEA 打包 web service 项目
  • 四、web service 项目部署到 Tomcat
  • 五、web service 客户端
  • 总结


实现的效果

  • 通过 IDEA 创建一个简单的 web service 项目

  • 用测试类运行这个 web service 项目

  • 通过 IDEA 把 web service 项目打成 war 包

  • web service 项目部署到 Tomcat

  • 访问 web service 服务页面

  • 编写一个 web service 客户端(生成 web service 服务代码)

  • 客户端调用 web service 接口


一、创建 web service 项目

IDEA 创建项目,选择 Java 项目,Next

在这里插入图片描述

填写你的项目名字

在这里插入图片描述

Finish 后创建一个空项目

右键项目包名,选择 Add Framework Support

在这里插入图片描述

勾选 WebServices,选择 Download

在这里插入图片描述

等待一会,项目就变成这样,lib 下就会有需要的包

在这里插入图片描述

里面已经自动给我们创建了一个模板例子了,我们不管他的例子,删除掉,下面用我写的这个 demo

我的 demo 项目很简单,只有这几个文件

在这里插入图片描述
Hello 类代码:

package service;
import javax.jws.WebMethod;
import javax.jws.WebService;

@WebService()
public class Hello {

  // 对外提供的接口 1
  @WebMethod
  public String sayHello(String from) {
    String result = "李启业 " + from;
    System.out.println("接口被调用啦");
    return result;
  }

  // 对外提供的接口 2
  @WebMethod
  public String test(String from) {
    String result = "测试接口 " + from;
    System.out.println("接口被调用啦");
    return result;
  }

}

sun-jaxws.xml

<?xml version="1.0" encoding="UTF-8"?>

<endpoints xmlns='http://java.sun.com/xml/ns/jax-ws/ri/runtime' version='2.0'>

    <!-- 注意这里: -->
    <!-- implementation 必须对上你写的带@WebService的类的路径 -->
    <!-- url-pattern 指定的就是这个 web service 的接口地址 -->
    <!-- 例如:这个项目最终打包成 webservice.war,访问地址就是 http://localhost:8080/webservice/hello -->

    <endpoint
            name="Hello"
            implementation="service.Hello"
            url-pattern="/hello"/>

</endpoints>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <!-- 如果用 tomcat 直接部署 web service ,这个文件好像没什么用,它是创建 web service 项目自带的,我没有去修改它 -->

    <listener>
        <listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class>
    </listener>
    <servlet>
        <description>JAX-WS endpoint</description>
        <display-name>WSServlet</display-name>
        <servlet-name>WSServlet</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>WSServlet</servlet-name>
        <url-pattern>/services/*</url-pattern>
    </servlet-mapping>
</web-app>

TestServer 类代码

package service.test;

import service.Hello;

import javax.xml.ws.Endpoint;

/**
 * @author liqiye
 * @description 用来测试运行 web service 服务的
 * @date 2023/2/21
 */
public class TestServer {

    public static void main(String[] args) {
        Object implementor = new Hello();
        // 这个地址在这里测试用什么都可以,只是我想要刚好对上等下用tomcat部署的连接
        String address = "http://localhost:8080/webservice/hello";
        Endpoint.publish(address, implementor);
    }

}

到这里,web service 项目的服务端就开发好了!

二、测试类运行 web service 服务端

上面代码的 TestServer 就是我们的测试类,直接运行它

访问连接:http://localhost:8080/webservice/hello

看到下面的页面,证明 web service 项目启动成功:
在这里插入图片描述

三、IDEA 打包 web service 项目

注意上面代码中的 sun-jaxws.xml 文件,我在上面已经做了注释,url-pattern 指定的是部署后对外的接口
在这里插入图片描述
配置项目的 Artifacts,先选 Web Application Exploded
在这里插入图片描述
然后再选 Web Application Archive
在这里插入图片描述

点击 IDEA 上面的 Build — Build Artifacts
在这里插入图片描述
在这里插入图片描述

生成 out 目录,里面已经有打好的 war 包了

在这里插入图片描述

四、web service 项目部署到 Tomcat

上面我们已经打包好了 war,要部署到 Tomcat

启动 Tomcat,然后把这个 war 包放进去 /webapps 等待解压部署即可。

访问地址和刚才用测试类启动的连接是一样的: http://localhost:8080/webservice/hello

看到的页面也是一样

五、web service 客户端

我们已经完成 web service 的部署,也访问到了首页,那我们怎么调用刚才里面的 Hello 接口呢?

我们通过编写一个java程序作为客户端,去调用刚才的接口!

创建一个空白项目:
在这里插入图片描述

进去到 liqiye 目录,打开cmd,用 jdk 提供的命令,连接目标 web service 服务生成对应的调用代码

wsimport -s . http://localhost:8080/webservice/hello?wsdl

注意:web service 服务地址后面必须带上 ?wsdl

然后发现项目目录下自动生成了如下代码:
在这里插入图片描述

编写客户端的测试类:

package com.liqiye.client;

import service.HelloService;
import service.Hello;

public class TestClient {
    public static void main(String[] args) throws Exception {
        //构建服务视图对象(从service标签name属性获取)
        HelloService service = new HelloService();
        //获取服务的实现类(从portType的name属性获取
        Hello hello = service.getPort(Hello.class);
        //调用方法(portType下的operation属性获取
        String info = hello.sayHello("你好");
        System.out.println("调用服务端接口方法结果是:"+info);

        String info2 = hello.test("你好");
        System.out.println("调用服务端接口方法结果是:"+info2);
    }
}

执行这个测试类,看到已经成功调用 web service 的接口:

在这里插入图片描述


总结

欢迎指出我的错误!

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

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

相关文章

软件测试面试-一线大厂必问的测试思维面试题

五、测试思维5.1 打电话功能怎么去测&#xff1f;我们会从几个方面去测试&#xff1a;界面、功能、兼容性、易用性、安全、性能、异常。1&#xff09;界面我们会测试下是否跟界面原型图一致&#xff0c;考虑浏览器不同显示比例&#xff0c;屏幕分辨率。2&#xff09;功能&#…

【Linux】环境变量,命令行参数,main函数三个参数保姆教学

目录 ☃️1.奇奇怪怪的现象和孤儿进程 ☃️2.环境变量 ☃️3.深刻理解main函数的前两个参数和命令行参数 ☃️1.奇奇怪怪的现象和孤儿进程 首先回顾一下之前我们学过的fork&#xff08;&#xff09;创建子进程 fork(void)的返回值有两种 注意fork&#xff08;&#xff09;头…

C#:Krypton控件使用方法详解(第八讲) ——kryptonBreadCrumb

今天介绍的Krypton控件中的kryptonBreadCrumb&#xff0c;下面开始介绍这个控件的属性&#xff1a;首先要介绍的是RootItem属性和外观属性&#xff1a;RootItem属性组中包含属性如下&#xff1a;image属性&#xff1a;代表在文字对象的前方插入一个图片&#xff0c;属性值如下图…

多元化业务布局全面开花,松井股份有望步入高成长正轨

2022年&#xff0c;宏观经济下行压力加大、疫情反复不断、国内消费需求不足等诸多因素&#xff0c;导致国内涂料行业遭遇“至暗时刻”&#xff0c;企查查平台数据显示&#xff0c;2022年1-10月&#xff0c;破产重整、注销拍卖的涂料企业超过700家。2月11日&#xff0c;国内涂料…

使用 PyTorch+LSTM 进行单变量时间序列预测(附完整源码)

时间序列是指在一段时间内发生的任何可量化的度量或事件。尽管这听起来微不足道&#xff0c;但几乎任何东西都可以被认为是时间序列。一个月里你每小时的平均心率&#xff0c;一年里一只股票的日收盘价&#xff0c;一年里某个城市每周发生的交通事故数。 在任何一段时间段内记…

代码随想录算法训练营第四天 | 链表理论基础、4. 两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交、142.环形链表II

打卡第四天&#xff0c;因为科三前几天没有带电脑&#xff0c;现在重新补一下第四天的卡 今日任务 24. 两两交换链表中的节点19.删除链表的倒数第N个节点面试题 02.07. 链表相交142.环形链表II 24. 两两交换链表中的节点 给你一个链表&#xff0c;两两交换其中相邻的节点&#…

C++类和对象_02----对象模型和this指针

目录C对象模型和this指针1、成员变量和成员函数分开存储1.1、空类大小1.2、非空类大小1.3、结论2、this指针概念2.1、解决名称冲突2.2、在类的非静态成员函数中返回对象本身&#xff0c;可使用return *this2.3、拷贝构造函数返回值为引用的时候&#xff0c;可进行链式编程3、空…

Python加密算法种类以及开发场景中的运用

不用说火爆一时&#xff0c;全网热议的Web3.0区块链技术&#xff0c;也不必说诸如微信支付、支付宝支付等人们几乎每天都要使用的线上支付业务&#xff0c;单是一个简简单单的注册/登录功能&#xff0c;也和加密技术脱不了干系&#xff0c;本次我们耙梳各种经典的加密算法&…

【RecBole-GNN/源码】RecBole-GNN中lightGCN源码解析

如果觉得我的分享有一定帮助&#xff0c;欢迎关注我的微信公众号 “码农的科研笔记”&#xff0c;了解更多我的算法和代码学习总结记录。或者点击链接扫码关注【RecBole-GNN/源码】RecBole-GNN中lightGCN源码解析 【RecBole-GNN/源码】RecBole-GNN中lightGCN源码解析 原文&…

【C++】初识CC++内存管理

前言 我们都知道C&C是非常注重性能的语言&#xff0c;因此对于C&C的内存管理是每一个C/C学习者必须重点掌握的内容&#xff0c;本章我们并不是深入讲解C&C内存管理&#xff0c;而是介绍C&C内存管理的基础知识&#xff0c;为我们以后深入理解C&C内存管理做铺…

基于 U-Net 网络的遥感图像语义分割 完整代码+论文

一、研究目的U-Net 是一种由全卷积神经网络启发的对称结构网络&#xff0c;在医疗影像分割领域取得了很好的效果。 此次研究尝试使用 U-Net 网络在对多光谱遥感影像数据集上进行训练&#xff0c;尝试使用卷积神经网络自动分割出建筑&#xff0c;希望能够得到一种自动分割遥感影…

ElementUI分页的实现

官网地址&#xff1a;Element - The worlds most popular Vue UI framework 第一步&#xff1a;拷贝你喜欢的分页类型放在你的组件页面需要用到的分页位置 <el-paginationsize-change"handleSizeChange"current-change"handleCurrentChange":current-p…

1.JAVA-JDK安装

前言&#xff1a;工具下载地址阿里云盘&#xff1a;Java-Jdk&#xff1a;https://www.aliyundrive.com/s/JpV55xhVq2A提取码: j53y一、jdk下载&#xff1a;前往Oracle官网可免费下载地址&#xff1a;https://www.oracle.com/java/technologies/downloads/ 此处我下载的是jdk8&a…

【nas折腾篇】抉择吧,是入门还是放弃

2018年公司一位女同事问群晖的nas是否值得买。我一脸懵&#xff0c;以前给公司买云服务有采购nas盘&#xff0c;直接mount挂到服务器上当存储&#xff0c;但对于单独的nas服务器没有什么概念。一晃几年过去了&#xff0c;陆续刷到些nas服务的视频&#xff0c;周边朋友用nas的也…

nginx的介绍及源码安装

文章目录前言一、nginx介绍二、nginx应用场合三、nginx的源码安装过程1.下载源码包2.安装依赖性-安装nginx-创建软连接-启动服务-关闭服务3.创建nginx服务启动脚本4.本实验---纯代码过程前言 高可用&#xff1a;高可用(High availability,缩写为 HA),是指系统无中断地执行其功…

OSI七层模型与物理层与设备链路层

目录 协议 举例 OSI七层模型 理解七层模型 以下为OSI七层模型数据逐层封装和数据逐层解封的过程 TCP/IP参考模型 数据包的层层封装与层层拆包 各层的数据以及协议 封装所用的协议的数字表示形式 物理层 模拟信号 模拟信号特点 数字信号 数字信号特点 数据通信模…

【存储】etcd的存储是如何实现的(3)-blotdb

前两篇分别介绍了etcd的存储模块以及mvcc模块。在存储模块中&#xff0c;提到了etcd kv存储backend是基于boltdb实现的&#xff0c;其在boltdb的基础上封装了读写事务&#xff0c;通过内存缓存批量将事务刷盘&#xff0c;提升整体的写入性能。botldb是etcd的真正的底层存储。本…

CSS预处理器sass和less

文章目录CSS预处理器什么是CSS预处理器Sass和LESS背景介绍Sass背景介绍LESS的背景介绍Sass安装Sass下载Ruby安装文件安装Ruby安装Sass编译Sass命令行编译命令行编译配置选项四种编译排版演示nested 编译排版格式expanded 编译排版格式compact 编译排版格式compressed 编译排版格…

Ethernet-APL——过程自动化的新黄金标准

| Ethernet-APL为终客户和设备制造商带来益处 Ethernet-APL&#xff08;Advanced Physical Layer&#xff0c;高级物理层&#xff09;是一种两线制以太网物理层&#xff0c;它使用了由IEEE 802.3cg所定义的10BASE-T1L&#xff0c;并采用了新的工艺制造规定&#xff0c;因此构成…

2.21多线程

一.并发编程java实现并发编程的方式是多线程其他语言,主打的 并发编程并不一样Go 主要通过多协程的方式实现并发erlang 是通过actor模型实现并发JS 通过定时器和事件回调的方式实现并发二.多线程在java标准库,提供了一个Thread类,表示/操作线程Thread类可以视为Java标准库提供的…