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 Resources
的src
目录下创建。成功发布 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.xml
和sun-jaxws.xml
配置文件
- 在
WebContent
的WEB-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>
- 在
WebContent
的WEB-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 包并导入到
WebContent
的WEB-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
/ CXF
等 WebService
框架。