로그인 및 로그아웃 구현하기

 

userLoginAction.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<%@ page import="user.UserDTO"%>
<%@ page import="user.UserDAO"%>

<%@ page import="java.io.PrintWriter"%>

<%
	// 로그인 요청을 처리해주는 액션 페이지
	
	request.setCharacterEncoding("UTF-8");

	String userID = null;
	String userPassword = null;

	if(request.getParameter("userID") != null) {
		userID = (String) request.getParameter("userID");
	}

	if(request.getParameter("userPassword") != null) {
		userPassword = (String) request.getParameter("userPassword");
	}

	UserDAO userDAO = new UserDAO();
	//login함수를 이용해서 두 개의 값을 받아준다.
	int result = userDAO.login(userID, userPassword);
	//정상적으로 로그인에 성공한다면,
	if (result == 1) {

		session.setAttribute("userID", userID);

		PrintWriter script = response.getWriter();

		script.println("<script>");
		script.println("location.href='index.jsp'");
		script.println("</script>");

		script.close();

	} else if (result == 0) { // 비밀번호가 틀렸을 때 0값을 반환하게 만들었다.(DAO부분)

		PrintWriter script = response.getWriter();

		script.println("<script>");
		script.println("alert('비밀번호가 틀립니다.');");
		script.println("history.back();");
		script.println("</script>");

		script.close();

	} else if (result == -1) { 

		PrintWriter script = response.getWriter();

		script.println("<script>");
		script.println("alert('존재하지 않는 아이디입니다.');");
		script.println("history.back();");
		script.println("</script>");

		script.close();

	} else if (result == -2) {

		PrintWriter script = response.getWriter();

		script.println("<script>");
		script.println("alert('데이터베이스 오류가 발생했습니다.');");
		script.println("history.back();");
		script.println("</script>");

		script.close();

	}

%>

userLogout.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"

	pageEncoding="UTF-8"%>

<%@ page import="java.io.PrintWriter"%>

<%
	//사용자의 세션을 파기해주는 페이지.
	session.invalidate();
%>

<script>
	location.href = 'index.jsp';
</script>

 index.jsp 세션 적용

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<!-- 로그인을 했을 때와 로그인을 하지 않았을 때를 세션으로 구분하기 위해 추가 -->
<%@ page import="java.io.PrintWriter"%>
<%@ page import="user.UserDAO"%>


<!doctype html>

<html>

  <head>
    <title>강의평가 웹 사이트</title>
    <meta charset="utf-8">
    <!-- 반응형 페이지이기 때문에 사이즈를 적용해준다. -->
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <!-- 부트스트랩 CSS 추가하기 -->
    <link rel="stylesheet" href="./css/bootstrap.min.css">
    <!-- 커스텀 CSS 추가하기 -->
    <link rel="stylesheet" href="./css/custom.css">
  </head>

  <body>
  <%
	//로그인 및 로그아웃을 위한 세션 추가 
	String userID = null;

	if(session.getAttribute("userID") != null) {

		userID = (String) session.getAttribute("userID");

	}

	if(userID == null) {

		PrintWriter script = response.getWriter();

		script.println("<script>");
		script.println("alert('로그인을 해주세요.');");
		script.println("location.href = 'userLogin.jsp'");
		script.println("</script>");

		script.close();	

	}
	//이메일 인증이 안됏을 경우 
	boolean emailChecked = new UserDAO().getUserEmailChecked(userID);

	if(emailChecked == false) {

		PrintWriter script = response.getWriter();

		script.println("<script>");
		//이메일 인증 페이지로 이동 시킨다. 
		script.println("location.href = 'emailSendConfirm.jsp'");
		script.println("</script>");

		script.close();		

		return;

	}

%>	

  <!--  네비게이션 바를 보여줌  -->
    <nav class="navbar navbar-expand-lg navbar-light bg-light">
    <!-- 부트스트랩에서 로그 같은 것을 출력 하는 것  -->
      <a class="navbar-brand" href="index.jsp">강의평가 웹 사이트</a>
      <!--  버튼을 생성해서 보였다가 안보였다를 구현. -->
      <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbar">
        <!-- 작데기 하나를 보여줌. -->
        <span class="navbar-toggler-icon"></span>
      </button>
		
		<!-- 버튼을 눌렀을 때 보여주는 내부요소 부분 /위에 버튼 태그를 눌렀을 때 id가 =navbar 인 곳이 나온다.  -->
      <div class="collapse navbar-collapse" id="navbar">
      	<!-- 리스트 내용 부분. -->
        <ul class="navbar-nav mr-auto">
        <!-- 현재 페이제 index.jsp를 나타낸다.  -->
          <li class="nav-item active">
          	<!-- a태그로 이동할 페이지를 넣어준다.  -->
            <a class="nav-link" href="index.jsp">메인</a>
          </li>
			
			<!--  눌렀을 때 아래로 나오는 기능 부분  -->
          <li class="nav-item dropdown">
            <a class="nav-link dropdown-toggle" id="dropdown" data-toggle="dropdown">
              회원 관리
            </a>

            <div class="dropdown-menu" aria-labelledby="dropdown">
            <%
			if(userID == null) {
			%>
              <a class="dropdown-item" href="userLogin.jsp">로그인</a>
              <a class="dropdown-item" href="userJoin.jsp">회원가입</a>
             <%
			}else{
             %>
              <a class="dropdown-item" href="userLogout.jsp">로그아웃</a>
              <% } %>
            </div>
          </li>
        </ul>
		<!-- 검색 양식  -->
        <form class="form-inline my-2 my-lg-0">
          <input class="form-control mr-sm-2" type="search" placeholder="내용을 입력하세요." aria-label="Search">
          <button class="btn btn-outline-success my-2 my-sm-0" type="submit">검색</button>
        </form>
      </div>
    </nav>
	
	<!-- 본문 부분  -->
	<!--  알아서 작아지는 것에 도움을 준다. -->
	<!-- 검색창을 만들어 준다. -->
	<section class = "container">
		<!-- mt-3 : 마진을 3을 준다. -->
		<form method = "get" action = "./index.jsp" class = "form-inline mt-3">
			<select name = "lectureDivide" class = "form-control mx-1 mt-2">
				<option value="전제">전체 </option>
				<option value="전공">전공</option>
				<option value="교양">기타 </option>
			</select>
			<input type="text" name = "search" class="form-control mx-1 mt-2" placeholder="내용을 입력하세요.">
			<button type="submit" class = "btn btn-primary mx-1 mt-2">검색</button>
			<!--  모달이란 부트스트랩에서 지원해주는 웹패이지 양식을 보여줌. -->
			<a class = "btn btn-primary mx-1 mt-2" data-toggle = "modal" href = "#registerModal">등록하기</a>
			<a class = "btn btn-danger mx-1 mt-2" data-toggle = "modal" href = "#reportModal">신고</a>
		</form> 
		
	
	<!-- 실제로 사용자가 강의 평가를 할 때 어떻게 보여줘야할지를 나타낸다. -->
	<div class = "card bg-light mt-3"> <!-- 윗 쪽에 3만큼 여백을 준다. -->
		<div class="card-header bg-light">
			<!-- 한 개의 행을 두개로 나눈다. -->
			<div class ="row">
				<div class = "col-8 text-left">컴퓨터개론&nbsp;<small>오현지</small></div>
				<div class = "col-4 text-right">
					종합<span style="color: red;">A</span>
				</div>
			</div>
		</div>
		
		<div class = "card-body">
			<h5 class = "card-title">
				정말 좋은 강의입니다.&nbsp;<small>(2019년 가을 학기)</small>
			</h5>
			<p class = "card-text"> 강의가 널널해서 좋습니다. 학점도 잘 나오고 좋습니다.</p>
			<div class = "row">
				<div class = "col-9 text-left">
					성적<span style="color: red;">A</span>
					보통<span style="color: red;">A</span>
					강의<span style="color: red;">B</span>
					<span style ="color: green;">(추천: 15)</span>
				</div>
				<div class = "col-3 text-right">
					<a onclick="return confirm('추천하시겠습니까?')" href="./likeAction.jsp?evaluationID=">추천</a>
					<a onclick="return confirm('삭제하시겠습니까?')" href="./deleteAction.jsp?evaluationID=">삭제</a>
					
			</div>
		</div>
		
	</div>
		
	</section>
	
	
	<!-- 모달 다이어그램  -->
	<div class = "modal fade" id="registerModal" tabindex="-1" role="dialog" aria-labelledby="modal" aria-hidden="true">
		<div class = "modal-dialog">
			<div class = "modal-content">
			<!-- 제목적인 측면이 들어간. -->
				<div class = "modal-header">
				 	<h5 class = "modal-title" id = "modal">평가 등록</h5>
				 	<!-- 모달 창을 닫는 버튼  -->
				 	<button type = "button" class="close" data-dismiss ="modal" aria-label ="close">
				 		<!--  닫기 아이콘  -->
				 		<span aria-hidden="true">&times;</span>
				 	</button>
				</div>
				<!-- 내용적인 측면이 들어간다. -->
				<div class = "modal-body">
					<form action = "./evaluationRegisterAction.jsp" method="post">
					<!-- 하나의 행을 여러가지로 나눌 때 사용한다.  -->
						<div class = "form-row">
							<!-- 한개의 열은 총 12만큼 해당된다. -->
							<div class="form-group col-sm-6">
								<label>강의명 </label>
								<input type = "text" name = "lectureName" class = "form-control" maxlength ="20">
							</div>
							<div class="form-group col-sm-6">
								<label>교수명 </label>
								<input type = "text" name = "professorName" class = "form-control" maxlength ="20">
							</div>
						</div>
						
						<div class = "form-row">
							<!-- 무언가를 선택할 때 사용한다.  -->
							<div class = "form-group col-sm-4">
								<label>	수강연도 </label>
								<select name ="lectureYear" class="form-control">
									<option value = "2011">2011</option>
									<option value = "2012">2012</option>
									<option value = "2013">2013</option>
									<option value = "2014">2014</option>
									<option value = "2015">2015</option>
									<option value = "2016">2016</option>
									<option value = "2017">2017</option>
									<option value = "2018">2018</option>
									<option value = "2019">2019</option>
									<option value = "2020" selected>2020</option>
									<option value = "2021">2021</option>
									<option value = "2022">2022</option>
								</select>
							</div>
						
						<div class = "form-group col-sm-4">
							<label>수강 학기 </label>
							<select name = "semesterDivide" class="form-control">
								<option value = "1학기" selected>1학기</option>
								<option value = "여름학기" >여름학기</option>
								<option value = "2학기" >2학기</option>
								<option value = "겨울학기" >겨울학기</option>
							</select>
						</div>
						
						<div class = "form-group col-sm-4">
							<label>강의 구분</label>
							<select name = "lectureDivide" class="form-control">
								<option value = "전공" selected>전공</option>
								<option value = "교양" >교양</option>
								<option value = "기타" >기타</option>
							</select>
						</div>
					</div>
					
					<!-- 강의 평가 부분  -->
				<div class = "form-group">
					<label>제목</label>
					<input type ="text" name = "evaluationTime" class="form-control" maxlength="40">
				</div>
						
				<div class = "form-group">
					<label>내용</label>
					<textarea name ="evaluationContent" class="form-control" maxlength="2048" style = "height: 180px;"></textarea>
				</div>	
				
				<!-- 하나의 행을 여러가지로 만든다. -->	
				<div class ="form-row">
					<div class="orm-group col-sm-3">
						<label>종합</label>
						<select name = "totalScore" class="form-control">
							<option value = "A" selected>A</option>
							<option value = "B" >B</option>
							<option value = "C" >C</option>
							<option value = "D" >D</option>
							<option value = "F" >F</option>
						</select>
					</div>
					
					<div class="orm-group col-sm-3">
						<label>성적</label>
						<select name = "comfortableScore" class="form-control">
							<option value = "A" selected>A</option>
							<option value = "B" >B</option>
							<option value = "C" >C</option>
							<option value = "D" >D</option>
							<option value = "F" >F</option>
						</select>
					</div>
					
					<div class="orm-group col-sm-3">
						<label>보통</label>
						<select name = "comfortableScore" class="form-control">
							<option value = "A" selected>A</option>
							<option value = "B" >B</option>
							<option value = "C" >C</option>
							<option value = "D" >D</option>
							<option value = "F" >F</option>
						</select>
					</div>
					
					<div class="orm-group col-sm-3">
						<label>강의 평가 </label>
						<select name = "lectureScore" class="form-control">
							<option value = "A" selected>A</option>
							<option value = "B" >B</option>
							<option value = "C" >C</option>
							<option value = "D" >D</option>
							<option value = "F" >F</option>
						</select>
					</div>
				</div>
				
				<div class="modal-footer">
					<button type="button" class="btn btn-secondary" data-dismiss="modal">취소</button>
					<button type="submit" class="btn btn-primary">등록하기</button>
				</div>
			
					</form>
				</div>
			</div>
		</div>
	</div>
	
		<!-- 모달 다이어그램  2번째 -->
	<div class = "modal fade" id="reportModal" tabindex="-1" role="dialog" aria-labelledby="modal" aria-hidden="true">
		<div class = "modal-dialog">
			<div class = "modal-content">
			<!-- 제목적인 측면이 들어간. -->
				<div class = "modal-header">
				 	<h5 class = "modal-title" id = "modal">신고하기</h5>
				 	<!-- 모달 창을 닫는 버튼  -->
				 	<button type = "button" class="close" data-dismiss ="modal" aria-label ="close">
				 		<!--  닫기 아이콘  -->
				 		<span aria-hidden="true">&times;</span>
				 	</button>
				</div>
				<!-- 내용적인 측면이 들어간다. -->
				<div class = "modal-body">
					<form action = "./reportAction.jsp" method="post">
					
					
					<!-- 강의 평가 부분  -->
				<div class = "form-group">
					<label>신고 제목</label>
					<input type ="text" name = "reportTitle" class="form-control" maxlength="40">
				</div>
						
				<div class = "form-group">
					<label>신고 내용</label>
					<textarea name ="reportContent" class="form-control" maxlength="2048" style = "height: 180px;"></textarea>
				</div>	
				
				
				<div class="modal-footer">
					<button type="button" class="btn btn-secondary" data-dismiss="modal">취소</button>
					<button type="submit" class="btn btn-danger">신고하기</button>
				</div>
			
					</form>
				</div>
			</div>
		</div>
	</div>
	
	<footer class ="bg-dark mt-4 p-5 text-center" style="color: #FFFFFF;">
		Copyright &copy; 2020 오현지 All Rights Reserved.
	</footer>
	
	 <!-- 제이쿼리 자바스크립트 추가하기 -->
    <script src="./js/jquery.min.js"></script>
    <!-- Popper 자바스크립트 추가하기 -->
    <script src="./js/popper.min.js"></script>
    <!-- 부트스트랩 자바스크립트 추가하기 -->
    <script src="./js/bootstrap.min.js"></script>
  </body>
</html>

userLogin.jsp 세션 적용

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!-- 세션을 위한 추가  -->
<%@ page import="java.io.PrintWriter"%>
<!doctype html>

<html>

  <head>
    <title>강의평가 웹 사이트</title>
    <meta charset="utf-8">
    <!-- 반응형 페이지이기 때문에 사이즈를 적용해준다. -->
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <!-- 부트스트랩 CSS 추가하기 -->
    <link rel="stylesheet" href="./css/bootstrap.min.css">
    <!-- 커스텀 CSS 추가하기 -->
    <link rel="stylesheet" href="./css/custom.css">
  </head>

  <body>
  <%
	//세션을 위한 추가 
	String userID = null;

	if(session.getAttribute("userID") != null) {

		userID = (String) session.getAttribute("userID");

	}

	if(userID != null) {

		PrintWriter script = response.getWriter();

		script.println("<script>");
		script.println("alert('로그인이 된 상태입니다.');");
		script.println("location.href = 'index.jsp'");
		script.println("</script>");

		script.close();	

	}

%>	

  <!--  네비게이션 바를 보여줌  -->
    <nav class="navbar navbar-expand-lg navbar-light bg-light">
    <!-- 부트스트랩에서 로그 같은 것을 출력 하는 것  -->
      <a class="navbar-brand" href="index.jsp">강의평가 웹 사이트</a>
      <!--  버튼을 생성해서 보였다가 안보였다를 구현. -->
      <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbar">
        <!-- 작데기 하나를 보여줌. -->
        <span class="navbar-toggler-icon"></span>
      </button>
		
		<!-- 버튼을 눌렀을 때 보여주는 내부요소 부분 /위에 버튼 태그를 눌렀을 때 id가 =navbar 인 곳이 나온다.  -->
      <div class="collapse navbar-collapse" id="navbar">
      	<!-- 리스트 내용 부분. -->
        <ul class="navbar-nav mr-auto">
        <!-- 현재 페이제 index.jsp를 나타낸다.  -->
          <li class="nav-item active">
          	<!-- a태그로 이동할 페이지를 넣어준다.  -->
            <a class="nav-link" href="index.jsp">메인</a>
          </li>
			
			<!--  눌렀을 때 아래로 나오는 기능 부분  -->
          <li class="nav-item dropdown">
            <a class="nav-link dropdown-toggle" id="dropdown" data-toggle="dropdown">
              회원 관리
            </a>

            <div class="dropdown-menu" aria-labelledby="dropdown">
<%
	if(userID == null) {
%>
              <a class="dropdown-item" href="userLogin.jsp">로그인</a>
              <a class="dropdown-item" href="userJoin.jsp">회원가입</a>
<%
	} else {
%>
              <a class="dropdown-item" href="userLogout.jsp">로그아웃</a>
<%
	}
%>
            </div>
          </li>
        </ul>
		<!-- 검색 양식  -->
        <form class="form-inline my-2 my-lg-0">
          <input class="form-control mr-sm-2" type="search" placeholder="내용을 입력하세요." aria-label="Search">
          <button class="btn btn-outline-success my-2 my-sm-0" type="submit">검색</button>
        </form>
      </div>
    </nav>
	
	<!-- 본문 부분  -->
	<!--  알아서 작아지는 것에 도움을 준다. -->
	<!-- 검색창을 만들어 준다. -->
	<section class = "container mt-3" style = " max-width: 560px;">
		<form method="post" action="./userloginAction.jsp">
			<div class="form-group">
				<label>아이디</label>
				<input type="text" name="userID" class="form-control">
			</div>
			<div class="form-group">
				<label>비밀번호</label>
				<input type="password" name="userPassword" class="form-control">
			</div>
			<button type="submit" class="btn btn-primary">로그인</button>
		</form>
	</section>
	
	
	
	<footer class ="bg-dark mt-4 p-5 text-center" style="color: #FFFFFF;">
		Copyright &copy; 2020 오현지 All Rights Reserved.
	</footer>
	
	 <!-- 제이쿼리 자바스크립트 추가하기 -->
    <script src="./js/jquery.min.js"></script>
    <!-- Popper 자바스크립트 추가하기 -->
    <script src="./js/popper.min.js"></script>
    <!-- 부트스트랩 자바스크립트 추가하기 -->
    <script src="./js/bootstrap.min.js"></script>
  </body>
</html>

userJoin.jsp 세션 적용

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!-- 세션을 위한 추가  -->
<%@ page import="java.io.PrintWriter"%>

<!doctype html>

<html>

  <head>
    <title>강의평가 웹 사이트</title>
    <meta charset="utf-8">
    <!-- 반응형 페이지이기 때문에 사이즈를 적용해준다. -->
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <!-- 부트스트랩 CSS 추가하기 -->
    <link rel="stylesheet" href="./css/bootstrap.min.css">
    <!-- 커스텀 CSS 추가하기 -->
    <link rel="stylesheet" href="./css/custom.css">
  </head>

  <body>
  <%
	//세션을 위한 추가 
	String userID = null;

	if(session.getAttribute("userID") != null) {

		userID = (String) session.getAttribute("userID");

	}

	if(userID != null) {

		PrintWriter script = response.getWriter();

		script.println("<script>");
		script.println("alert('로그인이 된 상태입니다.');");
		script.println("location.href = 'index.jsp'");
		script.println("</script>");

		script.close();	

	}

%>	
  <!--  네비게이션 바를 보여줌  -->
    <nav class="navbar navbar-expand-lg navbar-light bg-light">
    <!-- 부트스트랩에서 로그 같은 것을 출력 하는 것  -->
      <a class="navbar-brand" href="index.jsp">강의평가 웹 사이트</a>
      <!--  버튼을 생성해서 보였다가 안보였다를 구현. -->
      <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbar">
        <!-- 작데기 하나를 보여줌. -->
        <span class="navbar-toggler-icon"></span>
      </button>
		
		<!-- 버튼을 눌렀을 때 보여주는 내부요소 부분 /위에 버튼 태그를 눌렀을 때 id가 =navbar 인 곳이 나온다.  -->
      <div class="collapse navbar-collapse" id="navbar">
      	<!-- 리스트 내용 부분. -->
        <ul class="navbar-nav mr-auto">
        <!-- 현재 페이제 index.jsp를 나타낸다.  -->
          <li class="nav-item active">
          	<!-- a태그로 이동할 페이지를 넣어준다.  -->
            <a class="nav-link" href="index.jsp">메인</a>
          </li>
			
			<!--  눌렀을 때 아래로 나오는 기능 부분  -->
          <li class="nav-item dropdown">
            <a class="nav-link dropdown-toggle" id="dropdown" data-toggle="dropdown">
              회원 관리
            </a>

            <div class="dropdown-menu" aria-labelledby="dropdown">
              <%
	if(userID == null) {
%>
              <a class="dropdown-item" href="userLogin.jsp">로그인</a>
              <a class="dropdown-item" href="userJoin.jsp">회원가입</a>
<%
	} else {
%>
              <a class="dropdown-item" href="userLogout.jsp">로그아웃</a>
<%
	}
%>
            </div>
          </li>
        </ul>
		<!-- 검색 양식  -->
        <form class="form-inline my-2 my-lg-0">
          <input class="form-control mr-sm-2" type="search" placeholder="내용을 입력하세요." aria-label="Search">
          <button class="btn btn-outline-success my-2 my-sm-0" type="submit">검색</button>
        </form>
      </div>
    </nav>
	
	<!-- 본문 부분  -->
	<!--  알아서 작아지는 것에 도움을 준다. -->
	<!-- 검색창을 만들어 준다. -->
	<section class = "container mt-3" style = " max-width: 560px;">
		<form method="post" action="./userRegisterAction.jsp">
			<div class="form-group">
				<label>아이디</label>
				<input type="text" name="userID" class="form-control">
			</div>
			<div class="form-group">
				<label>비밀번호</label>
				<input type="password" name="userPassword" class="form-control">
			</div>
			<div class="form-group">
				<label>이메일</label>
				<input type="email" name="userEmail" class="form-control">
			</div>
			<button type="submit" class="btn btn-primary">회원가입</button>
		</form>
	</section>
	
	
	
	<footer class ="bg-dark mt-4 p-5 text-center" style="color: #FFFFFF;">
		Copyright &copy; 2020 오현지 All Rights Reserved.
	</footer>
	
	 <!-- 제이쿼리 자바스크립트 추가하기 -->
    <script src="./js/jquery.min.js"></script>
    <!-- Popper 자바스크립트 추가하기 -->
    <script src="./js/popper.min.js"></script>
    <!-- 부트스트랩 자바스크립트 추가하기 -->
    <script src="./js/bootstrap.min.js"></script>
  </body>
</html>

 

userRegisterAction.jsp 세션 적용 

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<%@ page import="user.UserDTO"%>
<%@ page import="user.UserDAO"%>
<%@ page import="util.SHA256"%>
<!-- 특정한 스크립트 구문을 설정할 때 사용한다.  -->
<%@ page import="java.io.PrintWriter"%>



<%
	//회원가입을 처리합니다. 사용자 정보를 데이터베이스에 등록한 이후에, 자동으로 사용자의 이메일로 이메일을 전송하고 인증을 기다린다.
	
	
	//사용자로 입력받은 값을 UTF-8로 설정한다.
	request.setCharacterEncoding("UTF-8");

	//사용자가 입력하는 3가지 값.
	String userID = null;
	
	
		//세션을 위한 추가 
		if(session.getAttribute("userID") != null) {

			userID = (String) session.getAttribute("userID");

		}

		if(userID != null) {

			PrintWriter script = response.getWriter();

			script.println("<script>");
			script.println("alert('로그인이 된 상태입니다.');");
			script.println("location.href = 'index.jsp'");
			script.println("</script>");

			script.close();	
			
			return;
		}
	
	String userPassword = null;
	String userEmail = null;
	
	//사용자가 userID값을 입력했다면, 
	if(request.getParameter("userID") != null) {
		//userID에 데이터를 담아준다.
		userID = (String) request.getParameter("userID");
	}

	if(request.getParameter("userPassword") != null) {
		userPassword = (String) request.getParameter("userPassword");
	}

	if(request.getParameter("userEmail") != null) {
		userEmail = (String) request.getParameter("userEmail");
	}

	
	//사용자가 정상적으로 입력하지 않았다면,
	if (userID == null || userPassword == null || userEmail == null) {

		PrintWriter script = response.getWriter();

		script.println("<script>");
		script.println("alert('입력이 안 된 사항이 있습니다.');");
		script.println("history.back();");
		script.println("</script>");

		script.close();
	} else { //사용자가 재대로 입력을 했다면, 

		UserDAO userDAO = new UserDAO();
		//모든 결과값을 result에 넣어준다. (한명의 사용자객체를 회원가입을 시켜준다.)
		int result = userDAO.join(new UserDTO(userID, userPassword, userEmail, SHA256.getSHA256(userEmail), false));

		if (result == -1) { 

			PrintWriter script = response.getWriter();

			script.println("<script>");
			script.println("alert('이미 존재하는 아이디입니다.');");
			script.println("history.back();");
			script.println("</script>");

			script.close();

		} else {
			//로그인을 시켜준다.
			session.setAttribute("userID", userID);

			PrintWriter script = response.getWriter();

			script.println("<script>");
			//이메일 인증 페이지로 보낸다.
			script.println("location.href = 'emailSendAction.jsp';");
			script.println("</script>");

			script.close();

		}

	}

%>

 

emailSendConfirm.jsp 

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.io.PrintWriter"%>
<!doctype html>

<html>

  <head>

    <title>강의평가 웹 사이트</title>

    <meta charset="utf-8">

    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

    <!-- 부트스트랩 CSS 추가하기 -->
    <link rel="stylesheet" href="./css/bootstrap.min.css">

    <!-- 커스텀 CSS 추가하기 -->
    <link rel="stylesheet" href="./css/custom.css">

  </head>

  <body>
  <%
	//세션을 위한 추가 
	String userID = null;

	if(session.getAttribute("userID") != null) {

		userID = (String) session.getAttribute("userID");

	}

	if(userID == null) {

		PrintWriter script = response.getWriter();

		script.println("<script>");
		script.println("alert('로그인을 해주세요.');");
		script.println("location.href = 'userLogin.jsp'");
		script.println("</script>");

		script.close();	

	}

%>	

    <nav class="navbar navbar-expand-lg navbar-light bg-light">

      <a class="navbar-brand" href="index.jsp">강의평가 웹 사이트</a>

      <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbar">

        <span class="navbar-toggler-icon"></span>

      </button>

      <div class="collapse navbar-collapse" id="navbar">

        <ul class="navbar-nav mr-auto">

          <li class="nav-item active">

            <a class="nav-link" href="index.jsp">메인</a>

          </li>

          <li class="nav-item dropdown">

            <a class="nav-link dropdown-toggle" id="dropdown" data-toggle="dropdown">

              회원 관리

            </a>

            <div class="dropdown-menu" aria-labelledby="dropdown">

              <a class="dropdown-item" href="userLogout.jsp">로그아웃</a>

            </div>

          </li>

        </ul>

        <form action="./index.jsp" method="get" class="form-inline my-2 my-lg-0">

          <input type="text" name="search" class="form-control mr-sm-2" placeholder="내용을 입력하세요.">

          <button class="btn btn-outline-success my-2 my-sm-0" type="submit">검색</button>

        </form>

      </div>

    </nav>

	<div class="container">
		<!--  사용자에게 경고창을 보여준다.  -->
	    <div class="alert alert-warning mt-4" role="alert">
		  이메일 주소 인증을 하셔야 이용 가능합니다. 인증 메일을 받지 못하셨나요?
		</div>
		<a href="emailSendAction.jsp" class="btn btn-primary">인증 메일 다시 받기</a>
    </div>

    <footer class="bg-dark mt-4 p-5 text-center" style="color: #FFFFFF;">
      Copyright ⓒ 2020 오현지 All Rights Reserved.
    </footer>

    <!-- 제이쿼리 자바스크립트 추가하기 -->
    <script src="./js/jquery.min.js"></script>

    <!-- Popper 자바스크립트 추가하기 -->
    <script src="./js/popper.min.js"></script>

    <!-- 부트스트랩 자바스크립트 추가하기 -->
    <script src="./js/bootstrap.min.js"></script>

  </body>

</html>

 

emailSendAction.jsp 세션 추가

<%@page import="javax.mail.Transport"%>
<%@page import="javax.mail.Message"%>
<%@page import="javax.mail.Address"%>
<%@page import="javax.mail.internet.InternetAddress"%>
<%@page import="javax.mail.internet.MimeMessage"%>

<%@page import="javax.mail.Session"%>

<%@page import="javax.mail.Authenticator"%>

<!-- 속성을 정의할 때 사용하는 라이브러리  -->
<%@page import="java.util.Properties"%>

<%@page import="java.io.PrintWriter"%>

<%@page import="user.UserDAO"%>
<%@page import="util.SHA256"%>
<%@page import="util.Gmail"%>

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<%

	UserDAO userDAO = new UserDAO();

	String userID = null;
	//현재 로그인 한 상태라면, 
	if(session.getAttribute("userID") != null) {
		// 해당 세션값을 userID에 넣어준다.
		userID = (String) session.getAttribute("userID");

	}

	if(userID == null) { //로그인한 상태가 아니라면,

		PrintWriter script = response.getWriter();

		script.println("<script>");
		script.println("alert('로그인을 해주세요.');");
		script.println("location.href = 'userLogin.jsp'");
		script.println("</script>");

		script.close();

		return;

	}
	
	//이메일 인증이 되었는지 확인한다.
	boolean emailChecked = userDAO.getUserEmailChecked(userID);
	//이메일 인증이 된 회원이라면,
	if(emailChecked == true) {

		PrintWriter script = response.getWriter();

		script.println("<script>");
		script.println("alert('이미 인증 된 회원입니다.');");
		script.println("location.href = 'index.jsp'");
		script.println("</script>");

		script.close();		

		return;

	}

	

	//인증이 되지 않았다면, 사용자에게 보낼 메시지를 기입한다.
	
	String host = "http://localhost:8080/Lecture_Evaluation/";
	//보낸 사람.
	String from = "자신의 실제 이메일 아이디";
	//받는 사람.
	String to = userDAO.getUserEmail(userID);
	//이메일 제목.
	String subject = "강의평가를 위한 이메일 확인 메일입니다.";
	//이메일 내용.
	String content = "다음 링크에 접속하여 이메일 확인을 진행하세요." +
	
		"<a href='" + host + "emailCheckAction.jsp?code=" + new SHA256().getSHA256(to) + "'>이메일 인증하기</a>";
		//링크를 눌러서 이메일 인증을 하게한다.
	

	// SMTP(구글)에 접속하기 위한 정보를 기입한다.
	Properties p = new Properties();

	p.put("mail.smtp.user", from);
	//구글 서버.
	p.put("mail.smtp.host", "smtp.googlemail.com");
	//구글에서 제공해주는 포트 번호.
	p.put("mail.smtp.port", "465");
	
	p.put("mail.smtp.starttls.enable", "true");

	p.put("mail.smtp.auth", "true");

	p.put("mail.smtp.debug", "true");

	p.put("mail.smtp.socketFactory.port", "465");

	p.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");

	p.put("mail.smtp.socketFactory.fallback", "false");

	 
	//이메일을 실제로 전송하는 부분.
	try{

	    Authenticator auth = new Gmail();
		
	    Session ses = Session.getInstance(p, auth);

	    ses.setDebug(true);
		//메일을 보낸다.
	    MimeMessage msg = new MimeMessage(ses); 
		//메일의 제목 
	    msg.setSubject(subject);

	    Address fromAddr = new InternetAddress(from);

	    msg.setFrom(fromAddr);

	    Address toAddr = new InternetAddress(to);
		//받는 사람의 주소.
	    msg.addRecipient(Message.RecipientType.TO, toAddr);
		//메일 안에 담길 내용. 인코딩해서 전송.
	    msg.setContent(content, "text/html;charset=UTF-8");
		//실제로 메세지를 보낸다.
	    Transport.send(msg);

	} catch(Exception e){

	    e.printStackTrace();

		PrintWriter script = response.getWriter();

		script.println("<script>");
		script.println("alert('오류가 발생했습니다..');");
		script.println("history.back();");
		script.println("</script>");

		script.close();		

	    return;

	}

%>

<!doctype html>

<html>

  <head>

    <title>강의평가 웹 사이트</title>

    <meta charset="utf-8">

    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

    <!-- 부트스트랩 CSS 추가하기 -->

    <link rel="stylesheet" href="./css/bootstrap.min.css">

    <!-- 커스텀 CSS 추가하기 -->

    <link rel="stylesheet" href="./css/custom.css">

  </head>

  <body>

    <!--  네비게이션 바를 보여줌  -->
    <nav class="navbar navbar-expand-lg navbar-light bg-light">
    <!-- 부트스트랩에서 로그 같은 것을 출력 하는 것  -->
      <a class="navbar-brand" href="index.jsp">강의평가 웹 사이트</a>
      <!--  버튼을 생성해서 보였다가 안보였다를 구현. -->
      <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbar">
        <!-- 작데기 하나를 보여줌. -->
        <span class="navbar-toggler-icon"></span>
      </button>
		
		<!-- 버튼을 눌렀을 때 보여주는 내부요소 부분 /위에 버튼 태그를 눌렀을 때 id가 =navbar 인 곳이 나온다.  -->
      <div class="collapse navbar-collapse" id="navbar">
      	<!-- 리스트 내용 부분. -->
        <ul class="navbar-nav mr-auto">
        <!-- 현재 페이제 index.jsp를 나타낸다.  -->
          <li class="nav-item active">
          	<!-- a태그로 이동할 페이지를 넣어준다.  -->
            <a class="nav-link" href="index.jsp">메인</a>
          </li>
			
			<!--  눌렀을 때 아래로 나오는 기능 부분  -->
          <li class="nav-item dropdown">
            <a class="nav-link dropdown-toggle" id="dropdown" data-toggle="dropdown">
              회원 관리
            </a>

            <div class="dropdown-menu" aria-labelledby="dropdown">
              <%
	if(userID == null) {
%>
              <a class="dropdown-item" href="userLogin.jsp">로그인</a>
              <a class="dropdown-item" href="userJoin.jsp">회원가입</a>
<%
	} else {
%>
              <a class="dropdown-item" href="userLogout.jsp">로그아웃</a>
<%
	}
%>
            </div>
          </li>
        </ul>
		<!-- 검색 양식  -->
        <form class="form-inline my-2 my-lg-0">
          <input class="form-control mr-sm-2" type="search" placeholder="내용을 입력하세요." aria-label="Search">
          <button class="btn btn-outline-success my-2 my-sm-0" type="submit">검색</button>
        </form>
      </div>
    </nav>

	<!-- 이메일 전송시 알림창을 넣어준다. -->
	<div class="container">

	    <div class="alert alert-success mt-4" role="alert">

		  이메일 주소 인증 메일이 전송되었습니다. 이메일에 들어가셔서 인증해주세요.

		</div>

    </div>

    <footer class="bg-dark mt-4 p-5 text-center" style="color: #FFFFFF;">

      Copyright ⓒ 2020 오현지 All Rights Reserved.

    </footer>

    <!-- 제이쿼리 자바스크립트 추가하기 -->

    <script src="./js/jquery.min.js"></script>

    <!-- Popper 자바스크립트 추가하기 -->

    <script src="./js/popper.min.js"></script>

    <!-- 부트스트랩 자바스크립트 추가하기 -->

    <script src="./js/bootstrap.min.js"></script>

  </body>

</html>

 

 

결과값

 

회원가입
인증 요청 화면
비인증시 화면 

 

로그인 되지 않았을 경우 

 

로그인 후 보여지는 화면 

update user set userEmailChecked='1' where userID='123';  // 메일이 없어서.. 수정 할 때.

수강게시판(로그인_이메일구현.zip
4.58MB

 

강의 평가 구현

강의평가 스키마 

EvaluationDTO.java

package evaluation;

public class EvaluationDTO {
	//하나의 강의 평가 정보를 담고 있는 데이터베이스 트랜잭션 객체 역할을 담당
	int evaluationID;
	String userID;
	String lectureName;
	String professorName;
	int lectureYear;
	String semesterDivide;
	String lectureDivide;
	String evaluationTitle;
	String evaluationContent;
	String totalScore;
	String creditScore;
	String comfortableScore;
	String lectureScore;
	int likeCount;	

	public int getEvaluationID() {

		return evaluationID;

	}

	public void setEvaluationID(int evaluationID) {

		this.evaluationID = evaluationID;

	}

	public String getUserID() {

		return userID;

	}

	public void setUserID(String userID) {

		this.userID = userID;

	}

	public String getLectureName() {

		return lectureName;

	}

	public void setLectureName(String lectureName) {

		this.lectureName = lectureName;

	}

	public String getProfessorName() {

		return professorName;

	}

	public void setProfessorName(String professorName) {

		this.professorName = professorName;

	}

	public int getLectureYear() {

		return lectureYear;

	}

	public void setLectureYear(int lectureYear) {

		this.lectureYear = lectureYear;

	}

	public String getSemesterDivide() {

		return semesterDivide;

	}

	public void setSemesterDivide(String semesterDivide) {

		this.semesterDivide = semesterDivide;

	}

	public String getLectureDivide() {

		return lectureDivide;

	}

	public void setLectureDivide(String lectureDivide) {

		this.lectureDivide = lectureDivide;

	}

	public String getEvaluationTitle() {

		return evaluationTitle;

	}

	public void setEvaluationTitle(String evaluationTitle) {

		this.evaluationTitle = evaluationTitle;

	}

	public String getEvaluationContent() {

		return evaluationContent;

	}

	public void setEvaluationContent(String evaluationContent) {

		this.evaluationContent = evaluationContent;

	}

	public String getTotalScore() {

		return totalScore;

	}

	public void setTotalScore(String totalScore) {

		this.totalScore = totalScore;

	}

	public String getCreditScore() {

		return creditScore;

	}

	public void setCreditScore(String creditScore) {

		this.creditScore = creditScore;

	}

	public String getComfortableScore() {

		return comfortableScore;

	}

	public void setComfortableScore(String comfortableScore) {

		this.comfortableScore = comfortableScore;

	}

	public String getLectureScore() {

		return lectureScore;

	}

	public void setLectureScore(String lectureScore) {

		this.lectureScore = lectureScore;

	}

	public int getLikeCount() {

		return likeCount;

	}

	public void setLikeCount(int likeCount) {

		this.likeCount = likeCount;

	}

	public EvaluationDTO() {
		
	}
	

	public EvaluationDTO(int evaluationID, String userID, String lectureName, String professorName, int lectureYear,
			String semesterDivide, String lectureDivide, String evaluationTitle, String evaluationContent,
			String totalScore, String creditScore, String comfortableScore, String lectureScore, int likeCount) {

		super();

		this.evaluationID = evaluationID;
		this.userID = userID;
		this.lectureName = lectureName;
		this.professorName = professorName;
		this.lectureYear = lectureYear;
		this.semesterDivide = semesterDivide;
		this.lectureDivide = lectureDivide;
		this.evaluationTitle = evaluationTitle;
		this.evaluationContent = evaluationContent;
		this.totalScore = totalScore;
		this.creditScore = creditScore;
		this.comfortableScore = comfortableScore;
		this.lectureScore = lectureScore;
		this.likeCount = likeCount;

	}

}

EvaluationDAO.java

package evaluation;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import util.DatabaseUtil;


public class EvaluationDAO {

	private Connection conn;


	
	
	// 사용자가 한 개의 글을 쓰게 해주는 함수 
	public int write(EvaluationDTO evaluationDTO) {

		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;

		try {
			
			//NULL -> 자동으로 1씩 증가하기 때문에 넣어준다. 
			//0-> 기본적으로 추천은 0값이 들어가기때문이다. 
			String SQL = "INSERT INTO EVALUATION VALUES (NULL, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 0);";
			//연결하는 객체 
			conn = DatabaseUtil.getConnection();
			pstmt = conn.prepareStatement(SQL);

			pstmt.setString(1, evaluationDTO.getUserID());
			pstmt.setString(2, evaluationDTO.getLectureName());
			pstmt.setString(3, evaluationDTO.getProfessorName());
			pstmt.setInt(4, evaluationDTO.getLectureYear());
			pstmt.setString(5, evaluationDTO.getSemesterDivide());
			pstmt.setString(6, evaluationDTO.getLectureDivide());
			pstmt.setString(7, evaluationDTO.getEvaluationTitle());
			pstmt.setString(8, evaluationDTO.getEvaluationContent());
			pstmt.setString(9, evaluationDTO.getTotalScore());
			pstmt.setString(10, evaluationDTO.getCreditScore());
			pstmt.setString(11, evaluationDTO.getComfortableScore());
			pstmt.setString(12, evaluationDTO.getLectureScore());

			return pstmt.executeUpdate(); //실행한 결과를 반환해준다. 

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {if(conn != null) conn.close();} catch (Exception e) { e.printStackTrace();}
			try {if(pstmt != null) pstmt.close();} catch (Exception e) { e.printStackTrace();}
			try {if(rs != null) rs.close();} catch (Exception e) { e.printStackTrace();}	
			}
		return -2; //데이터베이스 오류 
	}
}

 

evaluationRegisterAction.jsp: 사용자가 평가를 등록하게 되면, 그 평가 등록을 처리

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<%@ page import="evaluation.EvaluationDTO"%>
<%@ page import="evaluation.EvaluationDAO"%>

<%@ page import="java.io.PrintWriter"%>

<%

//세션 
	request.setCharacterEncoding("UTF-8");

	String userID = null;

	if(session.getAttribute("userID") != null) {
		userID = (String) session.getAttribute("userID");
	}

	if(userID == null) {

		PrintWriter script = response.getWriter();

		script.println("<script>");
		script.println("alert('로그인을 해주세요.');");
		script.println("location.href = 'userLogin.jsp'");
		script.println("</script>");

		script.close();

		return;

	}
	
	//사용자로 입력 받는 값을 정의 
	request.setCharacterEncoding("UTF-8");

	String lectureName = null;
	String professorName = null;
	int lectureYear = 0;
	String semesterDivide = null;
	String lectureDivide = null;
	String evaluationTitle = null;
	String evaluationContent = null;
	String totalScore = null;
	String creditScore = null;
	String comfortableScore = null;
	String lectureScore = null;

	// 사용자로부터 입력 받는다. 
	if(request.getParameter("lectureName") != null) {
		lectureName = (String) request.getParameter("lectureName");
	}

	if(request.getParameter("professorName") != null) {
		professorName = (String) request.getParameter("professorName");
	}

	if(request.getParameter("lectureYear") != null) {
		//받은 값은 무조건 문자열이기 때문에 정수형으로 바꿔줘야한다.
		try {
			lectureYear = Integer.parseInt(request.getParameter("lectureYear"));
		} catch (Exception e) {
			System.out.println("강의 연도 데이터 오류");
		}
	}

	if(request.getParameter("semesterDivide") != null) {
		semesterDivide = (String) request.getParameter("semesterDivide");
	}

	if(request.getParameter("lectureDivide") != null) {
		lectureDivide = (String) request.getParameter("lectureDivide");
	}

	if(request.getParameter("evaluationTitle") != null) {
		evaluationTitle = (String) request.getParameter("evaluationTitle");
	}

	if(request.getParameter("evaluationContent") != null) {
		evaluationContent = (String) request.getParameter("evaluationContent");
	}

	if(request.getParameter("totalScore") != null) {
		totalScore = (String) request.getParameter("totalScore");
	}

	if(request.getParameter("creditScore") != null) {
		creditScore = (String) request.getParameter("creditScore");
	}

	if(request.getParameter("comfortableScore") != null) {
		comfortableScore = (String) request.getParameter("comfortableScore");
	}

	if(request.getParameter("lectureScore") != null) {
		lectureScore = (String) request.getParameter("lectureScore");
	}
	
	//한개라도 입력이 되지 않았다면.
	//evaluationTitle.equals("") -> 공백 처리 
	if (lectureName == null || professorName == null || lectureYear == 0 || semesterDivide == null ||
			lectureDivide == null || evaluationTitle == null || evaluationContent == null || totalScore == null ||
			creditScore == null || comfortableScore == null || lectureScore == null ||
			evaluationTitle.equals("") || evaluationContent.equals("")) {

		PrintWriter script = response.getWriter();

		script.println("<script>");
		script.println("alert('입력이 안 된 사항이 있습니다.');");
		script.println("history.back();");
		script.println("</script>");
		
		script.close();

		return;

	} else {

		EvaluationDAO evaluationDAO = new EvaluationDAO();

		int result = evaluationDAO.write(new EvaluationDTO(0, userID, lectureName, professorName, lectureYear,
				semesterDivide, lectureDivide, evaluationTitle, evaluationContent,
				totalScore, creditScore, comfortableScore, lectureScore, 0));

		if (result == -1) {

			PrintWriter script = response.getWriter();

			script.println("<script>");
			script.println("alert('평가 등록에 실패했습니다.');");
			script.println("history.back();");
			script.println("</script>");

			script.close();

			return;

		} else {

			PrintWriter script = response.getWriter();

			script.println("<script>");
			script.println("location.href = './index.jsp';");
			script.println("</script>");

			script.close();

			return;

		}

	}

%>

 

index.jsp (변수명 수정)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<!-- 로그인을 했을 때와 로그인을 하지 않았을 때를 세션으로 구분하기 위해 추가 -->
<%@ page import="java.io.PrintWriter"%>
<%@ page import="user.UserDAO"%>


<!doctype html>

<html>

  <head>
    <title>강의평가 웹 사이트</title>
    <meta charset="utf-8">
    <!-- 반응형 페이지이기 때문에 사이즈를 적용해준다. -->
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <!-- 부트스트랩 CSS 추가하기 -->
    <link rel="stylesheet" href="./css/bootstrap.min.css">
    <!-- 커스텀 CSS 추가하기 -->
    <link rel="stylesheet" href="./css/custom.css">
  </head>

  <body>
  <%
	//로그인 및 로그아웃을 위한 세션 추가 
	String userID = null;

	if(session.getAttribute("userID") != null) {

		userID = (String) session.getAttribute("userID");

	}

	if(userID == null) {

		PrintWriter script = response.getWriter();

		script.println("<script>");
		script.println("alert('로그인을 해주세요.');");
		script.println("location.href = 'userLogin.jsp'");
		script.println("</script>");

		script.close();	

	}
	//이메일 인증이 안됏을 경우 
	boolean emailChecked = new UserDAO().getUserEmailChecked(userID);

	if(emailChecked == false) {

		PrintWriter script = response.getWriter();

		script.println("<script>");
		//이메일 인증 페이지로 이동 시킨다. 
		script.println("location.href = 'emailSendConfirm.jsp'");
		script.println("</script>");

		script.close();		

		return;

	}

%>	

  <!--  네비게이션 바를 보여줌  -->
    <nav class="navbar navbar-expand-lg navbar-light bg-light">
    <!-- 부트스트랩에서 로그 같은 것을 출력 하는 것  -->
      <a class="navbar-brand" href="index.jsp">강의평가 웹 사이트</a>
      <!--  버튼을 생성해서 보였다가 안보였다를 구현. -->
      <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbar">
        <!-- 작데기 하나를 보여줌. -->
        <span class="navbar-toggler-icon"></span>
      </button>
		
		<!-- 버튼을 눌렀을 때 보여주는 내부요소 부분 /위에 버튼 태그를 눌렀을 때 id가 =navbar 인 곳이 나온다.  -->
      <div class="collapse navbar-collapse" id="navbar">
      	<!-- 리스트 내용 부분. -->
        <ul class="navbar-nav mr-auto">
        <!-- 현재 페이제 index.jsp를 나타낸다.  -->
          <li class="nav-item active">
          	<!-- a태그로 이동할 페이지를 넣어준다.  -->
            <a class="nav-link" href="index.jsp">메인</a>
          </li>
			
			<!--  눌렀을 때 아래로 나오는 기능 부분  -->
          <li class="nav-item dropdown">
            <a class="nav-link dropdown-toggle" id="dropdown" data-toggle="dropdown">
              회원 관리
            </a>

            <div class="dropdown-menu" aria-labelledby="dropdown">
            <%
			if(userID == null) {
			%>
              <a class="dropdown-item" href="userLogin.jsp">로그인</a>
              <a class="dropdown-item" href="userJoin.jsp">회원가입</a>
             <%
			}else{
             %>
              <a class="dropdown-item" href="userLogout.jsp">로그아웃</a>
              <% } %>
            </div>
          </li>
        </ul>
		<!-- 검색 양식  -->
        <form class="form-inline my-2 my-lg-0">
          <input class="form-control mr-sm-2" type="search" placeholder="내용을 입력하세요." aria-label="Search">
          <button class="btn btn-outline-success my-2 my-sm-0" type="submit">검색</button>
        </form>
      </div>
    </nav>
	
	<!-- 본문 부분  -->
	<!--  알아서 작아지는 것에 도움을 준다. -->
	<!-- 검색창을 만들어 준다. -->
	<section class = "container">
		<!-- mt-3 : 마진을 3을 준다. -->
		<form method = "get" action = "./index.jsp" class = "form-inline mt-3">
			<select name = "lectureDivide" class = "form-control mx-1 mt-2">
				<option value="전제">전체 </option>
				<option value="전공">전공</option>
				<option value="교양">기타 </option>
			</select>
			<input type="text" name = "search" class="form-control mx-1 mt-2" placeholder="내용을 입력하세요.">
			<button type="submit" class = "btn btn-primary mx-1 mt-2">검색</button>
			<!--  모달이란 부트스트랩에서 지원해주는 웹패이지 양식을 보여줌. -->
			<a class = "btn btn-primary mx-1 mt-2" data-toggle = "modal" href = "#registerModal">등록하기</a>
			<a class = "btn btn-danger mx-1 mt-2" data-toggle = "modal" href = "#reportModal">신고</a>
		</form> 
		
	
	<!-- 실제로 사용자가 강의 평가를 할 때 어떻게 보여줘야할지를 나타낸다. -->
	<div class = "card bg-light mt-3"> <!-- 윗 쪽에 3만큼 여백을 준다. -->
		<div class="card-header bg-light">
			<!-- 한 개의 행을 두개로 나눈다. -->
			<div class ="row">
				<div class = "col-8 text-left">컴퓨터개론&nbsp;<small>오현지</small></div>
				<div class = "col-4 text-right">
					종합<span style="color: red;">A</span>
				</div>
			</div>
		</div>
		
		<div class = "card-body">
			<h5 class = "card-title">
				정말 좋은 강의입니다.&nbsp;<small>(2019년 가을 학기)</small>
			</h5>
			<p class = "card-text"> 강의가 널널해서 좋습니다. 학점도 잘 나오고 좋습니다.</p>
			<div class = "row">
				<div class = "col-9 text-left">
					성적<span style="color: red;">A</span>
					보통<span style="color: red;">A</span>
					강의<span style="color: red;">B</span>
					<span style ="color: green;">(추천: 15)</span>
				</div>
				<div class = "col-3 text-right">
					<a onclick="return confirm('추천하시겠습니까?')" href="./likeAction.jsp?evaluationID=">추천</a>
					<a onclick="return confirm('삭제하시겠습니까?')" href="./deleteAction.jsp?evaluationID=">삭제</a>
					
			</div>
		</div>
		
	</div>
		
	</section>
	
	
	<!-- 모달 다이어그램  -->
	<div class = "modal fade" id="registerModal" tabindex="-1" role="dialog" aria-labelledby="modal" aria-hidden="true">
		<div class = "modal-dialog">
			<div class = "modal-content">
			<!-- 제목적인 측면이 들어간. -->
				<div class = "modal-header">
				 	<h5 class = "modal-title" id = "modal">평가 등록</h5>
				 	<!-- 모달 창을 닫는 버튼  -->
				 	<button type = "button" class="close" data-dismiss ="modal" aria-label ="close">
				 		<!--  닫기 아이콘  -->
				 		<span aria-hidden="true">&times;</span>
				 	</button>
				</div>
				<!-- 내용적인 측면이 들어간다. -->
				<div class = "modal-body">
					<form action = "./evaluationRegisterAction.jsp" method="post">
					<!-- 하나의 행을 여러가지로 나눌 때 사용한다.  -->
						<div class = "form-row">
							<!-- 한개의 열은 총 12만큼 해당된다. -->
							<div class="form-group col-sm-6">
								<label>강의명 </label>
								<input type = "text" name = "lectureName" class = "form-control" maxlength ="20">
							</div>
							<div class="form-group col-sm-6">
								<label>교수명 </label>
								<input type = "text" name = "professorName" class = "form-control" maxlength ="20">
							</div>
						</div>
						
						<div class = "form-row">
							<!-- 무언가를 선택할 때 사용한다.  -->
							<div class = "form-group col-sm-4">
								<label>	수강연도 </label>
								<select name ="lectureYear" class="form-control">
									<option value = "2011">2011</option>
									<option value = "2012">2012</option>
									<option value = "2013">2013</option>
									<option value = "2014">2014</option>
									<option value = "2015">2015</option>
									<option value = "2016">2016</option>
									<option value = "2017">2017</option>
									<option value = "2018">2018</option>
									<option value = "2019">2019</option>
									<option value = "2020" selected>2020</option>
									<option value = "2021">2021</option>
									<option value = "2022">2022</option>
								</select>
							</div>
						
						<div class = "form-group col-sm-4">
							<label>수강 학기 </label>
							<select name = "semesterDivide" class="form-control">
								<option value = "1학기" selected>1학기</option>
								<option value = "여름학기" >여름학기</option>
								<option value = "2학기" >2학기</option>
								<option value = "겨울학기" >겨울학기</option>
							</select>
						</div>
						
						<div class = "form-group col-sm-4">
							<label>강의 구분</label>
							<select name = "lectureDivide" class="form-control">
								<option value = "전공" selected>전공</option>
								<option value = "교양" >교양</option>
								<option value = "기타" >기타</option>
							</select>
						</div>
					</div>
					
					<!-- 강의 평가 부분  -->
				<div class = "form-group">
					<label>제목</label>
					<input type ="text" name = "evaluationTitle" class="form-control" maxlength="40">
				</div>
						
				<div class = "form-group">
					<label>내용</label>
					<textarea name ="evaluationContent" class="form-control" maxlength="2048" style = "height: 180px;"></textarea>
				</div>	
				
				<!-- 하나의 행을 여러가지로 만든다. -->	
				<div class ="form-row">
					<div class="orm-group col-sm-3">
						<label>종합</label>
						<select name = "totalScore" class="form-control">
							<option value = "A" selected>A</option>
							<option value = "B" >B</option>
							<option value = "C" >C</option>
							<option value = "D" >D</option>
							<option value = "F" >F</option>
						</select>
					</div>
					
					<div class="orm-group col-sm-3">
						<label>성적</label>
						<select name = "creditScore" class="form-control">
							<option value = "A" selected>A</option>
							<option value = "B" >B</option>
							<option value = "C" >C</option>
							<option value = "D" >D</option>
							<option value = "F" >F</option>
						</select>
					</div>
					
					<div class="orm-group col-sm-3">
						<label>보통</label>
						<select name = "comfortableScore" class="form-control">
							<option value = "A" selected>A</option>
							<option value = "B" >B</option>
							<option value = "C" >C</option>
							<option value = "D" >D</option>
							<option value = "F" >F</option>
						</select>
					</div>
					
					<div class="orm-group col-sm-3">
						<label>강의 평가 </label>
						<select name = "lectureScore" class="form-control">
							<option value = "A" selected>A</option>
							<option value = "B" >B</option>
							<option value = "C" >C</option>
							<option value = "D" >D</option>
							<option value = "F" >F</option>
						</select>
					</div>
				</div>
				
				<div class="modal-footer">
					<button type="button" class="btn btn-secondary" data-dismiss="modal">취소</button>
					<button type="submit" class="btn btn-primary">등록하기</button>
				</div>
			
					</form>
				</div>
			</div>
		</div>
	</div>
	
		<!-- 모달 다이어그램  2번째 -->
	<div class = "modal fade" id="reportModal" tabindex="-1" role="dialog" aria-labelledby="modal" aria-hidden="true">
		<div class = "modal-dialog">
			<div class = "modal-content">
			<!-- 제목적인 측면이 들어간. -->
				<div class = "modal-header">
				 	<h5 class = "modal-title" id = "modal">신고하기</h5>
				 	<!-- 모달 창을 닫는 버튼  -->
				 	<button type = "button" class="close" data-dismiss ="modal" aria-label ="close">
				 		<!--  닫기 아이콘  -->
				 		<span aria-hidden="true">&times;</span>
				 	</button>
				</div>
				<!-- 내용적인 측면이 들어간다. -->
				<div class = "modal-body">
					<form action = "./reportAction.jsp" method="post">
					
					
					<!-- 강의 평가 부분  -->
				<div class = "form-group">
					<label>신고 제목</label>
					<input type ="text" name = "reportTitle" class="form-control" maxlength="40">
				</div>
						
				<div class = "form-group">
					<label>신고 내용</label>
					<textarea name ="reportContent" class="form-control" maxlength="2048" style = "height: 180px;"></textarea>
				</div>	
				
				
				<div class="modal-footer">
					<button type="button" class="btn btn-secondary" data-dismiss="modal">취소</button>
					<button type="submit" class="btn btn-danger">신고하기</button>
				</div>
			
					</form>
				</div>
			</div>
		</div>
	</div>
	
	<footer class ="bg-dark mt-4 p-5 text-center" style="color: #FFFFFF;">
		Copyright &copy; 2020 오현지 All Rights Reserved.
	</footer>
	
	 <!-- 제이쿼리 자바스크립트 추가하기 -->
    <script src="./js/jquery.min.js"></script>
    <!-- Popper 자바스크립트 추가하기 -->
    <script src="./js/popper.min.js"></script>
    <!-- 부트스트랩 자바스크립트 추가하기 -->
    <script src="./js/bootstrap.min.js"></script>
  </body>
</html>

값을 입력한다.
성공적으로 글이 들어 갔다.

 

수강게시판(강의평가기능_3).zip
4.58MB

 

신고하기

<!-- reportAction.jsp: 사용자가 신고서를 작성하면, 관리자의 메일로 그 신고 내용을 받습니다. -->

<%@page import="javax.mail.Transport"%>
<%@page import="javax.mail.Message"%>
<%@page import="javax.mail.Address"%>
<%@page import="javax.mail.internet.InternetAddress"%>
<%@page import="javax.mail.internet.MimeMessage"%>
<%@page import="javax.mail.Session"%>
<%@page import="javax.mail.Authenticator"%>
<%@page import="java.util.Properties"%>
<%@page import="java.io.PrintWriter"%>
<%@page import="user.UserDAO"%>
<%@page import="util.SHA256"%>
<%@page import="util.Gmail"%>

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<%
String userID = null;

if(session.getAttribute("userID") != null) {
	userID = (String) session.getAttribute("userID");
}

if(userID == null) {

	PrintWriter script = response.getWriter();

	script.println("<script>");
	script.println("alert('로그인을 해주세요.');");
	script.println("location.href = 'userLogin.jsp'");
	script.println("</script>");

	script.close();

	return;

}

request.setCharacterEncoding("UTF-8");

String reportTitle = null;
String reportContent = null;

if(request.getParameter("reportTitle") != null) {
	reportTitle = (String) request.getParameter("reportTitle");
}

if(request.getParameter("reportContent") != null) {
	reportContent = (String) request.getParameter("reportContent");
}

if (reportTitle == null || reportContent == null) {
	
	PrintWriter script = response.getWriter();

	script.println("<script>");
	script.println("alert('입력이 안 된 사항이 있습니다.');");
	script.println("history.back();");
	script.println("</script>");

	script.close();

	return;

}


// 사용자에게 보낼 메시지를 기입

String host = "http://localhost:8080/Lecture_Evaluation/";
String from = "구글 계정 아이디";
String to = "관리자/개발자의 이메일 주소";
String subject = "강의평가 사이트에서 접수된 신고 메일입니다.";
String content = "신고자: " + userID + "<br>제목: " + reportTitle + "<br>내용: " + reportContent;


// SMTP에 접속하기 위한 정보를 기입

Properties p = new Properties();

p.put("mail.smtp.user", from);

p.put("mail.smtp.host", "smtp.googlemail.com");

p.put("mail.smtp.port", "465");

p.put("mail.smtp.starttls.enable", "true");

p.put("mail.smtp.auth", "true");

p.put("mail.smtp.debug", "true");

p.put("mail.smtp.socketFactory.port", "465");

p.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");

p.put("mail.smtp.socketFactory.fallback", "false");

 

try{

    Authenticator auth = new Gmail();

    Session ses = Session.getInstance(p, auth);

    ses.setDebug(true);

    MimeMessage msg = new MimeMessage(ses); 

    msg.setSubject(subject);

    Address fromAddr = new InternetAddress(from);

    msg.setFrom(fromAddr);

    Address toAddr = new InternetAddress(to);

    msg.addRecipient(Message.RecipientType.TO, toAddr);

    msg.setContent(content, "text/html;charset=UTF-8");

    Transport.send(msg);

} catch(Exception e){

    e.printStackTrace();

	PrintWriter script = response.getWriter();

	script.println("<script>");
	script.println("alert('오류가 발생했습니다.');");
	script.println("history.back();");
	script.println("</script>");

	script.close();		

    return;

}

PrintWriter script = response.getWriter();

script.println("<script>");
script.println("alert('정상적으로 신고되었습니다.');");
script.println("history.back();");
script.println("</script>");

script.close();		

return;

%>

+ Recent posts