1. 本章任务
本章实现教师角色的作业管理功能。
教师需要发布作业题目,发布后可以修改,但是不允许删除。需要注意几点:
作业是属于课程的,所以当老师查看自己所管理的作业列表时,需要查询自己管理课程下面发布的作业。
发布作业题目(title)时,需要同时生成学生应该提交的作业内容(job)记录。加入有30个学生选择了对应课程,则每次发布作业,除了要生成一个title记录,还要生成30条job记录,这样学生登录之后才能看到自己需要提交的作业题目及对应内容、打分情况。
2. 代码实现
之前对项目中实现一个新功能讲的已经比较多了,此处简单的贴一下代码就OK,重点内容会有文字描述。
2.1 添加菜单
public class Constants {
// 用于保存角色及对应的菜单信息
public static HashMap<String, String[][]> roleMenuMap = new HashMap<String, String[][]>();
// 使用static代码块对roleMenuMap进行初始化
static {
// 校长拥有的菜单
roleMenuMap.put("master", new String[][] { { "人员管理", "userManage.jsp" }, { "课程查看", "courseView.jsp" } });
// 教师拥有的菜单
roleMenuMap.put("teacher", new String[][] { { "课程管理", "courseManage.jsp" }, { "作业题目管理", "titleManage.jsp" } });
}
}
1
2
3
4
5
6
7
8
9
10
11
2.2 加载教师所管理的作业
修改Title
public class Title {
private int titleId;
private String titleContent;
private int titleCourse;
private String titleTime;
/**
* 冗余字段用于显示
*/
private String titleCourseName;
// 省略get set方法
}
1
2
3
4
5
6
7
8
9
10
11
修改RouteServlet
else if (childPage.equals("titleManage.jsp")) {
User loginUser = (User) request.getSession().getAttribute("loginUser");
if (loginUser != null) {// 已登录
TitleDao titleDao = new TitleDao();
// 返回值为登录用户所对应的课程
request.setAttribute("titles", titleDao.getTitlesByUserId(loginUser.getUserId()));
}
}
1
2
3
4
5
6
7
8
修改 TitleDao
/**
* 通过userId获取对应作业题目
*/
public List<Title> getTitlesByUserId(int userId) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
List<Title> titles = new ArrayList<Title>();
try {
conn = DbUtils.getConnection();
String sql = "select t.*,c.course_name from title t left join course c on t.title_course=c.course_id left join user u on c.course_user=u.user_id where u.user_id=?";
ps = conn.prepareStatement(sql);
ps.setInt(1, userId);
rs = ps.executeQuery();
while (rs.next()) {
titles.add(makeOneTitle(rs));
}
} catch (SQLException e) {
System.out.println(e.toString());
} finally {
DbUtils.releaseConnection(rs, ps, conn);
}
return titles;
}
/**
* 获取一个
*/
public Title makeOneTitle(ResultSet rs) throws SQLException {
Title title = new Title();
title.setTitleId(rs.getInt("title_id"));
title.setTitleContent(rs.getString("title_content"));
title.setTitleCourse(rs.getInt("title_course"));
title.setTitleTime(rs.getString("title_time"));
if (rs.getString("course_name") != null) {
title.setTitleCourseName(rs.getString("course_name"));
}
return title;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
2.3 显示作业题目列表
添加titleManage.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%><!-- 使用c:标签需要添加本行代码 -->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>titleManage.jsp</title>
<link href="css/content.css" type="text/css" rel="stylesheet" />
</head>
<body>
<div id="content_top">作业题目管理</div>
<div id="content_mid">
<table class="table_theme1">
<thead>
<tr
<tr>
<th>题目编号</th>
<th>题目名称</th>
<th>所属课程</th>
<th>操作</th>
</tr>
</thead>
<c:forEach items="${titles}" var="item">
<tr>
<td>${item.titleId}</td>
<td>${item.titleContent}</td>
<td>${item.titleCourseName}</td>
<td><a
href="/HomeworkSystem/RouteServlet?childPage=titleEdit.jsp&titleId=${item.titleId}">编辑</a></td>
</tr>
</c:forEach>
</table>
</div>
<div id="content_bottom">
<a href="/HomeworkSystem/RouteServlet?childPage=titleAdd.jsp">新增</a>
</div>
</body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
2.4 作业题目新增功能实现
由于作业新增页面需要选择作业所属课程,所以跳转到作业新增页面时,需要先加载教师管理的课程列表。
修改RouteServlet
else if (childPage.equals("titleAdd.jsp")) {// 课程新增页面,需要教师管理的课程列表
User loginUser = (User) request.getSession().getAttribute("loginUser");
CourseDao courseDao = new CourseDao();
request.setAttribute("courses", courseDao.getCoursesByUserId(loginUser.getUserId()));
}
1
2
3
4
5
修改titleAdd.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%><!-- 使用c:标签需要添加本行代码 -->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>titleAdd.jsp</title>
<link href="css/content.css" type="text/css" rel="stylesheet" />
</head>
<body>
<form action="/HomeworkSystem/CourseServlet?method=titleAdd"
method="post">
<div id="content_top">作业题目新增</div>
<div id="content_mid">
<table class="table_theme1">
<tr>
<td>作业题目:</td>
<td><input type="text" name="titleContent" /></td>
</tr>
<tr>
<td>所属课程:</td>
<td><select name="titleCourse">
<c:forEach items="${courses}" var="item">
<option value="${item.courseId}">${item.courseName}</option>
</c:forEach>
</select></td>
</tr>
</table>
</div>
<div id="content_bottom">
<input type="submit" value="保存"></input>
</div>
</form>
</body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
点击新增后,需要生成作业题目记录,同时还需要生成选择该门课的学生的作业内容记录。所以修改TitleServlet如下,注意需要修改的相关的Dao层方法可以去查阅我的Github源码,此处就不再一一粘贴了。
@WebServlet("/TitleServlet")
public class TitleServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 处理post请求
// 设置输入输出格式、编码
response.setContentType("text/html");
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
// 获取method参数
String method = request.getParameter("method");
// 获取登录用户信息
User loginUser = (User) request.getSession().getAttribute("loginUser");
// 操作数据库
TitleDao titleDao = new TitleDao();
SelectionDao selectionDao = new SelectionDao();
JobDao jobDao = new JobDao();
if (method.equals("titleAdd")) {
// 新增作业题目
Title title = new Title();
title.setTitleContent(request.getParameter("titleContent"));
title.setTitleCourse(Integer.parseInt(request.getParameter("titleCourse")));
title.setTitleTime(TimeUtils.getNowSqlTime());
int newId = titleDao.add(title);
// 查询选择该门课的用户id
List<Selection> selections = selectionDao.getSelectionsByCourseId(title.getTitleCourse());
// 为每个选择该课的学生新增作业内容记录
for (Selection selection : selections) {
Job job = new Job();
job.setJobTitle(newId);
job.setJobUser(selection.getSelectionUser());
job.setJobTime(TimeUtils.getNowSqlTime());
jobDao.add(job);
}
}
// 携带最新用户数据到人员管理页面
request.setAttribute("titles", titleDao.getTitlesByUserId(loginUser.getUserId()));
// 跳转到管理后台页
request.setAttribute("childPage", "titleManage.jsp");
request.getRequestDispatcher("/index.jsp").forward(request, response);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
2.5 作业题目编辑功能的实现
作业编辑,仅仅允许修改作业的题目,比较简单,此处就不再一一列举了。
3. 总结
如果感觉不熟悉,还是需要手工去把代码敲一敲加深理解的。