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方法
修改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()));
}
}
修改 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;
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>
</c:forEach>
</table>
</div>
<div id="content_bottom">
<a href="/HomeworkSystem/RouteServlet?childPage=titleAdd.jsp">新增</a>
</body>
</html>
2.4 作業題目新增功能實作
由于作業新增頁面需要選擇作業所屬課程,是以跳轉到作業新增頁面時,需要先加載教師管理的課程清單。
else if (childPage.equals("titleAdd.jsp")) {// 課程新增頁面,需要教師管理的課程清單
CourseDao courseDao = new CourseDao();
request.setAttribute("courses", courseDao.getCoursesByUserId(loginUser.getUserId()));
修改titleAdd.jsp
<title>titleAdd.jsp</title>
<form action="/HomeworkSystem/CourseServlet?method=titleAdd"
method="post">
<div id="content_top">作業題目新增</div>
<div id="content_mid">
<table class="table_theme1">
<td>作業題目:</td>
<td><input type="text" name="titleContent" /></td>
<td>所屬課程:</td>
<td><select name="titleCourse">
<c:forEach items="${courses}" var="item">
<option value="${item.courseId}">${item.courseName}</option>
</c:forEach>
</select></td>
</table>
</div>
<div id="content_bottom">
<input type="submit" value="儲存"></input>
</form>
點選新增後,需要生成作業題目記錄,同時還需要生成選擇該門課的學生的作業内容記錄。是以修改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);
39
40
41
42
43
44
45
2.5 作業題目編輯功能的實作
作業編輯,僅僅允許修改作業的題目,比較簡單,此處就不再一一列舉了。
3. 總結
如果感覺不熟悉,還是需要手工去把代碼敲一敲加深了解的。