java web接口开发(四) 接口开发补坑1
好久都没写博客了最近的工作重点是H5以及JavaScript方面的后面要是有时间会一直推出博文今天的博文是补坑的之前写了几篇有关java web接口开发的文章有的朋友留言说项目导入的时候有问题或者说代码有的地方看不懂等等其他问题。那么今天就来说说这些问题如果你还没了解之前的接口博文请先看java web接口开发(二) 接口开发具体实现一、项目导入报错。从csdn资源下载的代码由Eclipse导入后正常情况下应该是会报错的这个主要是我在导入项目的时候没有将依赖的jar导入至lib目录中所以导入项目的时候很有可能会报错报错截图如下因为这个javax.servlet.* 包用的是Tomact下的 servlet-api.jar。这个问题的解决办法是有2种方法1从Tomact中的lib中找到这个servlet-api.jar复制到项目的lib目录下然后在这个jar上右键---Build Path---Add Build Path即可方法2 选项目右键---Properties---Java Build Path---Libraries---Add Library---Server RunTime点击next然后选择你的本地Tomact server---Finish最后点击Apply---OK即可大功告....!结果可能还是报错了就像这样的看截图这个错误是说这个项目之前使用的是Tomact v6.0而我现在给他配置的是 Tomact v8.5这个解决方法网上就比较多了打开项目settings目录 org.eclipse.wst.common.project.facet.core.xml文件删除 runtime nameApache Tomcat v6.0/ 这一行保存然后刷新项目这个错误就没了但是你可能还会遇到其他的错误例如提示说jre的版本不匹配那么就需要修改项目使用的jre版本这里就不详细列举各种各样的问题的解决方法了如果有问题就自行百度吧相信你可以的二、项目代码详解。这个地方主要是把之前在 java web接口开发(二) 接口开发具体实现写的中的代码再次梳理让小伙伴们在本篇博文中就可以直观的看出项目结构以及主要代码下面先给出整个项目的目录结构树如下图所示下面一一来介绍这些包以及类1. cn.xinxing.action.student 这个包中是放置接口的也就是向外部调用提供接口下面我们就看看具体接口的代码package cn.xinxing.action.student; import java.io.IOException; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import cn.xinxing.business.StudentBusiness; import cn.xinxing.json.core.ListObject; import cn.xinxing.json.responseUtils.ResponseUtils; import cn.xinxing.json.status.StatusHouse; import cn.xinxing.json.utils.JackJsonUtils; import cn.xinxing.model.Students; /** * Servlet implementation class StudentInq */ public class StudentInq extends HttpServlet { private static final long serialVersionUID 1L; /** * see HttpServlet#HttpServlet() */ public StudentInq() { super(); // TODO Auto-generated constructor stub } /** * see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub ListStudents list StudentBusiness.getAllStudents(); ListObject listObjectnew ListObject(); listObject.setItems(list); listObject.setStatusObject(StatusHouse.COMMON_STATUS_OK); String responseText JackJsonUtils.toJson(listObject); ResponseUtils.renderJson(response, responseText); } /** * see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); } }代码比较简单就不多说了相信看过java web接口开发(二) 接口开发具体实现的知道。但是为了这篇文章还是多说一句吧这个类是继承自HttpServlet的也就是说这个类其实是一个Servlet类它内部提供了doGet()和doPost()方法这两个方法其实就是我们经常所说的get请求和post请求而get请求和post请求这两种请求方式相信了解http请求的都知道get请求就是将请求参数直接放到请求路径后post请求是将请求参数放置到请求的body中当然他们还有其他一些区别这里就不多说了我们经常使用的是post请求。而demo中为了方便测试就只实现了get请求。下面看看doGet()方法protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub ListStudents list StudentBusiness.getAllStudents(); // 从数据库获取学生数据列表 ListObject listObjectnew ListObject(); // 创建一个返回对象 listObject.setItems(list);// 将数据列表设置给返回对象的items属性 listObject.setStatusObject(StatusHouse.COMMON_STATUS_OK);// 设置返回对象的响应状态码 String responseText JackJsonUtils.toJson(listObject);//将返回对象转换为json字符串 ResponseUtils.renderJson(response, responseText);//将结果返回会调用者 }每一行代码都加入了注释不难理解有一个地方需要强调一点就是设置返回的响应状态码好多小伙伴对这儿疑问比较大这里再强调一下这里设置的响应状态码是主要为了让调用者收到返回的json结果字符串后解析json时用的简单来说就是a). 如果响应状态码等于‘ok’时调用者才去解析结果字符串b).如果是其他状态码就直接显示结果字符串中的‘msg’。这个是我自己定义的规则大家自己在实际开发中完全可以按照自己的方式去定义解析规则好了有关对外提供的接口类就说到这里。2. cn.xinxing.business 这个包是和数据相关的。连接数据库以及从数据库中获取数据其中DBHelper这个类是连接数据库的。这里我没有使用引入其他框架来维护数据库以及数据处理下面看看这个类的具体实现package cn.xinxing.business; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; /** */ public class DBHelper { public static final String url jdbc:mysql://localhost:3306/students_manage; //数据库url public static final String name com.mysql.jdbc.Driver; //JDBC driver name public static final String user root; //数据库用户名 public static final String password 111111;// 数据库密码 public Connection conn null; //数据库连接对象 public PreparedStatement pst null; //对象 /** * param sql */ public DBHelper(String sql) { try { Class.forName(name);//注册JDBC driver conn DriverManager.getConnection(url, user, password);//打开一个数据库连接 pst conn.prepareStatement(sql);//执行sql后创建了preparedStatemen对象 } catch (Exception e) { e.printStackTrace(); } } /** * 关闭数据库 */ public void close() { try { this.conn.close(); //关闭连接 this.pst.close(); //关闭对象 } catch (SQLException e) { e.printStackTrace(); } } }通过JDBC连接至MySql数据库然后获取到一个PreparedStatement对象通过这个对象来发送sql命令并且从数据库接收数据的属性和方法换句话说通过这个对象我们就可以拿到数据库中的相关数据。接着看StudentBusiness是如何获取数据的还是上代码package cn.xinxing.business; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import cn.xinxing.model.Students; /** * 从数据库中获取数据 */ public class StudentBusiness { /** * 获取所有的学生数据 * return */ public static ListStudents getAllStudents() { ListStudents list new ArrayListStudents();//list对象 String sql null; DBHelper db1 null; sql select *from student;// SQL db1 new DBHelper(sql);//创建DBHelper对象 ResultSet ret null;//创建结果集对象执行sql后返回的数据集合 try { ret db1.pst.executeQuery();//这个方法就类似于执行了SELECT语句一样 while (ret.next()) { int id ret.getInt(1);//第一列是id String name ret.getString(2);//第二列是name int age ret.getInt(3);//第三列是age int sex ret.getInt(4);//第四列是sex Students students new Students();//创建students对象 students.setId(id);//设置id students.setName(name);//设置name students.setAge(age);//设置age students.setSex(sex);//设置sex list.add(students);//将students对象放置到列表中 } //循环从结果集中获取数据并设置到list列表对象中 ret.close();//关闭对象 db1.close();//关系数据库连接 } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } // return list;//返回结果 } /** * 通过id来获取某个学生数据 * param _id * return */ public static Students getStudentInfoById(String _id) { String sql null; DBHelper db1 null; sql select * from student where id _id;// sql db1 new DBHelper(sql);//创建DBHelper对象 ResultSet ret null;//创建结果集对象 Students students new Students();//创建对象 try { ret db1.pst.executeQuery();//正常来说这个结果集只有一个对象 while (ret.next()) { int id ret.getInt(1);//第一列是id String name ret.getString(2);//第二列是name int age ret.getInt(3);//第三列是age int sex ret.getInt(4);//第四列是sex int mobile ret.getInt(5);//第五列是mobile students.setId(id);//设置id students.setName(name);//设置name students.setAge(age);//设置age students.setSex(sex);//设置sex students.setMobile(mobile);//设置mobile } //循环从结果集中获取数据并设置到对象中正常来说这个循环只执行一次 ret.close();//关闭对象 db1.close();//关系数据库连接 } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } // return students;//返回结果 } }这个类提供了两个方法获取数据一个方法是获取数据库中学生表中的所有数据一个根据id参数获取某一个学生的数据。这里用到了PreparedStatement对象如果对这个对象了解更多请看JDBC教程最后补上例子下载地址。客户端Demo下载地址由于篇幅问题下篇文章将继续来详解demo项目的代码 博文中如果有误欢迎指出 java web接口开发(五) 接口开发补坑2已经推出了欢迎大家收看

相关新闻

全栈开发后端核心技术解析与实战

全栈开发后端核心技术解析与实战

1. 全栈开发中的后端核心能力解析作为一位经历过多个全栈项目的老兵,我深刻体会到后端开发在全栈体系中的基石作用。很多人对全栈开发存在误解,认为前端炫酷的界面效果就是全部,实则后端才是支撑整个系统的"隐形骨架"。这次我想分享…

2026/10/11 20:52:35 阅读更多 →
企业微信OpenClaw长连接机器人技术解析与实战

企业微信OpenClaw长连接机器人技术解析与实战

1. 企业微信OpenClaw支持解析:长连接机器人的技术突破企业微信近期正式宣布支持OpenClaw框架,这标志着企业级即时通讯工具在智能机器人领域迈出了关键一步。作为一名长期关注企业IM生态的技术从业者,我第一时间对这项新功能进行了实测验证。O…

2026/10/13 22:04:47 阅读更多 →
SpringBoot自动配置原理与版本差异详解

SpringBoot自动配置原理与版本差异详解

1. SpringBoot自动配置原理深度解析 SpringBoot的自动配置机制是其最核心的特性之一,它极大地简化了Spring应用的初始搭建和开发过程。要真正理解这个"魔法"背后的原理,我们需要从几个关键维度进行剖析。 1.1 条件化配置的实现基础 自动配置…

2026/10/12 20:13:22 阅读更多 →

最新新闻

MoE稀疏激活与FP8量化:本地大模型轻量化的实战指南

MoE稀疏激活与FP8量化:本地大模型轻量化的实战指南

1. 项目概述:一场没有硝烟的七日技术风暴“国庆七天,AI圈没一天消停”——这句话不是夸张修辞,而是过去七年里我持续追踪AI产业动态过程中,头一回在长假期间亲眼见证的、真正意义上的“全周期高强度技术迭代现场”。它不像往年那样…

2026/10/13 22:04:47 阅读更多 →
PSO+SA混合优化算法实战:非凸问题高精度求解指南

PSO+SA混合优化算法实战:非凸问题高精度求解指南

简介:本资源为PSO与模拟退火(SA)融合算法的MATLAB实现包,面向智能优化方向的本科生、研究生及算法工程师,聚焦解决复杂多模态函数优化中易陷局部最优、收敛精度不足等典型问题。压缩包共9个文件(5个核心m脚…

2026/10/13 22:04:47 阅读更多 →
谷歌Agent Skill设计模式实战:从工具调用到规划型,5种模式提升生产稳定性

谷歌Agent Skill设计模式实战:从工具调用到规划型,5种模式提升生产稳定性

1. 从“能跑通”到“跑得稳”:Agent Skill 设计模式到底在解决什么问题很多人第一次接触 Agent 开发时,都会经历一个相似的阶段:写一个能调用工具的循环,接上大模型,跑通一个“查天气”“搜资料”“发邮件”的 Demo&am…

2026/10/13 22:04:47 阅读更多 →
种子填充算法详解:从递归实现到扫描线优化

种子填充算法详解:从递归实现到扫描线优化

计算机图形学课程做到实验四,很多同学的卡点已经从“直线怎么画”变成了“一个多边形怎么填满”。前几次实验跑通了点、线、圆这些基本图元之后,到这一步要处理的不再是一条条轮廓线,而是一块块有边界的区域。种子填充算法就是这条线路上最直…

2026/10/13 22:04:47 阅读更多 →
语义词谜游戏设计:绕过拼写训练词汇提取能力

语义词谜游戏设计:绕过拼写训练词汇提取能力

1. 项目概述:当词典变成游戏界面,我们到底在玩什么? “Show HN: Wick, a daily word game where you guess by meaning, not spelling”——这个标题一出现,我就在某开发者社区的首页多刷了三遍。不是因为它的UI有多炫&#xff0c…

2026/10/13 22:04:47 阅读更多 →
Python Plotly交互式数据可视化:从快速出图到精细定制

Python Plotly交互式数据可视化:从快速出图到精细定制

做数据分析的同学都有一个共同感受:数据算完之后,最头疼的不是处理逻辑,而是怎么把结果变成一张别人一眼能看懂的图。这两年我用得最顺手的工具就是 Plotly,一个典型的 Python 交互式绘图库。用 Plotly 创建交互式图表&#xff0c…

2026/10/13 22:03:47 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →