Java入门级教程10——基于HuTool的web数据服务
本文介绍了基于Hutool工具实现轻量级Web数据服务的完整方案。主要内容包括:1)使用Hutool搭建HTTP服务端;2)实现简单Web查询接口;3)构建完整的数据库查询功能,包括DAO层、业务层和JSON转换层;4)在Eclipse中完成后端服务开发;5)在DevEco Studio中开发鸿蒙前端应用,通过HTTP请求获取后端数据;6)在HBuilderX中实现浏览器端查询。整套方案采用Mav
目录
3.4 在DevEco Stdio中实现前端查询(数据是发送给鸿蒙多设备)
3.5 在HBuilder X中实现前端查询(数据是发送给浏览器)
1.使用轻量级的基于HuTool的web数据服务
步骤一:新建Maven项目,在pom.xml文件中导入hutool依赖
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.38</version>
</dependency>
步骤二:创建Server服务类
package com.hy.chapter2;
import java.nio.charset.Charset;
import cn.hutool.http.ContentType;
import cn.hutool.http.HttpUtil;
public class Server {
public String loadHelloWorld() {
return "欢迎使用轻量级的基于HuTool的web数据服务";
}
public static void main(String[] args) {
HttpUtil.createServer(8650).addAction("/query", (request, response) -> {
Server server = new Server();
String result = server.loadHelloWorld();
response.setCharset(Charset.forName("UTF-8"));
response.write(result, ContentType.TEXT_PLAIN.toString());
}).start();
}
}
输出结果:
Hutool Simple Http Server listen on 【0:0:0:0:0:0:0:0:8650】

2.实现web简单查询
步骤一:加载Maven依赖
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.38</version>
</dependency>
步骤二:实现web查询
package com.hy.javawebdata.server;
import java.nio.charset.Charset;
import cn.hutool.http.ContentType;
import cn.hutool.http.HttpUtil;
import cn.hutool.http.server.SimpleServer;
public class ServerData {
SimpleServer simpleServer = null;
public ServerData(int port) {
simpleServer = HttpUtil.createServer(port);
//启动这个服务
simpleServer.start();
}
public void loadStuService() {
simpleServer.addAction("/querystuall", (request,response)->{
response.setCharset(Charset.forName("UTF-8"));
response.write("你好,学生",ContentType.TEXT_PLAIN.toString());
});
}
public void loadEmpService() {
simpleServer.addAction("/queryempall", (request,response)->{
response.setCharset(Charset.forName("UTF-8"));
response.write("你好,员工",ContentType.TEXT_PLAIN.toString());
});
}
}
package com.hy.chapter3;
import com.hy.javawebdata.server.ServerData;
public class App {
public static void main(String[] args) {
ServerData serverData = new ServerData(8891);
serverData.loadStuService();
serverData.loadEmpService();
}
}
运行结果:
Hutool Simple Http Server listen on 【0:0:0:0:0:0:0:0:8891】
网址显示成功:


3.实现鸿蒙前端以及浏览器查询数据库
3.1 数据库准备

CREATE TABLE t_emp(
eid int PRIMARY KEY auto_increment, -- 员工的编号
ename VARCHAR(20) NOT NULL, -- 员工的姓名
epwd CHAR(8) NOT NULL, -- 员工的密码
ebirthday datetime, -- 员工的出生年月,不设计年龄字段,会造成字段冗余
esalary DOUBLE NOT NULL, -- 员工的工资
eaddress VARCHAR(100) -- 员工的地址
)
-- 表设计的三范式
-- 第一:表中的字段不能再分割,是原子化。
-- 第二:表中的字段不能有传递性,不能通过一个字段计算出另外一个字段。
-- 第三:表中的字段参照唯一的主键
-- 预置数据
INSERT INTO t_emp(ename,epwd,ebirthday,esalary,eaddress)
values("赵五","11111","2000-05-28",90000.56,"南京");
INSERT INTO t_emp(ename,epwd,ebirthday,esalary,eaddress)
values("李六","22222","2004-06-15",88000.69,"盐城");
SELECT * FROM t_emp
SELECT count(ename) from t_emp WHERE ename = "李六" AND epwd = "22222"
3.2 在eclipse中实现web查询
3.2.1 加载Maven依赖
在pom.xml文件中导入依赖,按Ctrl+S保存并加载依赖
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.24</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.38</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.83</version>
</dependency>
3.2.2 实现web查询
(1)这套代码是一个轻量级 Java Web 数据服务的完整实现,基于 Hutool 轻量级 HTTP 服务 和 JDBC 数据库操作。
(2)核心功能是:启动 HTTP 服务(端口 8891),对外提供 /queryempall 接口,查询 MySQL 中 t_emp 表的员工数据,并以 JSON 格式返回给客户端(如浏览器、前端)。
(3)类在包中的分布如下:

(4)具体实现步骤:
步骤一:定义数据访问层:com.hy.javawebdata.dao ,负责 “与数据库交互”,封装 JDBC 操作,对外提供数据访问接口
① 创建接口 IDao,用于规范数据修改
package com.hy.javawebdata.dao;
public interface IDao {
// 无参数的修改操作(如固定SQL的插入/更新)
public int modifyDatas();
// 带参数的修改操作(如动态SQL的插入/更新,参数用Object[]传递)
public int modifyDatas(Object[] params);
}
② 创建抽象类 AbstractDao,用于封装通用数据库逻辑
package com.hy.javawebdata.dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
public abstract class AbstractDao {
// 受保护的数据库连接对象(子类可直接使用)
protected Connection conn;
// 构造函数:初始化时自动连接数据库(JDBC 核心流程)
public AbstractDao() {
try {
// 1. 加载 MySQL 8.0+ 驱动
Class.forName("com.mysql.cj.jdbc.Driver");
// 2. 获取数据库连接(URL、用户名、密码硬编码,后续需优化)
this.conn = DriverManager.getConnection(
"jdbc:mysql://127.0.0.1:3306/mysql2025",
"root",
"yourpassword"
);
} catch (ClassNotFoundException e) {
e.printStackTrace(); // 驱动未找到(如jar包未导入)
} catch (SQLException e) {
e.printStackTrace(); // 连接失败(如URL错误、密码错误)
}
}
public Object[][] queryDatas(String tableName) {
Object[][] datas = null;
// 步骤1:查询表的总记录数(确定二维数组的行数)
String sql1 = "select count(*) from " + tableName;
try {
PreparedStatement pstmt1 = conn.prepareStatement(sql1);
ResultSet rs = pstmt1.executeQuery();
int row = 0;
while (rs.next()) {
row = rs.getInt(1); // 获取count(*)结果
}
// 步骤2:查询表的所有记录(获取数据)
String sql2 = "select * from " + tableName;
PreparedStatement pstmt2 = conn.prepareStatement(sql2);
ResultSet rs1 = pstmt2.executeQuery();
// 步骤3:通过元数据获取列数(确定二维数组的列数)
ResultSetMetaData rsmd = rs1.getMetaData();
int column = rsmd.getColumnCount();
// 步骤4:初始化二维数组,填充数据
datas = new Object[row][column];
int rowIndex = 0;
while (rs1.next()) {
for (int i = 0; i < column; i++) {
// JDBC列索引从1开始,二维数组从0开始
datas[rowIndex][i] = rs1.getObject(i + 1);
}
rowIndex++;
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
this.closeConn();
}
return datas;
}
// 设计关闭连接对象的方法,连接对象占用内存空间,操作一次数据库,关闭一下,保证内存安全。
public void closeConn() {
if (null != conn) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
步骤二:定义JSON 规范层:com.hy.javawebdata.json
创建接口 IJSONData,用于定义 JSON 转换规范
package com.hy.javawebdata.json;
public interface IJSONData {
// 方法:将二维数组转为JSON字符串(参数:数据库查询的二维数组,返回:JSON字符串)
public String makeJsonData(Object[][] datas);
}
步骤三:定义员工业务层:com.hy.javawebdata.emp ,该层是 “员工业务” 的具体实现,包含 “员工数据访问(EmpDao)”“接口绑定(EmpAction)”“JSON 转换(EmpJsonData)” 三个核心组件。
① 创建类EmpDao:员工数据访问实现类
package com.hy.javawebdata.emp;
import com.hy.javawebdata.dao.AbstractDao;
import com.hy.javawebdata.dao.IDao;
public class EmpDao extends AbstractDao implements IDao {
// 实现IDao的无参数修改方法(当前未实现具体逻辑,返回0)
@Override
public int modifyDatas() {
return 0;
}
// 实现IDao的带参数修改方法(当前未实现具体逻辑,返回0)
@Override
public int modifyDatas(Object[] params) {
return 0;
}
}
② 创建类EmpJsonData:员工数据 JSON 转换实现类
package com.hy.javawebdata.emp;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.hy.javawebdata.json.IJSONData;
public class EmpJsonData implements IJSONData {
// 实现IJSONData接口:将员工表的二维数组转为JSON字符串
@Override
public String makeJsonData(Object[][] datas) {
JSONArray arrays = new JSONArray(); // FastJSON的JSON数组容器
// 遍历二维数组的每一行(每一行对应一条员工记录)
for (int i = 0; i < datas.length; i++) {
JSONObject obj = new JSONObject(); // 每条记录对应一个JSON对象
// 手动绑定“字段名-值”(字段名需与t_emps表的列名一致)
obj.put("eid", datas[i][0]);
obj.put("ename", datas[i][1]);
obj.put("epwd", datas[i][2]);
obj.put("ebirthday", datas[i][3]);
obj.put("esalary", datas[i][4]);
obj.put("eaddress", datas[i][5]);
arrays.add(obj); // 将JSON对象加入JSON数组
}
return arrays.toString(); // 转为JSON字符串返回
}
}
③ 创建类EmpAction:员工接口绑定类
package com.hy.javawebdata.emp;
import java.nio.charset.Charset;
import com.hy.javawebdata.dao.AbstractDao;
import com.hy.javawebdata.json.IJSONData;
import cn.hutool.http.ContentType;
import cn.hutool.http.server.SimpleServer;
public class EmpAction {
private SimpleServer simpleServer; // Hutool的轻量级HTTP服务器实例
// 构造函数:接收服务器实例,初始化接口绑定
public EmpAction(SimpleServer simpleServer) {
this.simpleServer = simpleServer;
this.queryEmpService(); // 绑定/queryempall接口
}
// 绑定接口:/queryempall → 查询所有员工数据
public void queryEmpService() {
simpleServer.addAction("/queryempall", (request, response) -> {
// 1. 设置响应编码:UTF-8,避免中文乱码
response.setCharset(Charset.forName("UTF-8"));
// 2. 调用数据库查询员工数据(t_emp表)
AbstractDao dao = new EmpDao();
Object[][] datas = dao.queryDatas("t_emp");
// 3. 将二维数组转为JSON字符串
IJSONData jsonConverter = new EmpJsonData();
String jsonData = jsonConverter.makeJsonData(datas);
// 4. 写入响应:返回JSON数据,指定响应类型为application/json
response.write(jsonData, ContentType.JSON.toString());
});
}
}
步骤四:定义服务启动层:com.hy.javawebdata.server
创建类 ServerData,用于创建 HTTP 服务并初始化业务
package com.hy.javawebdata.server;
import com.hy.javawebdata.emp.EmpAction;
import cn.hutool.http.HttpUtil;
import cn.hutool.http.server.SimpleServer;
public class ServerData {
SimpleServer simpleServer; // Hutool的HTTP服务器实例
// 构造函数:指定端口,创建服务器并初始化
public ServerData(int port) {
// 1. 创建HTTP服务器(端口由外部传入,灵活配置)
simpleServer = HttpUtil.createServer(port);
// 2. 初始化业务动作(绑定接口)
this.initAction();
// 3. 启动服务器(阻塞线程,保持服务运行)
simpleServer.start();
}
// 初始化业务动作:创建EmpAction,绑定员工接口
public void initAction() {
// 注:此处可优化为工厂模式,避免new关键字直接创建对象
new EmpAction(simpleServer);
}
}
步骤五:定义程序入口层:com.hy.chapter4
创建类 App,作为程序启动入口
package com.hy.chapter4;
import com.hy.javawebdata.server.ServerData;
public class App {
public static void main(String[] args) {
// 创建ServerData实例,指定端口8891,启动服务
ServerData serverData = new ServerData(8891);
}
}
运行结果:
Hutool Simple Http Server listen on 【0:0:0:0:0:0:0:0:8891】
3.3 网址查询
3.4 在DevEco Stdio中实现前端查询(数据是发送给鸿蒙多设备)
3.4.1 核心功能
在页面即将显示时,延迟 3 秒发起 HTTP 请求,调用后端接口,获取员工数据并打印日志。
3.4.2 具体实现步骤
步骤一:新建Ability项目,在module.json5文件中添加网络许可:
"requestPermissions": [
{
"name": 'ohos.permission.INTERNET'
},
],

步骤二:在桌面按住Win+R键,在弹窗中输出cmd,打开命令提示符,输入ipconfig找到IPv4地址

步骤三:在DevEco Stdio的Ability项目中中创建Index.ets文件
import {http} from "@kit.NetworkKit"
@Entry
@Component
struct Index {
aboutToAppear(): void {
setTimeout(()=>{
let httpRequest = http.createHttp();
// 192.168.10.5 替换为自己的IPV4地址
httpRequest.request("http://192.168.10.5:8891/queryempall",(errors,datas)=>{
if(!errors){
let resultDatas = datas.result;
console.log("数据为:" + resultDatas);
}
})
},3000)
}
build() {
Column(){
}.width("100%").height("100%").backgroundColor("#aabbcc")
}
}
步骤四:运行成功后查看日志

3.5 在HBuilder X中实现前端查询(数据是发送给浏览器)
跨域查询失败,暂不学习

更多推荐

所有评论(0)