Eclipse构建WebService

Eclipse JavaEE 构建 WebService

若要使用 IntelliJ IDEA 构建 WecService,请看另一篇博文:IntelliJ IDEA 构建 WebService

准备工作 – 环境配置

本教程采用 Eclipse IDE for Enterprise Java Developers 2019-12,Tomcat 9.0.241,jdk1.8.0_201

本教程默认读者已有 jdk 环境;Eclipse 安装比较简单,无需赘述

  • Eclipse IDE for Enterprise Java Developers (官方下载地址:https://www.eclipse.org/downloads/packages/release/2021-03/r/eclipse-ide-enterprise-java-and-web-developers)
  • Tomcat(官方网址:http://tomcat.apache.org/)
  • jdk(官方下载地址:https://www.oracle.com/cn/java/technologies/javase-downloads.html)

入门案例 – 基于 JAX-WS 发布无服务器部署的 WebService

JAX-WS:Java API For XML-WebService

Java 的 JRE 中已封装了 JAX-WS 的 jar 包,jdk1.6 以上可直接使用 Endpoint 发布方式发布 WebService

1. 新建普通的Java项目

  • 点击菜单栏的 File,选择 New 一个 Java Project

在这里插入图片描述

  • Project name 中输入项目名称,确认项目保存路径无误并且已配置 JRE 后,点击 Finish

在这里插入图片描述

  • 浏览项目结构,在 src 目录下新建三个 package,分别用于存放带有main方法的主类服务接口类服务实现类

如图所示,包和类的命名尽量按照 JavaWeb 开发规范来定义

在这里插入图片描述

2. 编码实现一个简单的WebService

该项目是慢病家居诊治子系统中提供患者慢病查询的WebService(简单粗糙版),

  • 首先编写一个服务接口类,注意在方法上添加 @WebMethod 注解
package com.soa.service;

import javax.jws.WebMethod;

/**
 * ChronicDiseasesServiceImpl.java
 * 
 * @Description webservice接口,定义方法
 * @author Ponder Yao   Email: 18zpyao@stu.edu.cn
 * @version 1.0.0
 * @date 2021年4月21日上午12:32:37
 *
 */

public interface ChronicDiseasesService {
	
	/**
	 * @Description 通过患者姓名查询当前所患慢病
	 * @param name 患者姓名
	 * @return 患者所患慢病名称
	 */
	@WebMethod
	public String queryChronicDiseaseByName(String name);
	
}
  • 其次编写一个服务实现类,实现上一步定义的接口类
package com.soa.service.impl;

import javax.jws.WebService;

import com.soa.service.ChronicDiseasesService;

/**
 * ChronicDiseasesService.java
 * 
 * @Description webservice服务实现类,写具体服务逻辑
 * @author Ponder Yao   Email: 18zpyao@stu.edu.cn
 * @version
 * @date 2021年4月21日上午12:33:18
 *
 */

@WebService
public class ChronicDiseasesServiceImpl implements ChronicDiseasesService {

	@Override
	public String queryChronicDiseaseByName(String name) {
		String chronicDisease = "暂无患病";
		switch (name) {
		case "张三":
			chronicDisease = "高血压";
			break;
		case "李四":
			chronicDisease = "低血糖";
			break;
		case "王五":
			chronicDisease = "糖尿病";
			break;
		default:
			break;
		}
		return chronicDisease;
	}

}
  • 最后编写带main方法的服务发布类,发布上一步完成的服务实现类
package com.soa.main;

import javax.xml.ws.Endpoint;

import com.soa.service.impl.ChronicDiseasesServiceImpl;

/**
 * WebServicePublisher.java
 * 
 * @Description webservice发布,程序启动后不会主动关闭
 * @author Ponder Yao   Email: 18zpyao@stu.edu.cn
 * @version 1.0.0
 * @date 2021年4月21日上午12:34:32
 *
 */

public class WebServicePublisher {

	public static void main(String[] args) {
		//定义服务发布路径
		String publishUri = "http://localhost:9000/services/ChronicDiseasesService";
		Endpoint.publish(publishUri, new ChronicDiseasesServiceImpl());
		System.out.println("成功发布患者慢病查询服务。");
	}

}

3. 运行发布WebService

  • WebServicePublisher.java 右键选择 Run As Java Application,启动 main 方法

在这里插入图片描述

  • 查看输出控制台,成功打印 WebServicePublisher.java 中的输出语句

在这里插入图片描述

  • 在浏览器中输入 WebServicePublisher.java 中定义的访问路径 + ?wsdl(如我定义的是 http://localhost:9000/services/ChronicDiseasesService?wsdl),可以查看到完整的 WSDL 文件,说明 WebService 已成功发布

在这里插入图片描述

进阶案例 – 基于 JAX-WS 发布 Tomcat 部署的 WebService

1. Eclipse 配置 Tomcat 服务器

请先在官网中下载好 Tomcat 服务器,最新版本是 Tomcat 10,推荐下载 Tomcat 9

  • 点击菜单栏的 Window,选择 Preferences 设置首选项

在这里插入图片描述

  • 点击左侧菜单中的 Server,选择 Runtime Environments,点击右侧 Add 按钮添加运行环境

在这里插入图片描述

  • 选择对应版本的 Tomcat 服务器(如 Tomcat 9 应选择 Apache Tomcat v9.0),点击 Next

在这里插入图片描述

  • 点击 Browse 找到并导入本地安装好的 Tomcat 服务器根目录,而后下拉选择 JRE 环境,点击 Finish

在这里插入图片描述

  • 上述步骤完成后,Runtime Environments 视图中出现一组运行环境则说明添加成功,点击 Apply and Close

在这里插入图片描述

2. 新建 web 项目

  • 点击菜单栏的 File,选择 New 一个 Dynamic Web Project

在这里插入图片描述

  • Project name 中输入项目名称,在 Target runtime 中选择 tomcat,Eclipse会根据该选项自动匹配 Dynamic web module version,点击 Finish

在这里插入图片描述

  • 在Eclipse左侧的浏览视图中可以看到 Dynamic Web Project 的目录结构

注意:子目录 JAX-WS Web Services 为发布浏览视图而非编码视图,具体编码需在 Java Resourcessrc 目录下创建。成功发布 WebService 后,子目录 JAX-WS Web Services 才会生成浏览视图

在这里插入图片描述

3. 编码实现 WebService

该项目是慢病家居诊治子系统中提供慢病用药大数据查询的 WebService(较为完整)

  • src 目录下新建 com.soa.entity 包,定义 CDMedication 类(Java Bean:Data Object)

1)先定义实体的成员变量

package com.soa.entity;

/**
 * CDMedication.java
 * 
 * @Description  DO JavaBean 慢病药物
 * @author Ponder Yao   Email: 18zpyao@stu.edu.cn
 * @version 1.0.0
 * @date 2021年4月22日下午1:53:28
 *
 */

public class CDMedication {
	
	/**
	 * 标识ID
	 */
	private Integer id;
	
	/**
	 * 药物名称
	 */
	private String name;
	
	/**
	 * 慢病名称
	 */
	private String chronicDisease;
	
	/**
	 * 使用次数
	 */
	private Integer useCount;
	
	/**
	 * 有效次数
	 */
	private Integer effectiveCount;
	
	/**
	 * 有效程度
	 */
	private Double effectiveness;
	
}

2)右键点击 Source,选择 Generate Getters and Setters,由 Eclipse 自动生成 getter 和 setter 方法

在这里插入图片描述

3)点击 Select All 选择全部成员变量,点击 Generate

在这里插入图片描述

4)类似的,在 Source 中选择 Generate Constructor using Fields 生成全参构造方法(生成后默认不保留无参构造方法,可根据实际情况选择)

在这里插入图片描述

package com.soa.entity;

/**
 * CDMedication.java
 * 
 * @Description  DO JavaBean 慢病药物
 * @author Ponder Yao   Email: 18zpyao@stu.edu.cn
 * @version 1.0.0
 * @date 2021年4月22日下午1:53:28
 *
 */

public class CDMedication {
	
	/**
	 * 标识ID
	 */
	private Integer id;
	
	/**
	 * 药物名称
	 */
	private String name;
	
	/**
	 * 慢病名称
	 */
	private String chronicDisease;
	
	/**
	 * 使用次数
	 */
	private Integer useCount;
	
	/**
	 * 有效次数
	 */
	private Integer effectiveCount;
	
	/**
	 * 有效程度
	 */
	private Double effectiveness;
	
    /**
     * 无参构造
     */
	public CDMedication() {
		
	}

    /**
     * 全参构造
	 * @param id
	 * @param name
	 * @param chronicDisease
	 * @param useCount
	 * @param effectiveCount
	 * @param effectiveness
     */
	public CDMedication(Integer id, String name, String chronicDisease, Integer useCount, Integer effectiveCount,
			Double effectiveness) {
		super();
		this.id = id;
		this.name = name;
		this.chronicDisease = chronicDisease;
		this.useCount = useCount;
		this.effectiveCount = effectiveCount;
		this.effectiveness = effectiveness;
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getChronicDisease() {
		return chronicDisease;
	}

	public void setChronicDisease(String chronicDisease) {
		this.chronicDisease = chronicDisease;
	}

	public Integer getUseCount() {
		return useCount;
	}

	public void setUseCount(Integer useCount) {
		this.useCount = useCount;
	}

	public Integer getEffectiveCount() {
		return effectiveCount;
	}

	public void setEffectiveCount(Integer effectiveCount) {
		this.effectiveCount = effectiveCount;
	}

	public Double getEffectiveness() {
		return effectiveness;
	}

	public void setEffectiveness(Double effectiveness) {
		this.effectiveness = effectiveness;
	}
	
}
  • src 目录下新建 com.soa.service 包,定义 CDMedicationService 服务接口类
package com.soa.service;

import java.util.List;

import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;

import com.soa.entity.CDMedication;

/**
 * CDMedicationService.java
 * 
 * @Description  慢病药物大数据服务接口
 * @author Ponder Yao   Email: 18zpyao@stu.edu.cn
 * @version 1.0.0
 * @date 2021年4月22日下午1:55:41
 *
 */

@WebService
public interface CDMedicationService {

	@WebResult(name="cdMedicationList")
	public List<CDMedication> queryMedicationListByCDName(@WebParam(name="cdName") String cdName);
	
	/**
	 * @Description 普通方法,用于模拟加载数据库数据
	 */
	public void loadCDMedicationDataSource();
}
  • src 目录下新建 com.soa.service.impl 包,定义 CDMedicationServiceImpl 服务实现类
package com.soa.service.impl;

import java.util.ArrayList;
import java.util.List;

import javax.jws.WebService;

import com.soa.entity.CDMedication;
import com.soa.service.CDMedicationService;

/**
 * CDMedicationServiceImpl.java
 * 
 * @Description  慢病药物大数据服务实现类
 * @author Ponder Yao   Email: 18zpyao@stu.edu.cn
 * @version 1.0.0
 * @date 2021年4月22日下午1:56:35
 *
 */

@WebService(endpointInterface = "com.soa.service.CDMedicationService") 
public class CDMedicationServiceImpl implements CDMedicationService {

	/**
	 * 慢病药物大数据列表
	 */
	List<CDMedication> cdMedicationData = null;

	@Override
	public List<CDMedication> queryMedicationListByCDName(String cdName) {
		List<CDMedication> cdMedicationList = new ArrayList<>();
		if (cdName == null || "".trim().equals(cdName)) {
			return cdMedicationList;
		}
		if (cdMedicationData == null) {
			loadCDMedicationDataSource();
		}
		for (int i = 0; i < cdMedicationData.size(); i++) {
			//判断慢病药物数据项中“慢病名称”字段是否为cdName
			if (cdMedicationData.get(i).getChronicDisease().equals(cdName)) {
				cdMedicationList.add(cdMedicationData.get(i));
			}
		}
		return cdMedicationList;
	}

	@Override
	public void loadCDMedicationDataSource() {
		cdMedicationData.add(new CDMedication(1, "利血平", "高血压", 255, 188, 68.7294));
		cdMedicationData.add(new CDMedication(2, "降压灵", "高血压", 391, 269, 71.1024));
		cdMedicationData.add(new CDMedication(3, "比索洛尔", "高血压", 173, 102, 59.9253));
		cdMedicationData.add(new CDMedication(4, "阿替洛尔", "高血压", 156, 101, 63.5610));
		cdMedicationData.add(new CDMedication(5, "口服葡萄糖", "低血糖", 457, 410, 79.2586));
		cdMedicationData.add(new CDMedication(6, "紫灵芝", "低血糖", 411, 326, 66.4429));
		cdMedicationData.add(new CDMedication(7, "二甲双哌片", "糖尿病", 298, 232, 72.5048));
		cdMedicationData.add(new CDMedication(7, "伏格列波糖胶囊", "糖尿病", 164, 117, 61.0107));
	}
	
}

4. 编写 XML 配置文件

由于该案例不采用Eclipse内置的 Axis、Axis2、CXF 等 WebService 框架,因此需要手动添加 web.xmlsun-jaxws.xml 配置文件

  • WebContentWEB-INF 目录下新建 web.xml 文件,配置项目名称以及web容器初始化信息
<?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_2_5.xsd" id="WebApp_ID" version="2.5">
	<!-- 项目名称 -->
	<display-name>TomcatWebServiceDemo</display-name>
	
	<listener>
	    <listener-class>
	        com.sun.xml.ws.transport.http.servlet.WSServletContextListener
	    </listener-class>
	</listener>
	<servlet>  
		<servlet-name>jaxws</servlet-name>  
		<servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class>
		<!-- 设置web容器启动时初始化WS核心Servlet -->  
		<load-on-startup>1</load-on-startup>  
	</servlet>  
	<servlet-mapping>  
		<servlet-name>jaxws</servlet-name>  
		<url-pattern>/services</url-pattern>  
	</servlet-mapping>  
</web-app>
  • WebContentWEB-INF 目录下新建 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">
	<endpoint name="CDMedicationService" implementation="com.soa.service.impl.CDMedicationServiceImpl"
		url-pattern="/service/CDMedicationService" />
</endpoints>

5. 引入 jax-ws 所需 jar 资源

在该 jax-ws 开发方式下,把 WebService 发布到 Tomcat 服务器之前,必须先引入 jax-ws 所需要的 jar 资源(因为 Tomcat 中不包含相关库支持)

  • 下载 jax-ws 2.2 所需 jar 包并导入到 WebContentWEB-INF 下的 lib 目录里

附件中的 jar 包来自 IntelliJ IDEA 新建 WebService 项目时自动下载的资源,建议直接在 IDEA 白嫖
若无安装 IDEA,可下载我上传的资源:基于JAX-WS2.2开发WebService所需jar资源包

在这里插入图片描述

6. 部署到 Tomcat 并运行发布

  • Servers 窗口中找到 Tomcat 服务器,右键选择 Add and Remove

在这里插入图片描述

  • 选择左边 Available 中的需要部署的项目,点击 Add 按钮使其添加到右边 Configured 中,最后点击 Finish

在这里插入图片描述

  • 部署完成后,如图所示在 Tomcat 服务器下出现目标项目

在这里插入图片描述

  • 右键 Tomcat 服务器,选择 Start 启动服务

在这里插入图片描述

  • 服务器启动成功

在这里插入图片描述

7. 浏览器访问查看 WSDL

  • 访问 http://localhost/TomcatWebServiceDemo/service/CDMedicationService 查看所有服务

之所以没有端口号,是因为我个人将 Tomcat 默认端口号设置成 80 了。如需修改端口号,请查看最后的补充

在这里插入图片描述

  • 访问 http://localhost/TomcatWebServiceDemo/service/CDMedicationService?wsdl 查看 WSDL 文件

[

  • 根据蓝色标记的 URL 继续访问 http://localhost/TomcatWebServiceDemo/service/CDMedicationService?wsdl=1 查看存放 portType 信息的 WSDL 文件

在这里插入图片描述

  • 根据蓝色标记的 URL 继续访问 http://localhost/TomcatWebServiceDemo/service/CDMedicationService?xsd=1 查看存放 schema 信息的 WSDL 文件

在这里插入图片描述

补充 – Tomcat 端口设置

  • 双击 Tomcat 服务器,在弹出的窗口的右侧 Ports 选项中,修改 HTTP/1.1 项后面的端口号

在这里插入图片描述

结语

本文仅介绍了 WebSerivice 在基于 JAX-WS 前提下又不依赖框架的实现方式,如果需要完成复杂的服务,请使用 Axis / Axis2 / CXFWebService 框架。

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值