JSP
수강신청 기간은 3개로 설정했습니다.
예비수강신청 시작 → 본 수강신청 시작 → 수강신청 기간 완전 종료.
더보기
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ include file="/WEB-INF/views/home/staffHeader.jsp"%>
<link rel="stylesheet" href="${pageContext.request.contextPath}/resources/css/main.css">
<link rel="stylesheet" href="${pageContext.request.contextPath}/resources/css/sidebar.css">
<style>
main form button{
padding: 10px;
margin: 10px;
}
p {
font-size: 22px;
}
</style>
<div class="d-flex justify-content-center align-items-start" style="display:flex; min-width: 100em;">
<div class="sub--menu">
<div class="sub--menu--top">
<h2>학사관리</h2>
</div>
<div class="sub--menu--mid">
<table class="sub--menu--table" border="1">
<tr>
<td><a href="${pageContext.request.contextPath}/user/studentList">학생 명단 조회</a></td>
</tr>
<tr>
<td><a href="${pageContext.request.contextPath}/user/professorList">교수 명단 조회</a></td>
</tr>
<tr>
<td><a href="${pageContext.request.contextPath}/user/student">학생 등록</a></td>
</tr>
<tr>
<td><a href="${pageContext.request.contextPath}/user/professor">교수 등록</a></td>
</tr>
<tr>
<td><a href="${pageContext.request.contextPath}/tuition/bill">등록금 고지서 발송</a></td>
</tr>
<tr>
<td><a href="${pageContext.request.contextPath}/break/list/staff">휴학 처리</a></td>
</tr>
<tr>
<td><a href="${pageContext.request.contextPath}/sugang/period" class="selected--menu">수강신청 기간 설정</a></td>
</tr>
</table>
</div>
</div>
<main style="width: 100%; padding: 20px;">
<h1 class="sub--title">수강 신청 기간 설정</h1>
<div class="split--div"></div>
<c:if test="${SUGANG_PERIOD == 0}">
<p>현재 예비 수강 신청 기간입니다.</p>
<br>
<form action="${pageContext.request.contextPath}/sugang/updatePeriod1" method="post">
<button type="submit">수강신청 기간 시작하기</button>
</form>
</c:if>
<!-- 수강신청 시작 버튼 눌렀을 때 -->
<c:if test="${SUGANG_PERIOD == 1}">
<p>현재 수강 신청 기간입니다.</p>
<br>
<form action="${pageContext.request.contextPath}/sugang/updatePeriod2" method="post">
<button type="submit">수강신청 종료하기</button>
</form>
</c:if>
<!-- 수강신청 종료 버튼 눌렀을 때 -->
<c:if test="${SUGANG_PERIOD == 2}">
<p>이번 학기 수강 신청 기간이 종료되었습니다. 예비 수강신청 기간을 시작하시겠습니까?</p>
<br>
<form action="${pageContext.request.contextPath}/sugang/updatePeriod0" method="post">
<button type="submit">예비수강신청 기간 시작하기</button>
</form>
</c:if>
</main>
</div>
<%@ include file="footer.jsp"%>
Controller
본 수강신청이 시작했을 때 정원이 초과하면 인원을 0명으로 초기화하여 처음부터 신청받을 수 있는 상태로, 정원이 초과되지 않았다면 학생의 장바구니에 이동합니다. 수강신청 기간이 완전 종료되기 전에 장바구니에 담기 목록은 수강취소할 수 있습니다.
최대이수학점을 초과하거나 수강 가능한 전공 영역이 아닐 경우도 처리해야 합니다.
더보기
package com.chelseaUniversity.ver1.controller;
@WebServlet("/sugang/*")
public class SugangController extends HttpServlet {
private static final long serialVersionUID = 1L;
// TODO - 학과 코드 고정값 >> 변동값으로 변동 필
private static final int FIRST_DEPT_ID = 101;
private static final int LAST_DEPT_ID = 120;
private static final int VIEW_SUBJECT = 20;
private SubjectRepository subjectRepository;
private PreStuSubRepository preStuSubRepository;
private StuSubRepository stuSubRepository;
private StuSubDetailRepository stuSubDetailRepository;
private RegistrationRepository registrationRepository;
private SugangStatus sugangStatus;
private StuSub stuSub;
@Override
public void init() throws ServletException {
subjectRepository = new SubjectRepositoryImpl();
preStuSubRepository = new PreStuSubRepositoryImpl();
stuSubRepository = new StuSubRepositoryImpl();
stuSubDetailRepository = new StuSubDetailRepositoryImpl();
registrationRepository = new RegistrationRepositoryImpl();
sugangStatus = new SugangStatusImpl();
stuSub = new StuSub();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String action = request.getPathInfo();
HttpSession session = request.getSession();
StudentInfoDto principalStu = null;
User userRole = (User) session.getAttribute("user");
if ("student".equalsIgnoreCase(userRole.getUserRole())) {
principalStu = (StudentInfoDto) session.getAttribute("principal");
}
int totalGrade;
List<SubjectHistory> historyList;
boolean preSeason = "진행".equals(registrationRepository.isPreSugangSeason()) ? true : false;
boolean season = "진행".equals(registrationRepository.isSugangSeason()) ? true : false;
if (principalStu != null) {
if (preSeason) {
List<Integer> subjectIdList = registrationRepository.selectPreSubjectRegistration(principalStu.getId());
request.setAttribute("subjectIdList", subjectIdList);
} else if (season) {
List<Integer> subjectIdList = registrationRepository.selectSubjectRegistration(principalStu.getId());
request.setAttribute("subjectIdList", subjectIdList);
} else {
}
}
switch (action) {
case "/subjectList":
showSubjectList(request, response, "/subjectList");
break;
case "/pre":
if (preSeason) {
showSubjectList(request, response, "/pre");
} else {
String message = "예비수강신청 기간이 아닙니다.";
int page = 1;
request.setAttribute("message", message);
request.setAttribute("page", page);
showSubjectList(request, response, "/subjectList");
}
break;
case "/preAppList":
if (preSeason) {
totalGrade = registrationRepository.preTotalGrades(principalStu.getId());
historyList = registrationRepository.resistrationHistory(principalStu.getId());
request.setAttribute("totalGrade", totalGrade);
request.setAttribute("historyList", historyList);
request.getRequestDispatcher("/WEB-INF/views/student/preSugangHistory.jsp").forward(request, response);
} else {
String message = "예비 수강신청 기간이 아닙니다.";
int page = 1;
request.setAttribute("message", message);
request.setAttribute("page", page);
viewSubjectList(request, response, page, "/subjectList");
}
break;
case "/appList":
if (season) {
totalGrade = registrationRepository.totalGrades(principalStu.getId());
List<SubjectHistory> failSubList = new ArrayList<>();
List<SubjectHistory> successSubList = new ArrayList<>();
List<Integer> failList = registrationRepository.failResistration(principalStu.getId());
List<Integer> successList = registrationRepository.successResistration(principalStu.getId());
for (int failNum : failList) {
failSubList.add(registrationRepository.resistrationHistory(principalStu.getId(), failNum,
RegistrationRepositoryImpl.FAIL_SELECT_SUBJECT_HISTORY));
}
for (int successNum : successList) {
successSubList.add(registrationRepository.resistrationHistory(principalStu.getId(), successNum,
RegistrationRepositoryImpl.SUCCESS_SELECT_SUBJECT_HISTORY));
}
boolean failCheck = failSubList.isEmpty();
boolean successCheck = successSubList.isEmpty();
request.setAttribute("failCheck", failCheck);
request.setAttribute("successCheck", successCheck);
request.setAttribute("failSubList", failSubList);
request.setAttribute("successSubList", successSubList);
request.setAttribute("totalGrade", totalGrade);
request.getRequestDispatcher("/WEB-INF/views/student/sugangList.jsp").forward(request, response);
} else {
String message = "수강신청 기간이 아닙니다.";
int page = 1;
request.setAttribute("message", message);
request.setAttribute("page", page);
viewSubjectList(request, response, page, "/subjectList");
}
break;
case "/list":
if (season) {
totalGrade = registrationRepository.totalGrades(principalStu.getId());
List<SubjectHistory> successSubList = new ArrayList<>();
List<Integer> successList = registrationRepository.successResistration(principalStu.getId());
for (int successNum : successList) {
successSubList.add(registrationRepository.resistrationHistory(principalStu.getId(), successNum,
RegistrationRepositoryImpl.SUCCESS_SELECT_SUBJECT_HISTORY));
}
boolean successCheck = successSubList.isEmpty();
request.setAttribute("successCheck", successCheck);
request.setAttribute("successSubList", successSubList);
request.setAttribute("totalGrade", totalGrade);
request.getRequestDispatcher("/WEB-INF/views/student/sugangHistory.jsp").forward(request, response);
} else {
String message = "수강신청 기간이 아닙니다.";
int page = 1;
request.setAttribute("message", message);
request.setAttribute("page", page);
showSubjectList(request, response, "/subjectList");
}
break;
case "/period":
int SUGANG_PERIOD = 2;
String sugang = sugangStatus.selectSugangStatus();
String preSugang = sugangStatus.selectPreSugangStatus();
if(sugang != null && preSugang != null) {
if(sugang.equals("진행")) {
SUGANG_PERIOD = 1;
} else if (preSugang.equals("진행")) {
SUGANG_PERIOD = 0;
}
}
request.setAttribute("SUGANG_PERIOD", SUGANG_PERIOD);
request.getRequestDispatcher("/WEB-INF/views/staff/sugangPeriod.jsp").forward(request, response);
break;
case "/regist":
registrationPreSubject(request, response, principalStu);
response.sendRedirect(request.getContextPath() + "/sugang/pre?page=1");
break;
case "/delete":
deletePreSubject(request, response, principalStu);
response.sendRedirect(request.getContextPath() + "/sugang/pre?page=1");
break;
case "/application":
showSubjectList(request, response, "/application");
break;
case "/deleteList":
deletePreSubject(request, response, principalStu);
response.sendRedirect(request.getContextPath() + "/sugang/preAppList");
break;
case "/deleteSugang":
try {
int subjectId = Integer.parseInt(request.getParameter("id"));
registrationRepository.deleteSubjectRegistration(principalStu.getId(), subjectId);
registrationRepository.deleteNumOfStudent(subjectId);
} catch (Exception e) {
response.sendRedirect(request.getContextPath() + "/sugang/appList?page=1");
}
response.sendRedirect(request.getContextPath() + "/sugang/appList?page=1");
break;
case "/registrationSugang":
registrationSubject(request, response, principalStu);
break;
default:
response.sendError(HttpServletResponse.SC_NOT_FOUND);
break;
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String action = request.getPathInfo();
switch (action) {
case "/updatePeriod0":
updatePeriod0(request, response);
break;
case "/updatePeriod1":
updatePeriod1(request, response);
break;
case "/updatePeriod2":
updatePeriod2(request, response);
break;
case "/subjectList":
break;
default:
response.sendError(HttpServletResponse.SC_NOT_FOUND);
break;
}
}
/**
* 교직원 -> 예비 수강신청 기간 시작
*
* @param request
* @param response
* @throws IOException
* @throws ServletException
*/
private void updatePeriod0(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 예비 수강신청 기간 시작
sugangStatus.updatePrePeriod("진행");
final int SUGANG_PERIOD = 0;
request.setAttribute("SUGANG_PERIOD", SUGANG_PERIOD);
request.getRequestDispatcher("/WEB-INF/views/staff/sugangPeriod.jsp").forward(request, response);
}
/**
* 교직원 -> 수강신청기간 시작
*
* @param request
* @param response
* @throws IOException
* @throws ServletException
*/
private void updatePeriod1(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
// 강의 정원 >= 예비 수강신청 인원 (정원 초과X)
List<Integer> lessIdList = subjectRepository.selectIdByLessNumOfStudent();
for (Integer subjectId : lessIdList) {
// 예비 수강신청 과목id와 학생 id 받아오기
List<PreStuSub> preAppList = preStuSubRepository.selectBySubjectId(subjectId);
for (PreStuSub preSutSub : preAppList) {
if (stuSubRepository.selectByStudentIdAndSubjectId(preSutSub.getStudentId(),
preSutSub.getSubjectId()) == null) {
// 수강확정
stuSubRepository.insert(preSutSub.getStudentId(), preSutSub.getSubjectId());
stuSub = stuSubRepository.selectByStudentIdAndSubjectId(preSutSub.getStudentId(),
preSutSub.getSubjectId());
}
}
}
// 강의 정원 < 예비 수강신청 인원 (정원 초과O)
List<Integer> moreIdList = subjectRepository.selectIdByMoreNumOfStudent();
for (Integer subjectId : moreIdList) {
subjectRepository.updateNumOfStudent(subjectId, "초기화");
// 예비 수강신청 과목id와 학생 id 받아오기
List<PreStuSub> preAppList = preStuSubRepository.selectBySubjectId(subjectId);
for (PreStuSub preSutSub : preAppList) {
// 수강실패 테이블에 입력
stuSubRepository.insertFailSub(preSutSub.getStudentId(), preSutSub.getSubjectId());
}
}
// 수강 신청기간 상태값 변경 (예비수강, 본수강 순서)
sugangStatus.updateAllSugangPeriod("종료", "진행");
final int SUGANG_PERIOD = 1;
request.setAttribute("SUGANG_PERIOD", SUGANG_PERIOD);
request.getRequestDispatcher("/WEB-INF/views/staff/sugangPeriod.jsp").forward(request, response);
}
/**
* 교직원 -> 수강신청 기간 종료
*
* @param request
* @param response
* @throws IOException
* @throws ServletException
*/
private void updatePeriod2(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 본수강신청 기간 종료
sugangStatus.updateSugangPeriod("종료");
final int SUGANG_PERIOD = 2;
int rscount2 = -1;
// 수강 디테일에 입력
List<SendSub> fixList = stuSubDetailRepository.selectFixSubject();
for (SendSub sendSub : fixList) {
stuSubDetailRepository.insert(sendSub.getStudentId(), sendSub.getSubjectId());
}
request.setAttribute("SUGANG_PERIOD", SUGANG_PERIOD);
request.getRequestDispatcher("/WEB-INF/views/staff/sugangPeriod.jsp").forward(request, response);
}
private void registrationPreSubject(HttpServletRequest request, HttpServletResponse response,
StudentInfoDto principal) throws ServletException, IOException {
List<CheckSubjectTime> checkTimeList = registrationRepository.registSubjectTime(principal.getId(),
RegistrationRepositoryImpl.CHECK_PRE_SUBJECT_TIME);
if (!checkTimeList.isEmpty()) {
int totalGrades = registrationRepository.preTotalGrades(principal.getId());
int subGrade = Integer.parseInt(request.getParameter("subGrade"));
if ((totalGrades + subGrade) > 18) {
String message = "최대 수강학점을 넘습니다.";
// 메시지를 요청 속성으로 설정
request.setAttribute("message", message);
showSubjectList(request, response, "/pre");
return;
}
String subDay = request.getParameter("subDay");
String startTimeStr = request.getParameter("startTime");
String endTimeStr = request.getParameter("endTime");
for (CheckSubjectTime checkSubjectTime : checkTimeList) {
if (checkSubjectTime.getSubDay().equals(subDay)) {
int startTime = Integer.parseInt(startTimeStr);
int endTime = Integer.parseInt(endTimeStr);
int checkStartTime = Integer.parseInt(checkSubjectTime.getStartTime());
int checkEndTime = Integer.parseInt(checkSubjectTime.getEndTime());
if ((checkStartTime <= startTime && startTime <= checkEndTime)
|| (checkStartTime <= endTime && endTime <= checkEndTime)) {
String message = "중복된 수업시간이 있습니다.";
// 메시지를 요청 속성으로 설정
request.setAttribute("message", message);
showSubjectList(request, response, "/pre");
return;
}
}
}
}
String registSubIdStr = request.getParameter("id");
try {
int subId = Integer.parseInt(registSubIdStr);
if (!principal.getDeptId().equals(registrationRepository.checkDepartment(subId, principal.getId()))
&& "전공".equals(request.getParameter("subType"))) {
String message = "학과 내 전공만 신청이 가능합니다.";
// 메시지를 요청 속성으로 설정
request.setAttribute("message", message);
showSubjectList(request, response, "/pre");
return;
}
List<Integer> checkList = registrationRepository.selectPreSubjectRegistration(principal.getId());
if (!checkList.contains(subId)) {
registrationRepository.insertPreSubjectRegistration(principal.getId(), subId);
registrationRepository.addNumOfStudent(subId);
// showSubjectList(request, response, "/pre");
}
} catch (NumberFormatException e) {
e.printStackTrace();
}
}
private void registrationSubject(HttpServletRequest request, HttpServletResponse response,
StudentInfoDto principalStu) throws ServletException, IOException {
List<CheckSubjectTime> checkTimeList = registrationRepository.registSubjectTime(principalStu.getId(),
RegistrationRepositoryImpl.CHECK_SUBJECT_TIME);
if (!checkTimeList.isEmpty()) {
int totalGrades = registrationRepository.totalGrades(principalStu.getId());
int subGrade = Integer.parseInt(request.getParameter("subGrade"));
if ((totalGrades + subGrade) > 18) {
String message = "최대 수강학점을 넘습니다.";
// 메시지를 요청 속성으로 설정
request.setAttribute("message", message);
showSubjectList(request, response, "/application");
return;
}
String subDay = request.getParameter("subDay");
String startTimeStr = request.getParameter("startTime");
String endTimeStr = request.getParameter("endTime");
for (CheckSubjectTime checkSubjectTime : checkTimeList) {
if (checkSubjectTime.getSubDay().equals(subDay)) {
int startTime = Integer.parseInt(startTimeStr);
int endTime = Integer.parseInt(endTimeStr);
int checkStartTime = Integer.parseInt(checkSubjectTime.getStartTime());
int checkEndTime = Integer.parseInt(checkSubjectTime.getEndTime());
if ((checkStartTime <= startTime && startTime <= checkEndTime)
|| (checkStartTime <= endTime && endTime <= checkEndTime)) {
String message = "중복된 수업시간이 있습니다.";
// 메시지를 요청 속성으로 설정
request.setAttribute("message", message);
showSubjectList(request, response, "/application");
return;
}
}
}
}
String registSubIdStr = request.getParameter("id");
try {
int subId = Integer.parseInt(registSubIdStr);
if (!principalStu.getDeptId().equals(registrationRepository.checkDepartment(subId, principalStu.getId()))
&& "전공".equals(request.getParameter("subType"))) {
String message = "학과 내 전공만 신청이 가능합니다.";
// 메시지를 요청 속성으로 설정
request.setAttribute("message", message);
showSubjectList(request, response, "/application");
return;
}
try {
int subjectId = Integer.parseInt(request.getParameter("id"));
boolean check = registrationRepository.checkCapacity(subjectId);
if (check) {
registrationRepository.insertSubjectRegistration(principalStu.getId(), subjectId);
registrationRepository.addNumOfStudent(subjectId);
response.sendRedirect(request.getContextPath() + "/sugang/appList?page=1");
} else {
String message = "정원을 초과하였습니다.";
request.setAttribute("message", message);
request.getRequestDispatcher("/WEB-INF/views/student/sugangList.jsp").forward(request, response);
}
} catch (Exception e) {
response.sendRedirect(request.getContextPath() + "/sugang/appList?page=1");
}
} catch (NumberFormatException e) {
e.printStackTrace();
}
}
private void deletePreSubject(HttpServletRequest request, HttpServletResponse response, StudentInfoDto principal)
throws ServletException, IOException {
String deleteSubIdStr = request.getParameter("id");
try {
int subId = Integer.parseInt(deleteSubIdStr);
List<Integer> checkList = registrationRepository.selectPreSubjectRegistration(principal.getId());
if (checkList.contains(subId)) {
registrationRepository.deletePreSubjectRegistration(principal.getId(), subId);
registrationRepository.deleteNumOfStudent(subId);
}
} catch (NumberFormatException e) {
e.printStackTrace();
}
}
}
repository > interfaces
본 수강신청 기간이 시작하면 학생이 예비수강신청 탭에 접속을 하면 안되기 때문에 DB에 0또는 1로 상태값을 주어 처리했습니다.
더보기
package com.chelseaUniversity.ver1.repository;
public class SugangStatusImpl implements SugangStatus{
public final String SELECT_SUGANG_STATUS = " SELECT status FROM sugang WHERE name = 'sugang'";
public final String SELECT_PRE_SUGANG_STATUS = " SELECT status FROM sugang WHERE name = 'pre_sugang'";
public final String UPDATE_SUGANG_STATUS = " UPDATE sugang SET status = ? WHERE name = 'sugang' ";
public final String UPDATE_PRE_SUGANG_STATUS = " UPDATE sugang SET status = ? WHERE name = 'pre_sugang' ";
/**
* 예비수강기간, 본수강기간 모두 변경
*/
@Override
public int updateAllSugangPeriod(String preSugangStatus, String sugangStatus) {
int rsRowCount = 0;
try (Connection conn = DBUtil.getConnection()) {
conn.setAutoCommit(false);
// 예비수강신청 기간 상태값 변경
try (PreparedStatement pstmt = conn.prepareStatement(UPDATE_PRE_SUGANG_STATUS)) {
pstmt.setString(1, preSugangStatus);
rsRowCount = pstmt.executeUpdate();
conn.commit();
} catch (Exception e) {
conn.rollback();
e.printStackTrace();
}
// 본 수강신청 기간 상태값 변경
try (PreparedStatement pstmt = conn.prepareStatement(UPDATE_SUGANG_STATUS)) {
pstmt.setString(1, sugangStatus);
rsRowCount = pstmt.executeUpdate();
conn.commit();
} catch (Exception e) {
conn.rollback();
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
return rsRowCount;
}
/**
* 예비수강신청 기간 상태값 변경
*/
@Override
public int updatePrePeriod(String preSugangStatus) {
int rsRowCount = 0;
try (Connection conn = DBUtil.getConnection()) {
conn.setAutoCommit(false);
try (PreparedStatement pstmt = conn.prepareStatement(UPDATE_PRE_SUGANG_STATUS)) {
pstmt.setString(1, preSugangStatus);
rsRowCount = pstmt.executeUpdate();
conn.commit();
} catch (Exception e) {
conn.rollback();
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
return rsRowCount;
}
/**
* 수강신청 기간 상태값 변경
*/
@Override
public int updateSugangPeriod(String sugangStatus) {
int rsRowCount = 0;
try (Connection conn = DBUtil.getConnection()) {
conn.setAutoCommit(false);
try (PreparedStatement pstmt = conn.prepareStatement(UPDATE_SUGANG_STATUS)) {
pstmt.setString(1, sugangStatus);
rsRowCount = pstmt.executeUpdate();
conn.commit();
} catch (Exception e) {
conn.rollback();
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
return rsRowCount;
}
@Override
public String selectSugangStatus() {
String status = null;
try (Connection conn = DBUtil.getConnection();
PreparedStatement pstmt = conn.prepareStatement(SELECT_SUGANG_STATUS)){
ResultSet rs = pstmt.executeQuery();
if(rs.next()) {
status = rs.getString("status");
}
} catch (Exception e) {
e.printStackTrace();
}
return status;
}
@Override
public String selectPreSugangStatus() {
String status = null;
try (Connection conn = DBUtil.getConnection();
PreparedStatement pstmt = conn.prepareStatement(SELECT_PRE_SUGANG_STATUS)){
ResultSet rs = pstmt.executeQuery();
if(rs.next()) {
status = rs.getString("status");
}
} catch (Exception e) {
e.printStackTrace();
}
return status;
}
}
'Team project > 대학학사관리 - Chelsea University' 카테고리의 다른 글
휴학 신청 처리하기 (0) | 2024.10.25 |
---|---|
학생 및 교수 조회 (검색과 페이징 처리) (0) | 2024.10.25 |
학생 및 교수 등록 (1) | 2024.10.07 |
[프로젝트 전체 정리]-대학 학사 관리 프로그램 (0) | 2024.08.03 |