智能代码审查助手 - Java Web开发课程应用案例

← 返回案例总览

💻 智能代码审查助手

基于 Cursor AI 的 Java Web 开发教学实践

📚 课程:Java Web 开发 | 👨‍🏫 樊光瑞

📋 案例概述

在 Java Web 开发课程中,学生需要完成一个完整的 Web 项目(如在线购物系统、图书管理系统等)。本案例展示如何使用 Cursor 作为主要工具,配合 ChatGPT、GitHub Copilot 等 AI 辅助工具,实现智能化的代码审查和教学反馈。

💡
核心理念:不是简单地让 AI 帮学生写代码,而是通过 AI 帮助学生发现问题、理解问题、改进代码,培养良好的编程习惯和代码质量意识。

🎯 教学目标

  • 帮助学生掌握 Java Web 核心技术(Servlet、JSP、MVC、数据库操作)
  • 培养代码规范意识和最佳实践
  • 提高代码调试和问题解决能力
  • 理解软件工程中的测试思维
  • 学会使用现代 AI 辅助工具提升开发效率

🛠️ 技术栈与工具

Cursor (主要) ChatGPT GitHub Copilot JUnit 5 Maven Tomcat MySQL Git

📄 课程项目要求

📋
项目要求文档:完整的 Java Web 开发课程项目要求和评分标准,请查看:
📥 下载项目要求文档 (PDF)

🔄 完整工作流程

1

学生提交代码

学生在 Cursor 中完成项目模块开发,将代码推送到 GitHub 仓库的个人分支。

Git GitHub
2

Cursor AI 初步审查

使用 Cursor 的 AI 功能(Ctrl+K / Cmd+K)对代码进行快速扫描,识别语法错误、潜在 bug 和代码异味。

Cursor
3

运行测试用例

执行预设的 JUnit 测试用例,检查功能实现的正确性和完整性。

JUnit 5 Maven
4

知识点对照检查

对照课程大纲,使用 Cursor 的代码搜索和分析功能,检查学生是否正确应用了要求的知识点。

Cursor
5

生成反馈报告

结合 ChatGPT,生成详细的代码审查报告,包括问题说明、改进建议和学习资源推荐。

ChatGPT Cursor
6

学生迭代改进

学生根据反馈,使用 Cursor 的 AI 辅助功能理解问题并改进代码,重新提交。

Cursor GitHub Copilot

💡 Cursor 使用详解

🎓 教学中的典型使用场景

场景 1:代码理解与解释
学生选中一段不理解的代码,使用 Ctrl+L 打开 Cursor Chat,询问:"这段代码是做什么的?为什么要这样写?"
场景 2:错误诊断与修复
当代码报错时,使用 Ctrl+K 选择错误代码,输入提示词:"分析这个错误的原因,并给出修复建议"
场景 3:代码审查与优化
完成一个功能后,使用 Cursor 询问:"审查这个 Servlet 的代码,检查是否有安全问题、性能问题或不符合最佳实践的地方"

📝 Cursor 提示词示例(Java Web 项目)

审查学生的 UserServlet 代码 Cursor Prompt
请审查这个 UserServlet 的代码,重点检查以下几点:

1. 【知识点应用】
   - 是否正确使用了 Servlet 生命周期方法
   - 是否正确处理了 HTTP 请求和响应
   - 是否使用了 MVC 模式(Model-View-Controller)

2. 【代码质量】
   - 代码是否遵循 Java 命名规范
   - 是否有重复代码需要提取
   - 异常处理是否完善

3. 【安全性】
   - 是否存在 SQL 注入风险
   - 是否对用户输入进行了验证
   - 密码是否加密存储

4. 【性能】
   - 数据库连接是否正确关闭
   - 是否有不必要的数据库查询

请给出具体的问题位置和改进建议,并说明为什么这样改进。
生成针对性的学习建议 Cursor Prompt
分析这个学生的 Java Web 项目代码,识别以下问题:

1. 哪些课程要求的知识点已经正确应用?
2. 哪些知识点使用不够规范,需要改进?
3. 哪些知识点完全缺失,需要补充?

对于每个问题,请:
- 指出具体的代码位置(文件名和行号)
- 说明为什么这是个问题
- 提供一个简短的代码示例展示正确做法
- 推荐相关的学习资源(教材章节或在线资料)

🧪 测试用例设置

测试用例是代码审查的重要组成部分。我们使用 JUnit 5 为每个项目模块预设测试用例,学生代码必须通过这些测试才算完成基本要求。

🎯 测试用例设计原则

功能完整性测试

测试所有要求的功能是否实现(如用户注册、登录、商品查询等)

边界条件测试

测试特殊输入情况(空值、超长字符串、特殊字符等)

异常处理测试

测试错误情况下的处理(数据库连接失败、文件不存在等)

知识点覆盖测试

确保学生使用了课程要求的技术点(如 PreparedStatement 防 SQL 注入)

📌 测试用例示例:用户登录功能

UserLoginTest.java Java / JUnit 5
package com.example.test;

import org.junit.jupiter.api.*;
import static org.junit.jupiter.api.Assertions.*;

/**
 * 用户登录功能测试
 * 测试知识点:Servlet、Session、数据库操作、密码加密
 */
public class UserLoginTest {
    
    @Test
    @DisplayName("测试正确的用户名和密码登录")
    public void testValidLogin() {
        // 测试学生是否正确实现了用户验证逻辑
        String username = "testuser";
        String password = "Test@123";
        
        boolean result = userService.login(username, password);
        assertTrue(result, "有效的用户名和密码应该登录成功");
    }
    
    @Test
    @DisplayName("测试 SQL 注入防护")
    public void testSQLInjectionPrevention() {
        // 重要:检查学生是否使用 PreparedStatement
        String maliciousInput = "admin' OR '1'='1";
        String password = "anything";
        
        boolean result = userService.login(maliciousInput, password);
        assertFalse(result, "应该防止 SQL 注入攻击");
    }
    
    @Test
    @DisplayName("测试密码加密存储")
    public void testPasswordEncryption() {
        // 检查密码是否经过加密(MD5/SHA-256)
        String rawPassword = "Test@123";
        String storedPassword = userDAO.getPasswordByUsername("testuser");
        
        assertNotEquals(rawPassword, storedPassword, 
            "密码不应该明文存储在数据库中");
        assertTrue(storedPassword.length() >= 32, 
            "加密后的密码长度应符合加密算法要求");
    }
    
    @Test
    @DisplayName("测试 Session 管理")
    public void testSessionManagement() {
        // 验证登录后是否正确设置了 Session
        MockHttpServletRequest request = new MockHttpServletRequest();
        MockHttpServletResponse response = new MockHttpServletResponse();
        
        loginServlet.doPost(request, response);
        
        assertNotNull(request.getSession().getAttribute("user"),
            "登录成功后应该在 Session 中存储用户信息");
    }
}

📖 结合课程大纲检查知识点

除了功能测试,更重要的是检查学生是否正确应用了课程要求的知识点。我们使用 Cursor 的代码分析能力,对照课程大纲逐项检查。

📚 Java Web 开发课程大纲(核心知识点)

知识点 1:Servlet 基础与生命周期

检查项:是否正确继承 HttpServlet,是否重写了 doGet/doPost 方法,是否理解 init、service、destroy 的作用

知识点 2:请求与响应处理

检查项:是否正确使用 request.getParameter(),是否设置了正确的 Content-Type,是否处理了中文乱码

知识点 3:MVC 模式应用

检查项:是否将业务逻辑分离到 Service 层,是否使用 DAO 模式访问数据库,是否使用 JSP 作为视图层

知识点 4:数据库连接与 JDBC

检查项:是否使用 PreparedStatement(防 SQL 注入),是否正确关闭资源(try-with-resources),是否使用连接池

!

知识点 5:Session 和 Cookie 管理

检查项:是否正确使用 Session 存储用户状态,是否设置了 Session 超时,是否理解 Cookie 的作用

知识点 6:异常处理与日志

检查项:是否使用 try-catch 处理异常,是否记录了错误日志,是否给用户友好的错误提示

知识点 7:安全性考虑

检查项:是否对用户输入进行验证,是否加密存储敏感信息,是否防止了 XSS 攻击

知识点 8:Filter 和 Listener

检查项:是否使用 Filter 处理编码、权限验证等横切关注点,是否理解 Listener 的应用场景

🔍 使用 Cursor 自动检查知识点

知识点检查提示词 Cursor Prompt
分析这个 Java Web 项目,对照以下课程大纲检查知识点应用情况:

【必须应用的知识点】
1. Servlet 的正确使用(继承 HttpServlet,正确重写方法)
2. MVC 模式(Controller-Service-DAO 三层架构)
3. JDBC 数据库操作(使用 PreparedStatement,正确关闭资源)
4. Session 管理(用户登录状态保持)
5. 请求转发与重定向的正确使用
6. 中文乱码处理
7. 基本的异常处理

【加分项】
1. 使用数据库连接池(如 HikariCP)
2. 使用 Filter 实现编码过滤器和权限验证
3. 密码加密存储
4. 使用日志框架(Log4j/SLF4J)
5. 代码注释完整,命名规范

请对每个知识点给出:
- ✅ 已正确应用 / ⚠️ 应用不规范 / ❌ 缺失
- 具体的代码位置(文件名:行号)
- 如果有问题,说明为什么不符合要求
- 提供改进建议和示例代码

最后给出一个综合评分(0-100分)和总结性评价。

📄 示例检查报告

📋
AI 生成的知识点检查报告示例:查看一份完整的学生代码审查报告,了解 Cursor AI 如何分析和反馈。
📥 下载示例检查报告 (PDF)