12.3
四、核心功能开发(按模块逐步实现)
模块 1:数据库工具类(util 层,确保数据库连接)
创建com.student.daily.util.DBUtil.java,封装数据库连接与关闭操作,避免重复代码:
java
运行
package com.student.daily.util;
import java.sql.*;
/**
-
数据库工具类
-
班级:2023级XX班
-
作者:XXX
-
学号:2023XXXX
-
日期:2024-12-27
*/
public class DBUtil {
// 数据库连接信息(需替换为自己的MySQL用户名和密码)
private static final String URL = "jdbc:mysql://localhost:3306/daily_summary_db?useSSL=false&serverTimezone=UTC";
private static final String USER = "root";
private static final String PASSWORD = "你的MySQL密码";// 加载驱动(静态代码块,仅执行一次)
static {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
throw new RuntimeException("MySQL驱动加载失败!");
}
}// 获取数据库连接
public static Connection getConnection() {
try {
return DriverManager.getConnection(URL, USER, PASSWORD);
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException("数据库连接失败!");
}
}// 关闭资源(ResultSet、PreparedStatement、Connection)
public static void close(ResultSet rs, PreparedStatement pstmt, Connection conn) {
try {
if (rs != null) rs.close();
if (pstmt != null) pstmt.close();
if (conn != null) conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
模块 2:实体类(entity 层,映射数据库表)
以User(人员信息)和DailyReport(日报信息)为例,创建实体类(使用 lombok 可简化 getter/setter,若未使用则手动编写):
- User.java
java
运行
package com.student.daily.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
- 人员实体类(对应t_user表)
- 班级:2023级XX班
- 作者:XXX
- 学号:2023XXXX
- 日期:2024-12-27
*/
@Data // 自动生成getter、setter、toString等方法
@NoArgsConstructor // 无参构造
@AllArgsConstructor // 全参构造
public class User {
private String userId; // 人员ID(学号/工号)
private String userName; // 姓名
private Integer userCategory;// 人员类别(0学生/1小组长/2教师)
private Integer groupNo; // 组号
}
- DailyReport.java
java
运行
package com.student.daily.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
- 日报实体类(对应t_daily_report表)
- 班级:2023级XX班
- 作者:XXX
- 学号:2023XXXX
- 日期:2024-12-27
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class DailyReport {
private Integer id; // 日报编号
private String publishdate; // 发表时间(20241227)
private String stuno; // 学号
private String name; // 姓名
private Integer spenttime; // 所花时间(小时)
private Integer codeamount; // 代码量(行)
private Integer blogsnumber; // 博客量(篇)
private String knowledgepoints; // 知识点
private String state; // 状态(待审批/通过/评分/退回)
private Integer dailyscore; // 评分
private String statereason; // 评语
}
模块 3:登录功能(核心入口,区分角色)
- DAO 层(UserDao.java):查询用户信息
创建com.student.daily.dao.UserDao.java,实现根据userId和userCategory查询用户(登录验证逻辑):
java
运行
package com.student.daily.dao;
import com.student.daily.entity.User;
import com.student.daily.util.DBUtil;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
-
用户DAO层(操作t_user表)
-
班级:2023级XX班
-
作者:XXX
-
学号:2023XXXX
-
日期:2024-12-27
*/
public class UserDao {
// 登录验证:根据userId(账号)和userCategory(角色)查询用户(注:实际项目需加密码字段,此处按题目需求简化)
public User login(String userId, Integer userCategory) {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
User user = null;
// SQL:查询指定ID和角色的用户
String sql = "SELECT user_id, user_name, user_category, group_no FROM t_user WHERE user_id = ? AND user_category = ?";try { conn = DBUtil.getConnection(); pstmt = conn.prepareStatement(sql); pstmt.setString(1, userId); pstmt.setInt(2, userCategory); rs = pstmt.executeQuery(); if (rs.next()) { // 封装查询结果为User对象 user = new User(); user.setUserId(rs.getString("user_id")); user.setUserName(rs.getString("user_name")); user.setUserCategory(rs.getInt("user_category")); user.setGroupNo(rs.getInt("group_no")); } } catch (SQLException e) { e.printStackTrace(); } finally { DBUtil.close(rs, pstmt, conn); } return user; // 若查询不到,返回null(登录失败)}
}
- Service 层(UserService.java):封装登录业务逻辑
创建com.student.daily.service.UserService.java和实现类UserServiceImpl.java:
java
运行
// UserService.java(接口)
package com.student.daily.service;
import com.student.daily.entity.User;
public interface UserService {
// 登录方法:参数为账号(userId)、角色(userCategory),返回用户信息
User login(String userId, Integer userCategory);
}
// UserServiceImpl.java(实现类)
package com.student.daily.service.impl;
import com.student.daily.dao.UserDao;
import com.student.daily.entity.User;
import com.student.daily.service.UserService;
// 业务层依赖DAO层,通过new创建DAO实例(实际项目可用Spring注入)
public class UserServiceImpl implements UserService {
private UserDao userDao = new UserDao();
@Override
public User login(String userId, Integer userCategory) {
// 简单业务校验:账号不为空
if (userId == null || userId.trim().isEmpty()) {
return null;
}
// 调用DAO层方法查询用户
return userDao.login(userId, userCategory);
}
}
3. Controller 层(LoginServlet.java):处理登录请求
创建com.student.daily.controller.LoginServlet.java,继承HttpServlet,处理前端登录请求:
java
运行
package com.student.daily.controller;
import com.student.daily.entity.User;
import com.student.daily.service.UserService;
import com.student.daily.service.impl.UserServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
/**
-
登录Servlet(处理登录请求)
-
班级:2023级XX班
-
作者:XXX
-
学号:2023XXXX
-
日期:2024-12-27
*/
@WebServlet("/login") // 配置Servlet访问路径
public class LoginServlet extends HttpServlet {
private UserService userService = new UserServiceImpl();@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1. 设置请求编码(解决中文乱码)
request.setCharacterEncoding("UTF-8");
// 2. 获取前端传递的参数(账号、角色)
String userId = request.getParameter("userId"); // 对应登录页输入框name="userId"
String userCategoryStr = request.getParameter("userCategory"); // 角色(0/1/2)
Integer userCategory = Integer.parseInt(userCategoryStr); // 转换为整数// 3. 调用Service层登录方法 User user = userService.login(userId, userCategory); // 4. 处理登录结果 if (user != null) { // 登录成功:将用户信息存入Session(用于后续权限判断) HttpSession session = request.getSession(); session.setAttribute("loginUser", user); // 根据角色跳转至对应功能页 if (userCategory == 0) { // 学生 response.sendRedirect(request.getContextPath() + "/student/index.jsp"); } else if (userCategory == 1) { // 小组长 response.sendRedirect(request.getContextPath() + "/leader/index.jsp"); } else if (userCategory == 2) { // 教师 response.sendRedirect(request.getContextPath() + "/teacher/index.jsp"); } } else { // 登录失败:返回登录页,提示错误信息 request.setAttribute("errorMsg", "账号或角色错误,请重新选择!"); request.getRequestDispatcher("/login.jsp").forward(request, response); }}
// 处理GET请求(默认跳转登录页)
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
- 前端登录页面(login.jsp):用户交互界面
在webapp目录下创建login.jsp,设计登录表单(包含账号输入框、角色下拉框、登录按钮):
jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>

浙公网安备 33010602011771号