ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

JavaWeb水果超市项目实战:Servlet+JSP+MySQL从零跑通指南

JavaWeb水果超市项目实战:Servlet+JSP+MySQL从零跑通指南 简介这是一份面向Java Web初学者的实战教学项目基于Servlet技术构建水果超市业务系统覆盖Web开发核心流程适用于高校课程设计、自学练手与求职项目储备。资源共85个文件包含15个Java源码含Servlet与DAO逻辑、14个JSP页面实现商品管理与用户注册等交互界面、30个编译后class文件、6个XML配置含web.xml与数据库连接配置、以及CSS/JS前端资源和图片素材整体压缩包仅2.1MB结构清晰便于快速部署到Tomcat服务器。已有1288人学习下载项目完整集成IDEA开发环境配置、Navicat数据库管理支持并实现了水果信息的增删改查及用户注册登录功能附带pintuer.css响应式样式与jQuery交互脚本开箱即用可直接运行并深入理解MVC分层、HTTP请求处理与前后端协同机制。1. 水果超市Javaweb一个能跑通、能改、能交作业的真实Servlet项目不是Demo而是可调试的黑匣子你刚在IDEA里导入一个叫FruitWeb.zip的压缩包双击index.jsp——页面空白右键Tomcat运行——404打开web.xml发现一堆servlet标签却找不到对应类src/cn/cst/下十几个Java文件名像密码FruitServlet.java、UpdatePWServlet.java但没注释、没日志、没数据库连接配置。这不是“Hello World”这是初学JavaWeb时最真实的翻车现场它有完整MVC骨架有真实业务逻辑水果增删改查用户注册登录有前端样式pintuer.css、有MySQL交互痕迹updatepw.jsp里藏着SQL拼接但它不告诉你哪一行代码决定跳转到list.jsp、为什么add.jsp提交后数据进不了数据库、web.xml里url-pattern和servlet-class怎么配才不报500。这个项目不是玩具它是教学场景下被反复验证过的“最小可交付闭环”用原生ServletJSPMySQL实现CRUD不依赖SpringBoot自动装配所有控制流都暴露在你眼皮底下。适合大二刚学完JDBC、正卡在“Servlet怎么接收表单”“request.setAttribute()到底传给谁”的人——它不教你设计模式但教你怎么把request.getParameter(name)和PreparedStatement.setString(1, name)连成一条线。2. 从解压到启动还原一个能跑起来的JavaWeb环境关键在三处配置联动2.1 解压即结构看清FruitWeb.zip的物理骨架与逻辑分层这个压缩包不是扁平文件堆而是标准JavaWeb项目结构的快照。解压后你会看到src/cn/cst/Java源码根目录所有Servlet和工具类都在这里。注意包名是cn.cst不是com.example这意味着你的web.xml中servlet-class必须写全路径cn.cst.FruitServlet少一个点就404。web/WEB-INF/web.xml这是整个项目的路由中枢。别急着改先数清里面定义了几个servlet7个和几个servlet-mapping7个它们一一对应——比如servlet-namelogin/servlet-name绑定的url-pattern/login/url-pattern最终会触发cn.cst.LoginServlet。web/下的静态资源css/pintuer.css是响应式框架类似Bootstrap精简版js/jquery.js提供DOM操作基础images/里FruitStore.jpg是首页背景图。这些文件路径在JSP里写成link hrefcss/pintuer.css relstylesheet注意是相对web/根目录不是web/WEB-INF/。out/artifacts/FruitWeb_war_exploded/这是IDEA编译后生成的部署目录等价于Tomcat的webapps/子目录。你后续要确认Tomcat是否真的把这个目录当Web应用加载——看Tomcat控制台有没有INFO: Deploying web application directory日志。提示不要手动复制lib/里的jar包到WEB-INF/lib/IDEA的FruitWeb.iml已声明依赖只要Project Structure → Modules → Dependencies里勾选了mysql-connector-java-5.1.47.jar或类似版本IDEA会自动将其打入war包。手动复制会导致重复jar引发ClassCastException。2.2 IDEA配置三步走让Tomcat认出这是个Web应用而不是普通Java模块很多同学卡在“Run”按钮灰色——因为IDEA没识别出这是Web项目。必须手动补全三处配置第一步标记Web资源根目录右键web文件夹 →Mark Directory as→Resources Root错→ 正确操作是Mark Directory as→Web Resources Root。这一步告诉IDEAweb/下的index.jsp、css/、js/都是可被HTTP直接访问的静态资源。第二步配置Artifacts关键File→Project Structure→Artifacts→ 点击→Web Application: Exploded→From modules...→ 选择FruitWeb:war exploded。此时右侧会出现Output directory: 指向out/artifacts/FruitWeb_war_explodedAvailable Elements: 展开FruitWeb→ 勾选WEB-INF/web.xml必须否则Tomcat启动时报No web.xmlWeb Resource Directories: 确保web被列为/根路径第三步Tomcat Server配置Run→Edit Configurations→→Tomcat Server→Local→Deployment选项卡 →Deploy at the server startup→Artifact下拉选FruitWeb:war exploded→Application context填/FruitWeb或留空/但访问地址要对应调整。此时点击RunIDEA会自动启动Tomcat并将out/artifacts/FruitWeb_war_exploded目录复制到Tomcat的webapps/下路径如apache-tomcat-9.0.83/webapps/FruitWeb/。2.3 数据库连接实操用Navicat建库、导表、配驱动三步打通JDBC链路项目没提供SQL建表语句别慌——src/cn/cst/DBUtil.java或类似名称工具类里藏着线索。打开它找DriverManager.getConnection()那一行典型内容是String url jdbc:mysql://localhost:3306/fruitdb?useUnicodetruecharacterEncodingUTF-8; String username root; String password 123456;这意味着你需要用Navicat新建数据库连接本地MySQL → 右键Connection→New Database→ 名称填fruitdb字符集选utf8mb4兼容中文执行建表SQL从list.jsp或FruitServlet.java反推字段观察list.jsp里表格列名编号、水果名称、价格、库存、产地、操作→ 对应建表语句CREATE TABLE fruit ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL, price DECIMAL(10,2) NOT NULL, stock INT NOT NULL, origin VARCHAR(50) );验证驱动版本匹配web/WEB-INF/lib/下找到mysql-connector-java-*.jar如mysql-connector-java-5.1.47.jar确认其与你的MySQL版本兼容MySQL 5.7用5.1.xMySQL 8.0需8.0.x。若不匹配下载对应jar放入lib/并重新Build Artifact。3. Servlet请求链路拆解从index.jsp点击“添加水果”到数据库插入成功的七步追踪3.1 前端触发JSP里的form action如何映射到Servlet打开add.jsp找到关键form标签form actionaddFruit methodpost input typetext namename placeholder水果名称 input typetext nameprice placeholder价格 !-- 其他字段 -- button typesubmit提交/button /form注意actionaddFruit——这不是文件名而是web.xml中定义的URL pattern。搜索web.xmlservlet servlet-nameaddFruit/servlet-name servlet-classcn.cst.AddFruitServlet/servlet-class /servlet servlet-mapping servlet-nameaddFruit/servlet-name url-pattern/addFruit/url-pattern /servlet-mapping结论点击提交 → 浏览器发POST请求到http://localhost:8080/FruitWeb/addFruit→ Tomcat根据web.xml路由到cn.cst.AddFruitServlet的doPost()方法。3.2 后端处理AddFruitServlet.doPost()的四层责任链打开src/cn/cst/AddFruitServlet.java典型结构如下public class AddFruitServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 1. 接收参数注意中文乱码 request.setCharacterEncoding(UTF-8); // 必须在getParameter前调用 String name request.getParameter(name); String priceStr request.getParameter(price); // 2. 类型转换与校验 double price Double.parseDouble(priceStr); // 若priceStr为空会抛NumberFormatException // 3. 调用DAO插入数据库 FruitDao dao new FruitDao(); boolean success dao.addFruit(name, price, ...); // 4. 响应跳转 if (success) { response.sendRedirect(list.jsp); // 重定向避免重复提交 } else { request.setAttribute(msg, 添加失败); request.getRequestDispatcher(add.jsp).forward(request, response); // 转发回原页 } } }关键点request.setCharacterEncoding(UTF-8)必须在getParameter()之前否则中文变??response.sendRedirect(list.jsp)是客户端跳转URL变为/FruitWeb/list.jsp而forward()是服务端跳转URL保持/FruitWeb/addFruit且request对象传递过去所以add.jsp能显示request.getAttribute(msg)。3.3 数据持久化FruitDao.addFruit()如何安全执行INSERTFruitDao.java中核心方法public boolean addFruit(String name, double price, int stock, String origin) { String sql INSERT INTO fruit(name, price, stock, origin) VALUES(?, ?, ?, ?); try (Connection conn DBUtil.getConnection(); PreparedStatement ps conn.prepareStatement(sql)) { ps.setString(1, name); ps.setDouble(2, price); ps.setInt(3, stock); ps.setString(4, origin); return ps.executeUpdate() 0; // 返回影响行数 } catch (SQLException e) { e.printStackTrace(); // 生产环境应记录日志而非打印堆栈 return false; } }这里体现JavaWeb最佳实践使用try-with-resources自动关闭Connection和PreparedStatement避免连接泄漏PreparedStatement预编译防止SQL注入对比INSERT INTO fruit VALUES(name,...)的字符串拼接executeUpdate()返回int判断是否成功插入0表示成功。4. 避坑指南七个让新手崩溃的典型问题现象、原因、解决全拆解4.1 现象访问http://localhost:8080/FruitWeb/显示404但index.jsp明明在web/目录下原因IDEA未正确配置Web Resources Root或web.xml中缺少welcome-file-list配置。解决① 右键web文件夹 →Mark Directory as→Web Resources Root② 在web.xml的web-app标签内末尾添加welcome-file-list welcome-fileindex.jsp/welcome-file /welcome-file-list4.2 现象add.jsp提交后跳转到空白页控制台无报错数据库无数据原因AddFruitServlet.doPost()中request.setCharacterEncoding(UTF-8)位置错误或web.xml中servlet-mapping的url-pattern与form的action不一致。解决① 确认request.setCharacterEncoding(UTF-8)在getParameter()之前② 检查web.xml中servlet-mapping的url-pattern值如/addFruit与add.jsp中form actionaddFruit完全一致注意action值是相对路径不带/开头。4.3 现象list.jsp表格显示??代替中文水果名原因MySQL数据库、表、字段的字符集不是utf8mb4或JDBC URL未指定编码参数。解决① Navicat中右键fruitdb→Alter Database→ 字符集选utf8mb4② 右键fruit表 →Alter Table→ 所有VARCHAR字段字符集设为utf8mb4③ 确认DBUtil.java中JDBC URL包含?useUnicodetruecharacterEncodingUTF-8。4.4 现象点击“删除”按钮a hrefdelete?id1后报HTTP Status 405 – Method Not Allowed原因DeleteServlet只实现了doGet()但a href发起的是GET请求而web.xml中该Servlet的url-pattern可能被错误映射到只处理POST的Servlet。解决① 查web.xml确认delete的servlet-mapping指向cn.cst.DeleteServlet② 打开DeleteServlet.java确保有doGet()方法而非只有doPost()并在其中处理request.getParameter(id)。4.5 现象register.jsp提交后跳转到login.jsp但数据库user表无新记录原因RegisterServlet.java中SQL INSERT语句字段数与?占位符数量不匹配或user表结构与代码中setString(1, username)等参数顺序不一致。解决① 查RegisterServlet的INSERT SQL数VALUES(?, ?, ?)有几个?② 查user表结构Navicat右键表 →Design Table确认字段顺序如id, username, password, email与ps.setString(1, username)等调用顺序严格一致。5. 进阶实战给水果超市加权限拦截器三步实现登录态校验不用Filter也能做5.1 为什么需要拦截器——从admin.css暴露的业务漏洞说起观察web/css/admin.css这个文件名再看web/admin/目录如果存在或list.jsp顶部的管理入口。项目隐含角色分离普通用户只能查管理员才能增删改。但当前所有Servlet如AddFruitServlet都裸奔——任何人知道URL就能调用。真正的JavaWeb项目必须加权限控制而本项目没用Spring Security那就用最朴素的Session校验。5.2 Session校验三步法在每个管理Servlet开头插入校验逻辑以AddFruitServlet.java为例在doPost()方法最开头插入// 1. 获取Session HttpSession session request.getSession(false); // false表示不创建新session // 2. 检查登录态 if (session null || session.getAttribute(user) null) { // 3. 未登录则重定向到登录页并携带返回地址 String referer request.getRequestURI(); // 当前请求路径 response.sendRedirect(login.jsp?redirect URLEncoder.encode(referer, UTF-8)); return; // 重要return终止后续执行 }同理在DeleteServlet.java、UpdatePWServlet.java的doGet()或doPost()开头都加上这段。注意getSession(false)比getSession()安全避免未登录时创建无效sessionURLEncoder.encode()对重定向URL编码防止/addFruit中的/被解析错误。5.3 登录成功后存SessionLoginServlet的终极写法LoginServlet.java中校验用户名密码后假设查数据库成功// 查询用户成功后 User user new User(username, password); // 假设User类有username/password字段 HttpSession session request.getSession(true); // true表示必要时创建新session session.setAttribute(user, user); // 存入session session.setMaxInactiveInterval(1800); // 设置超时30分钟秒 // 读取重定向地址优先使用?redirect参数 String redirect request.getParameter(redirect); if (redirect ! null !redirect.isEmpty()) { response.sendRedirect(redirect); } else { response.sendRedirect(list.jsp); }这样当用户从add.jsp点击登录登录成功后自动回到add.jsp体验无缝。5.4 验证拦截效果用浏览器隐身窗口测试权限链路打开Chrome隐身窗口 → 访问http://localhost:8080/FruitWeb/addFruit→ 应跳转到login.jsp?redirect%2FaddFruit输入正确账号密码登录 → 自动回到addFruit页面再次打开隐身窗口 → 直接访问http://localhost:8080/FruitWeb/list.jsp→ 应正常显示因为list.jsp是公开页面无需拦截修改list.jsp中“添加水果”链接为a hrefaddFruit添加/a→ 点击应触发拦截跳转。注意每次修改Servlet后必须重新Build ArtifactBuild→Build Artifacts→Rebuild否则Tomcat加载的是旧class。我曾因忘记这步在AddFruitServlet里加了10遍校验代码结果全是白费——Tomcat还在跑编译前的class。从那以后我每次改完Servlet都强制走一遍Build → Rebuild Artifact → Restart Tomcat三连哪怕只是加了个日志。希望帮到你。本文还有配套的精品资源点击获取
返回列表