# 实验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 中 `