# 实验2 Web 核心综合实战 **Repository Path**: javaweb-dev-tech/lab2 ## Basic Information - **Project Name**: 实验2 Web 核心综合实战 - **Description**: 实现一个基于 Servlet + Filter + JDBC (Druid) 的完整系统,包含用户登录与用户管理 (CRUD) 模块。 - **Primary Language**: Java - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-01-24 - **Last Updated**: 2026-01-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 实验 2:Java Web 核心技术 (Servlet/JSP/JDBC) > **学生信息填写栏** > * **班级**:_____________ (例如:25级计科S1班) > * **姓名**:_____________ > * **学号**:_____________ > * **完成日期**:2026/***/*** > > --- ## 📝 实验2-实验目标 本实验旨在深入理解 Java Web 开发的核心流程。通过模仿已有的图书管理模块,使用 Servlet + JSP + JDBC 独立实现用户管理模块的增删改查(CRUD)。 在完成图书和用户 CRUD 的基础上,引入 **会话管理** 和 **过滤器** 技术,实现系统的登录验证与权限控制。 **核心技术点**: * **JDBC**:数据库连接与原生 SQL 操作。 * **Servlet**:请求处理、Action 分发模式。 * **JSP/JSTL**:页面展示与数据遍历。 * **Session**:用户登录状态管理。 * **Filter**:请求拦截与权限验证。 ## 📸 实验2-实验结果展示 (Evidence) ### 1. 数据库准备截图 **(要求:在数据库工具中执行 `book.sql` 后,展示 `t_book` 和 `t_user` 表结构的截图)** ### 2. 图书模块运行截图 **(要求:浏览器访问图书列表页,显示初始数据的截图)** ### 3. 用户模块 CRUD 截图 **(要求:完成代码后,展示用户列表页面,需包含至少 2 条数据,且体现出新增/删除操作的效果)** ### 4. 登录与权限控制截图 🌟 **(要求:演示拦截效果。在未登录状态下,直接在地址栏输入 `/user?action=list` 并回车,截图自动跳转回登录页面的效果(若能显示“请先登录”的提示信息更佳))** ### 5. AI 结对编程截图 **(要求:你与 AI 助手对话,让其参照 BookDao 生成 UserDao 代码的界面)** --- ## 🛠️ 操作指南 (Workflow) ### 第一步:Fork & Clone & Init 1. **Fork 仓库**:将本仓库 Fork 到你自己的 Gitee 账号。 2. **Clone 项目**:克隆到本地并使用 IDEA 打开。 3. **初始化数据库**: * 找到项目目录下的 `sql/book.sql` 文件。 * 在数据库工具(Navicat/DBeaver)中执行该脚本。 * **注意**:脚本默认只有 `t_book`,你需要手动编写 SQL 或让 AI 帮你创建 `t_user` 表(字段:id, username, password, email)。 4. **配置数据库连接**: * 打开 `src/main/resources/druid.properties`。 * 修改 `url`, `username`, `password` 为你本地数据库的真实信息。 ### 第二步:分析现有代码 (Book Module) * **Model**: 查看 `edu.wtbu.pojo.Book`。 * **Dao**: 重点阅读 `BookDao.java`,理解 JDBC 的 CRUD 写法。 * **Controller**: 重点阅读 `BookServlet.java`,理解 `service` 方法如何进行 `action` 分发。 * **View**: 查看 `webapp/book.jsp` 和 `book_form.jsp`。 ### 第三步:核心任务 - 实现用户管理 (User Module) 🌟 **目标**:仿照 `BookServlet`,实现对用户的增删改查。 **设计模式**:使用 **Action 分发模式**,URL 示例:`/user?action=list`, `/user?action=add`。 **⚡️ AI 结对编程指南**: 1. **生成 UserDao**: > 向 AI 发送指令:"请参考项目中 BookDao 的写法,帮我编写 UserDao 类。要求使用 JDBC 操作 t_user 表,实现 findAll, add, delete, findById, update 方法。" 2. **生成 UserServlet**: > 向 AI 发送指令:"请参考 BookServlet 的设计模式,帮我生成一个 UserServlet。路径映射为 /user,在 service 方法中根据 action 参数调用对应方法,并转发到 user_list.jsp 或 user_form.jsp。" 3. **编写 JSP**: * 复制 `book.jsp` 重命名为 `user_list.jsp`,修改表格列头和 `` 遍历属性。 * 复制 `book_form.jsp` 重命名为 `user_form.jsp`,修改表单提交地址和输入框 `name` 属性。 ### 第四步:进阶任务 - 登录与权限控制 (Login & Filter) 🚀 **目标**:实现用户登录,并利用 Filter 保护后台资源(如 `/user`, `/book`),防止未登录用户直接访问。 **1. 编写登录功能**: * 创建 `login.jsp`(包含用户名、密码表单)。 * 创建 `LoginServlet` 处理登录请求。 > **🤖 AI 指令 (Prompt)**: > "请帮我创建一个 LoginServlet。逻辑如下: > 1. 接收 `username` 和 `password` 参数。 > 2. 调用 `UserDao.login(username, password)` 验证身份(需在 Dao 中先补充该方法)。 > 3. 验证成功:将用户对象存入 `Session`,跳转到 `/book?action=list`。 > 4. 验证失败:将错误信息存入 `request`,转发回 `login.jsp`。" > > **2. 编写权限过滤器 (AuthFilter)**: * 创建 `AuthFilter` 类,实现 `javax.servlet.Filter` 接口。 > **🤖 AI 指令 (Prompt)**: > "请帮我编写一个权限过滤器 AuthFilter。 > 1. 使用 `@WebFilter("/*")` 拦截所有请求。 > 2. 在 `doFilter` 方法中判断: > * 如果请求路径包含 `/login.jsp`、`/login` 或静态资源(.css, .js, .png),则直接放行 (`chain.doFilter`)。 > * 否则,检查 `Session` 中是否存在用户对象。 > * 如果存在(已登录),放行。 > * 如果不存在(未登录),重定向到 `/login.jsp` 并提示请先登录。" > > > > ### 第五步:保存截图 在项目根目录 `img` 文件夹中保存以下截图: * **`db_init.png`**: 数据库表结构截图。 * **`book_list.png`**: 现有图书模块运行截图。 * **`user_crud.png`**: 你写的用户模块运行截图。 * **`login_filter.png`**: 登录页/拦截效果。 * **`ai_coding.png`**: AI 生成代码的过程截图。 ### 第六步:提交作业 ```bash # 1. 检查状态 git status # 2. 添加文件 git add . # 3. 提交 (请替换真实信息) git commit -m "feat: 完成实验2-用户管理模块,学号2025xxxx 张三" # 4. 推送 git push ``` --- ## ✅ 自查清单 提交前请确认: * [ ] 数据库配置文件 (`druid.properties`) 已修改为本地环境,且连接测试通过。 * [ ] `t_user` 表已创建,且包含基础字段,表包含测试账户。 * [ ] `UserServlet` 能够正确响应 `/user?action=list`。 * [ ] 能够成功添加新用户,并在列表中显示。 * [ ] 能够成功删除用户。 * [ ] **登录功能可用**:输入正确账号能跳转,输入错误账号有提示。 * [ ] **拦截器生效**:复制 `/book?action=list` 的网址在隐身窗口(或注销后)打开,能自动跳转回登录页。 * [ ] 5 张截图文件完整且能正常预览。 --- ## ❓ 常见问题 (FAQ) **Q: 访问页面出现中文乱码?** A: 检查 JSP 头部是否包含 `<%@ page contentType="text/html;charset=UTF-8" ... %>`,以及 Servlet 中是否设置了 `req.setCharacterEncoding("UTF-8")`。 **Q: 报错 `ClassNotFoundException: com.mysql.cj.jdbc.Driver`?** A: 检查 `pom.xml` 中是否引入了 mysql-connector-j 依赖,并点击 Maven 刷新按钮。 **Q: 提交表单后报错 404?** A: 检查 JSP 中 `
` 的路径是否正确。建议使用绝对路径,例如 `${pageContext.request.contextPath}/user?action=add`。 **Q: 数据库连接失败?** A: 检查 `druid.properties` 中的数据库名(database name)是否与你创建的一致,以及 MySQL 服务是否已启动。 **Q: 过滤器导致 CSS/JS 加载失败?** A: 请检查 Filter 的放行逻辑。确保 `request.getRequestURI().endsWith(".css")` 或包含 `/static/` 的路径被排除在拦截规则之外。 **Q: 登录成功了,但跳到其他页面 Session 就丢了?** A: 确保在 `LoginServlet` 中使用的是 `request.getSession().setAttribute(...)`,并且后续请求没有跨域或被浏览器禁用了 Cookie。 **Q: 过滤器进入了死循环(由重定向次数过多报错)?** A: 检查 Filter 逻辑。如果用户未登录且请求就是 `/login.jsp`,必须放行。如果此时还执行“重定向到 login.jsp”,就会死循环。 ---