12.4
- 测试登录功能
配置 Tomcat:点击 IDEA 右上角「Add Configuration」→「+」→「Tomcat Server」→「Local」,在「Deployment」标签页点击「+」→「Artifact」,选择项目的war包(如DailySummarySystem:war),点击「OK」。
启动 Tomcat:点击「Run」按钮,等待服务器启动成功后,在浏览器访问http://localhost:8080/DailySummarySystem/login.jsp。
输入测试数据:
学生:账号20230001,角色选择「学生」,点击登录→跳转至学生首页。
小组长:账号20230002,角色选择「小组长」→跳转至小组长首页。
教师:账号02000069,角色选择「教师」→跳转至教师首页。
模块 4:学生发表日报功能(核心业务之一) - DAO 层(DailyReportDao.java):插入日报数据
创建com.student.daily.dao.DailyReportDao.java,实现「判断当天是否已发表日报」和「插入日报」功能:
java
运行
package com.student.daily.dao;
import com.student.daily.entity.DailyReport;
import com.student.daily.util.DBUtil;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
-
日报DAO层(操作t_daily_report表)
-
班级:2023级XX班
-
作者:XXX
-
学号:2023XXXX
-
日期:2024-12-27
*/
public class DailyReportDao {
// 1. 判断学生当天是否已发表日报(参数:学号、当天日期)
public boolean isReportedToday(String stuno, String todayDate) {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql = "SELECT id FROM t_daily_report WHERE stuno = ? AND publishdate = ?";try { conn = DBUtil.getConnection(); pstmt = conn.prepareStatement(sql); pstmt.setString(1, stuno); pstmt.setString(2, todayDate); rs = pstmt.executeQuery(); return rs.next(); // 若有结果,返回true(已发表) } catch (SQLException e) { e.printStackTrace(); } finally { DBUtil.close(rs, pstmt, conn); } return false;}
// 2. 插入日报数据(发表日报)
public int addDailyReport(DailyReport dailyReport) {
Connection conn = null;
PreparedStatement pstmt = null;
String sql = "INSERT INTO t_daily_report (publishdate, stuno, name, spenttime, codeamount, blogsnumber, knowledgepoints, state) " +
"VALUES (?, ?, ?, ?, ?, ?, ?, '待审批')"; // 初始状态为“待审批”try { conn = DBUtil.getConnection(); pstmt = conn.prepareStatement(sql); // 给SQL参数赋值 pstmt.setString(1, dailyReport.getPublishdate()); pstmt.setString(2, dailyReport.getStuno()); pstmt.setString(3, dailyReport.getName()); pstmt.setInt(4, dailyReport.getSpenttime()); pstmt.setInt(5, dailyReport.getCodeamount()); pstmt.setInt(6, dailyReport.getBlogsnumber()); pstmt.setString(7, dailyReport.getKnowledgepoints()); return pstmt.executeUpdate(); // 返回影响行数(1表示成功) } catch (SQLException e) { e.printStackTrace(); } finally { DBUtil.close(null, pstmt, conn); } return 0; // 插入失败}
}
- Service 层(DailyReportService.java):封装发表日报逻辑
java
运行
// DailyReportService.java(接口)
package com.student.daily.service;
import com.student.daily.entity.DailyReport;
public interface DailyReportService {
// 判断当天是否已发表
boolean isReportedToday(String stuno, String todayDate);
// 发表日报
boolean addDailyReport(DailyReport dailyReport);
}
// DailyReportServiceImpl.java(实现类)
package com.student.daily.service.impl;
import com.student.daily.dao.DailyReportDao;
import com.student.daily.entity.DailyReport;
import com.student.daily.service.DailyReportService;
public class DailyReportServiceImpl implements DailyReportService {
private DailyReportDao dailyReportDao = new DailyReportDao();
@Override
public boolean isReportedToday(String stuno, String todayDate) {
return dailyReportDao.isReportedToday(stuno, todayDate);
}
@Override
public boolean addDailyReport(DailyReport dailyReport) {
// 业务校验:知识点不能为空(否则形式审核不通过,此处提前校验)
if (dailyReport.getKnowledgepoints() == null || dailyReport.getKnowledgepoints().trim().isEmpty()) {
return false;
}
// 调用DAO层插入数据
return dailyReportDao.addDailyReport(dailyReport) > 0;
}
}
3. 工具类:日期格式化(获取当天日期)
创建com.student.daily.util.DateUtil.java,用于生成「yyyyMMdd」格式的当天日期(如 20241227):
java
运行
package com.student.daily.util;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
- 日期工具类
- 班级:2023级XX班
- 作者:XXX
- 学号:2023XXXX
- 日期:2024-12-27
*/
public class DateUtil {
// 获取当天日期(格式:yyyyMMdd)
public static String getTodayDate() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
return sdf.format(new Date());
}
}
- Controller 层(AddDailyServlet.java):处理发表日报请求
java
运行
package com.student.daily.controller;
import com.student.daily.entity.DailyReport;
import com.student.daily.entity.User;
import com.student.daily.service.DailyReportService;
import com.student.daily.service.impl.DailyReportServiceImpl;
import com.student.daily.util.DateUtil;
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("/student/addDaily")
public class AddDailyServlet extends HttpServlet {
private DailyReportService dailyReportService = new DailyReportServiceImpl();@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
// 1. 从Session中获取当前登录学生信息(避免前端传递姓名/学号,保证数据安全)
HttpSession session = request.getSession();
User loginUser = (User) session.getAttribute("loginUser");
if (loginUser == null) {
// 未登录,跳转至登录页
response.sendRedirect(request.getContextPath() + "/login.jsp");
return;
}
String stuno = loginUser.getUserId(); // 学号
String name = loginUser.getUserName(); // 姓名// 2. 获取前端传递的日报数据(所花时间、代码量等) Integer spenttime = Integer.parseInt(request.getParameter("spenttime")); Integer codeamount = Integer.parseInt(request.getParameter("codeamount")); Integer blogsnumber = Integer.parseInt(request.getParameter("blogsnumber")); String knowledgepoints = request.getParameter("knowledgepoints"); // 3. 生成当天日期(不可编辑) String todayDate = DateUtil.getTodayDate(); // 4. 判断当天是否已发表日报 if (dailyReportService.isReportedToday(stuno, todayDate)) { // 已发表,返回发表页提示 request.setAttribute("msg", "今日已发表日报,不可重复提交!"); request.getRequestDispatcher("/student/addDaily.jsp").forward(request, response); return; } // 5. 封装日报实体类 DailyReport dailyReport = new DailyReport(); dailyReport.setPublishdate(todayDate); dailyReport.setStuno(stuno); dailyReport.setName(name); dailyReport.setSpenttime(spenttime); dailyReport.setCodeamount(codeamount); dailyReport.setBlogsnumber(blogsnumber); dailyReport.setKnowledgepoints(knowledgepoints); // 6. 调用Service层发表日报 boolean isSuccess = dailyReportService.addDailyReport(dailyReport); if (isSuccess) { // 发表成功,跳转至日报列表页 response.sendRedirect(request.getContextPath() + "/student/listDaily.jsp"); } else { // 发表失败(如知识点为空),返回发表页 request.setAttribute("msg", "知识点不能为空,请填写具体内容!"); request.getRequestDispatcher("/student/addDaily.jsp").forward(request, response); }}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
- 学生发表日报页面(addDaily.jsp)
在webapp/student目录下创建addDaily.jsp:
jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<h3>发表今日日报</h3>
<form action="${pageContext.request.contextPath}/student/addDaily" method="post">
<div class="form-item">
<label>发表时间:</label>
<input type="text" value="${com.student.daily.util.DateUtil.getTodayDate()}" readonly>
<!-- 日期自动生成,不可编辑 -->
</div>
<div class="form-item">
<label>所花时间(小时):</label>
<input type="number" name="spenttime" required min="0">
</div>
<div class="form-item">
<label>代码量(行):</label>
<input type="number" name="codeamount" required min="0">
</div>
<div class="form-item">
<label>博客量(篇):</label>
<input type="number" name="blogsnumber" required min="0">
</div>
<div class="form-item">
<label>所学知识点:</label>
<textarea name="knowledgepoints" required placeholder="请填写具体知识点,如:Java多线程、MySQL索引..."></textarea>
</div>
<div class="form-item">
<input type="submit" class="btn-submit" value="提交日报">
</div>
<div class="msg">${msg}</div>
</form>

浙公网安备 33010602011771号