www.businessplus.co.kr/

로그인 페이지
네비바와 리스트페이지
토글형 메뉴 게시판
토글형 상세게시판과 리스트게시판
갤러리형 게시판

 

글쓰기 페이지
상세보기 페이지
수정게시판
배너 페이지 수정 게시판(수정만 가능)
테이블 
공지사항 테이블
미디어/갤러리 테이블
배너 테이블
로그인 테이블

 

vue 리스트 게시판 모습
새로운 사용자를 추가시 모달창을 불러온다.
DB저장 성공시 뜨는 메세지.(오류 메세지로 출력가능)

 

수정시 모달창이 뜨면서 수정 가능
성공시 뜨는 메세지(오류 메세지도 출력가능)
유저 삭제시 뜨는 모달창
성공시 뜨는 메시지(오류도 출력가능)

index.html

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>


    <!-- CSS only -->
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" integrity="sha384-JcKb8q3iqJ61gNV9KGb8thSsNjpSL0n8PARn9HuZOnIxN0hoP+VmmDGMN5t9UJ0Z" crossorigin="anonymous" />
    <script src="https://kit.fontawesome.com/42e2ecb8e0.js" crossorigin="anonymous"></script>
    <style type="text/css">
        #overlay {
            position: fixed;
            top: 0;
            bottom: 0;
            left: 0;
            right: 0;
            background: rgba(0, 0, 0, 0.6);
        }
    </style>

</head>

<body>
    <!-- header -->
    <div id="app">
        <div class="container-fluid">
            <div class="row bg-dark">
                <div class="col-lg-12">
                    <p class="text-center text-light display-4 pt-2" style="font-size: 25px">
                        CRUD 어플리케이션 vue, PHP, mysqli
                    </p>
                </div>
            </div>
        </div>
        <div class="container">
            <div class="row mt-3">
                <div class="col-lg-6">
                    <h3 class="text-info">등록 된 유저들</h3>
                </div>
                <div class="col-lg-6">
                    <button class="btn btn-info float-right" @click="showAddModal=true">
              <i class="fas fa-user"></i> &nbsp;  &nbsp; 새롭게 추가
            </button>
                </div>
            </div>
            <hr class="bg-info" />
            <div class="alert alert-danger" v-if="errorMsg">{{ errorMsg }}</div>
            <div class="alert alert-success" v-if="successMsg">{{ successMsg }} </div>

            <!--디스플레이 레코드-->
            <div class="row">
                <div class="col-lg-12">
                    <table class="table table-bordered table-striped">
                        <thead>
                            <tr class="text-center bg-info text-light">
                                <th>ID</th>
                                <th>이름</th>
                                <th>이메일</th>
                                <th>핸드폰</th>
                                <th>수정</th>
                                <th>삭제</th>
                            </tr>
                        </thead>
                        <tbody>
                            <tr class="text-center" v-for="user in users">
                                <td>{{ user.id }}</td>
                                <td>{{ user.name }}</td>
                                <td>{{ user.email }}</td>
                                <td>{{ user.phone }}</td>
                                <td>
                                    <a href="#" class="text-success" @click="showEditModal=true; selectUser(user);"><i class="fas fa-edit"></i></a>
                                </td>
                                <td>
                                    <a href="#" class="text-danger" @click="showDeleteModal=true; selectUser(user);"><i class="fas fa-trash-alt"></i></a>
                                </td>
                            </tr>
                        </tbody>
                    </table>
                </div>
            </div>
        </div>

        <!--새로운 사용자 추가 모달-->
        <div id="overlay" v-if="showAddModal">
            <div class="modal-dialog">
                <div class="modal-content">
                    <div class="modal-header">
                        <h5 class="modal-title">새로운 사용자 추가</h5>
                        <button type="button" class="close" @click="showAddModal=false">
                            <span aria-hidden="true">&times;</span>
                        </button>
                    </div>
                    <div class="modal-body p-4">
                        <form action="#" method="post">
                            <div class="form-group">
                                <input type="text" name="name" class="form-control form-control-lg" placeholder="name" v-model="newUser.name">
                            </div>
                            <div class="form-group">
                                <input type="text" name="email" class="form-control form-control-lg" placeholder="email" v-model="newUser.email">
                            </div>
                            <div class="form-group">
                                <input type="text" name="phone" class="form-control form-control-lg" placeholder="phone" v-model="newUser.phone">
                            </div>
                            <div class="form-group">
                                <button class="btn btn-info btn-block btn-lg" @click="showAddModal=false; addUser(); clearMsg();">사용자 추가</button>
                            </div>
                        </form>
                    </div>
                </div>
            </div>
        </div>

        <!--사용자 수정 모달-->
        <div id="overlay" v-if="showEditModal ">
            <div class="modal-dialog ">
                <div class="modal-content ">
                    <div class="modal-header ">
                        <h5 class="modal-title ">사용자 수정</h5>
                        <button type="button " class="close " @click="showEditModal=false ">
                            <span aria-hidden="true">&times;</span>
                        </button>
                    </div>
                    <div class="modal-body p-4 ">
                        <form action="# " method="post ">
                            <div class="form-group ">
                                <input type="text " name="name " class="form-control form-control-lg" v-model="currentUser.name">
                            </div>
                            <div class="form-group ">
                                <input type="text " name="email " class="form-control form-control-lg" placeholder="이메일" v-model="currentUser.email">
                            </div>
                            <div class="form-group ">
                                <input type="text " name="phone " class="form-control form-control-lg" placeholder="핸드폰" v-model="currentUser.phone">
                            </div>
                            <div class="form-group ">
                                <button class="btn btn-info btn-block btn-lg " @click="showEditModal=false; updateUser(); clearMsg();">사용자 업데이트</button>
                            </div>
                        </form>
                    </div>
                </div>
            </div>
        </div>

        <!--사용자 삭제 모달-->
        <div id="overlay" v-if="showDeleteModal ">
            <div class="modal-dialog ">
                <div class="modal-content ">
                    <div class="modal-header ">
                        <h5 class="modal-title ">사용자 삭제</h5>
                        <button type="button " class="close " @click="showDeleteModal=false ">
                            <span aria-hidden="true ">&times;</span>
                        </button>
                    </div>
                    <div class="modal-body p-4 ">
                        <h4 class="text-danger ">정말 삭제하시겠습니까?</h4>
                        <h5>당신은 '{{ currentUser.name }}'를 삭제합니다.</h5>
                        <hr>
                        <button class="btn btn-danger btn-lg " @click="showDeleteModal=false; deleteUser(); clearMsg(); ">네</button> &nbsp;&nbsp;&nbsp;&nbsp;
                        <button class="btn btn-success btn-lg " @click="showDeleteModal=false ">아니오</button>
                    </div>
                </div>
            </div>
        </div>

    </div>

    <script src="https://cdnjs.cloudflare.com/ajax/libs/axios/0.20.0/axios.min.js "></script>
    <script src="https://cdn.jsdelivr.net/npm/vue "></script>
    <script>
        var app = new Vue({
            el: "#app ",
            data: {
                errorMsg: "",
                successMsg: "",
                showAddModal: false,
                showEditModal: false,
                showDeleteModal: false,
                users: [],
                newUser: {
                    name: "",
                    email: "",
                    phone: ""
                },
                currentUser: {}
            },

            mounted: function() {
                this.getAllUsers();
            },
            methods: {

                getAllUsers() {
                    axios.get("http://localhost/crud-vue-php/process.php?action=read").then(function(response) {
                        if (response.data.error) {
                            app.errorMsg = response.data.message;
                        } else {
                            app.users = response.data.users;
                        }
                    });
                },

                addUser() {
                    var formData = app.toFormData(app.newUser);
                    axios.post("http://localhost/crud-vue-php/process.php?action=create", formData).then(function(response) {
                        app.newUser = {
                            name: "",
                            email: "",
                            phone: ""
                        };
                        if (response.data.error) {
                            app.errorMsg = response.data.message;
                        } else {
                            app.successMsg = response.data.message;
                            app.getAllUsers();
                        }
                    });
                },

                updateUser() {
                    var formData = app.toFormData(app.currentUser);
                    axios.post("http://localhost/crud-vue-php/process.php?action=update", formData).then(function(response) {
                        app.currentUser = {};
                        if (response.data.error) {
                            app.errorMsg = response.data.message;
                        } else {
                            app.successMsg = response.data.message;
                            app.getAllUsers();
                        }
                    });
                },

                deleteUser() {
                    var formData = app.toFormData(app.currentUser);
                    axios.post("http://localhost/crud-vue-php/process.php?action=delete", formData).then(function(response) {
                        app.currentUser = {};
                        if (response.data.error) {
                            app.errorMsg = response.data.message;
                        } else {
                            app.successMsg = response.data.message;
                            app.getAllUsers();
                        }
                    });
                },

                toFormData(obj) {
                    var fd = new FormData();
                    for (var i in obj) {
                        fd.append(i, obj[i]);
                    }
                    return fd;
                },
                selectUser(user) {
                    app.currentUser = user;
                },
                clearMsg() {
                    app.errorMsg = "";
                    app.successMsg = "";
                }


            }
        });
    </script>
</body>

</html>

process.php

<?php
    $conn = new mysqli("localhost", "root", "", "crud_vue");
    if($conn->connect_error){
        die("Connection Failed!".$conn->connect_error);
    }
    //echo("Success");
    $result = array('error'=>false);
    $action = '';


    if(isset($_GET['action'])){
        $action = $_GET['action'];
    }



    if($action == 'read'){
        $sql = $conn->query("SELECT * FROM users");
        $users = array();
        while($row = $sql->fetch_assoc()){
            array_push($users, $row);
        }
        $result['users'] = $users;
    }


    if($action == 'create'){
        $name = $_POST['name'];
        $email = $_POST['email'];
        $phone = $_POST['phone'];

        $sql = $conn->query("INSERT INTO users (name,email,phone) VALUES('$name','$email','$phone')");
        
        if($sql){
            $result['message'] = "user added successfully!";
        }
        else{
            $result['error'] = true;
            $result['message'] = "failed to add user!";
        }
    }


    if($action == 'update'){
        $id = $_POST['id'];
        $name = $_POST['name'];
        $email = $_POST['email'];
        $phone = $_POST['phone'];

        $sql = $conn->query("UPDATE users SET name='$name', email='$email', phone='$phone' WHERE id='$id'");

        if($sql){
            $result['message'] = "user update successfully";
        }
        else{
            $result['error'] = true;
            $result['message'] = "failed to update user!";
        }
    }


    if($action == 'delete'){
        $id = $_POST['id'];

        $sql = $conn->query("DELETE FROM users WHERE id='$id'");

        if($sql){
            $result['message'] = "유저 삭제 성공했다!";
        }
        else{
            $result['error'] = true;
            $result['message'] = "유저 삭제 실패 ㅠㅠ!";
        }
    }

    $conn->close();
    echo json_encode($result);
    
?>

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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="login.jsp">로그인</a>
              <a class="dropdown-item" href="Join.jsp">회원가입</a>
             <%
			//}else{
             %>
              <a class="dropdown-item" href="Logout.jsp">로그아웃</a>
              <%// } %>
            </div>
          </li>
        </ul>
        
       	<form>
       	<button class="btn btn-outline-success mx-1" 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="영어" <%//if(lectureDivide.equals("전공")) out.println("selected");%>>영어</option>
          		<option value="중국어" <%//if(lectureDivide.equals("교양")) out.println("selected");%>>중국어</option>
          		<option value="일본어" <%//if(lectureDivide.equals("기타")) out.println("selected");%>>일본어</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>
		
       	<button class="btn btn-outline-success mx-1 mt-2" type="submit">엑셀 자료 추가</button>
  
		</form> 
			
	<br>
	
	<div class ="table-responsive">
	<table class = "table table table-hover table-bordered table-striped">
		<thead>
		<tr>
			<td>번호</td>
			<td>구분</td>
			<td>단어</td>
			<td>뜻</td>
			<td>비고</td>
		</tr>
		</thead>
		
		<tbody>
		<tr>
			<td>1</td>
			<td>영어</td>
			<td>table</td>
			<td>테이블</td>
			<td>
				<a type="submit" href="./ModifiAction.jsp?ID=%>">수정</a>
				<a onclick="return confirm('삭제하시겠습니까?')" href="./deleteAction.jsp?ID=%>">삭제</a>
			</td>
		</tr>
		</tbody>
		
	</table>
	</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 = "./RegisterAction.jsp" method="post">
					<!-- 하나의 행을 여러가지로 나눌 때 사용한다.  -->
						<div class = "form-row">
						<div class = "form-group col-sm-4">
							<label>구분</label>
							<select name = "WordDivide" 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 = "Word" class="form-control" maxlength="40">
				</div>
						
				<div class = "form-group">
					<label>단어 뜻</label>
					<textarea name ="mean" 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-primary">등록하기</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>

 

결과물

모달 창을 이용한 글쓰기 폼

 

login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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="login.jsp">로그인</a>
              <a class="dropdown-item" href="Join.jsp">회원가입</a>
             <%
			//}else{
             %>
              <a class="dropdown-item" href="Logout.jsp">로그아웃</a>
              <%// } %>
            </div>
          </li>
        </ul>
        
       	<form>
       	<button class="btn btn-outline-success mx-1" type="submit">단어 시험</button>
        </form>
      </div>
    </nav>
    
    <br>
    <!-- 로그인 양식 부 -->
		<section class = "container mt-3" style = " max-width: 560px;">
		<div class="jumbotron" style="padding-top:50px;">
		<form method="post" action="./LoginAction.jsp">
		<h3 style="text-align: center;">로그인 화면</h3>
			<div class="form-group">
				<label>아이디</label>
				<input type="text" name="ID" class="form-control">
			</div>
			<div class="form-group">
				<label>비밀번호</label>
				<input type="password" name="Password" class="form-control">
			</div>
			<div class="form-row text-center">
    		<div class="col-12">
			<button type="submit" class="btn btn-primary">로그인</button>
			</div>
			</div>
		</form>
		</div>
	</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>

결과물

 

Join.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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="login.jsp">로그인</a>
              <a class="dropdown-item" href="Join.jsp">회원가입</a>
             <%
			//}else{
             %>
              <a class="dropdown-item" href="Logout.jsp">로그아웃</a>
              <%// } %>
            </div>
          </li>
        </ul>
        
       	<form>
       	<button class="btn btn-outline-success mx-1" type="submit">단어 시험</button>
        </form>
      </div>
    </nav>
    
    <br>
    <!-- 로그인 양식 부 -->
	<section class = "container mt-3" style = " max-width: 560px;">
		<div class="jumbotron" style="padding-top:50px;">
		<form method="post" action="./userRegisterAction.jsp">
			<h3 style="text-align: center;">회원가입 화면</h3>
			<div class="form-group">
				<label>아이디</label>
				<input type="text" name="ID" class="form-control">
			</div>
			<div class="form-group">
				<label>비밀번호</label>
				<input type="password" name="Password" class="form-control">
			</div>
			<div class="form-group">
				<label>이메일</label>
				<input type="email" name="Email" class="form-control">
			</div>
			<div class="form-row text-center">
    		<div class="col-12">
			<button type="submit" class="btn btn-primary">회원가입</button>
			</div>
			</div>	
		</form>
		</div>
	</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>

글목록 출력 및 검색기능 구현하기

 

index.jsp를 수정해준다. 

<!-- 검색 양식  -->
        <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" type="search" placeholder="내용을 입력하세요." aria-label="Search">
          <button class="btn btn-outline-success my-2 my-sm-0" type="submit">검색</button>
        </form>

get방식으로 전송 

emailSendConfirm.jsp, userJoin.jsp, userLogin.jsp, emailSendAction.jsp 에도 넣어준다.

 

EvaluationDAO 글쓰기 함수 추가

package evaluation;

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

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; //데이터베이스 오류 
	}
	
	//검색 함수
	// 사용자가 입력한 값을 강의 평가 글로 보여준다.
	public ArrayList<EvaluationDTO> getList(String lectureDivide, String searchType, String search, int pageNumber) {
		//사용자가 전체로 검색했다면.
		if(lectureDivide.equals("전체")) {
			lectureDivide = "";
		}
		
		//강의 평가 글이 담기는 리스트를 만들어 준다.
		ArrayList<EvaluationDTO> evaluationList = null;

		String SQL = "";
		
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;

		try {
			// 사용자가 검색한 것이 최신순이라면, 
			if(searchType.equals("최신순")) {
				//LIKE  특정한 문자열을 포함하는지 물어볼 때 사용.
				//pageNumber * 5 + ", " + pageNumber * 5 + 6 -> 5개씩 보여주도록 만든다.
				SQL = "SELECT * FROM EVALUATION WHERE lectureDivide LIKE ? AND CONCAT(lectureName, professorName, evaluationTitle, evaluationContent) LIKE ? ORDER BY evaluationID DESC LIMIT " + pageNumber * 5 + ", " + pageNumber * 5 + 6;

			} else if(searchType.equals("추천순")) {

				SQL = "SELECT * FROM EVALUATION WHERE lectureDivide LIKE ? AND CONCAT(lectureName, professorName, evaluationTitle, evaluationContent) LIKE ? ORDER BY likeCount DESC LIMIT " + pageNumber * 5 + ", " + pageNumber * 5 + 6;

			}
			conn = DatabaseUtil.getConnection();
			pstmt = conn.prepareStatement(SQL);
			//"%" like와 함께 사용하여 문자열이 포함하는지에 대한 쿼리를 작성해준다.
			pstmt.setString(1, "%" + lectureDivide + "%");
			pstmt.setString(2, "%" + search + "%");

			rs = pstmt.executeQuery();
			
			//결과를 리스트를 초기화해준다.
			evaluationList = new ArrayList<EvaluationDTO>();
			//특정한 결과가 나올 떄마다.
			while(rs.next()) {
				//초기화를 해주고 
				EvaluationDTO evaluation = new EvaluationDTO(
					//결과를 담아준다.
					rs.getInt(1),
					rs.getString(2),
					rs.getString(3),
					rs.getString(4),
					rs.getInt(5),
					rs.getString(6),
					rs.getString(7),
					rs.getString(8),
					rs.getString(9),
					rs.getString(10),
					rs.getString(11),
					rs.getString(12),
					rs.getString(13),
					rs.getInt(14)
				);
				//리스트에 추가해서 담아준다.
				evaluationList.add(evaluation);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {

				if(rs != null) rs.close();
				if(pstmt != null) pstmt.close();
				if(conn != null) conn.close();

			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		//내용이 담긴 리스트로 결과를 반환해준다.
		return evaluationList;

	}


}

index.jsp를 수정

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

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

<%@ page import="evaluation.EvaluationDTO"%>
<%@ page import="evaluation.EvaluationDAO"%>
<%@ page import="java.util.ArrayList"%>
<%@ page import="java.net.URLEncoder"%>


<!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>
  <%
  	//항상사용자가 어떠한 게시물을 검색햇는지 처리해야한다.
  	request.setCharacterEncoding("UTF-8");
  	String lectureDivide = "전체";
  	String searchType = "최신순";
	String search = "";
	int pageNumber = 0;
	// 사용자가 어떤 검색으로 시도했는지 처리한다.
	if(request.getParameter("lectureDivide") != null) {
		//사용자가 요청한 값이 들어가도록 해준다.
		lectureDivide = request.getParameter("lectureDivide");
	}

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

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

	if(request.getParameter("pageNumber") != null) {
		try {
			//정수형으로 변환해준다.
			pageNumber = Integer.parseInt(request.getParameter("pageNumber"));
		} catch (Exception e) {
			System.out.println("검색 페이지 번호 오류");
		}
	}


	//로그인 및 로그아웃을 위한 세션 추가 
	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  action="./index.jsp" method="get" class="form-inline my-2 my-lg-0">
          <input type = "text" name = "search" 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="전공" <%if(lectureDivide.equals("전공")) out.println("selected");%>>전공</option>
          		<option value="교양" <%if(lectureDivide.equals("교양")) out.println("selected");%>>교양</option>
          		<option value="기타" <%if(lectureDivide.equals("기타")) out.println("selected");%>>기타</option>
			</select>
			
			<select name="searchType" class="form-control mx-1 mt-2">
         		 <option value="최신순">최신순</option>
         		 <option value="추천순" <%if(searchType.equals("추천순")) out.println("selected");%>>추천순</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> 
	
	<!-- 사용자가 검색한 내용이 리스트로 보여줄 수 있게 출력해준다. 부분. -->
	<%
		ArrayList<EvaluationDTO> evaluationList = new ArrayList<EvaluationDTO>();
		evaluationList = new EvaluationDAO().getList(lectureDivide, searchType, search, pageNumber);
		if(evaluationList != null)
			for(int i = 0; i < evaluationList.size(); i++){
				if(i == 5) break;
				EvaluationDTO evaluation = evaluationList.get(i);
	%>
	
	<!-- 실제로 사용자가 강의 평가를 할 때 어떻게 보여줘야할지를 나타낸다. -->
	<div class = "card bg-light mt-3"> <!-- 윗 쪽에 3만큼 여백을 준다. -->
		<div class="card-header bg-light">
			<!-- 한 개의 행을 두개로 나눈다. -->
			<div class ="row">
				<div class="col-8 text-left"><%=evaluation.getLectureName()%>&nbsp;<small><%=evaluation.getProfessorName()%></small></div>
				<div class = "col-4 text-right">
					종합<span style="color: red;"><%=evaluation.getTotalScore()%></span>
				</div>
			</div>
		</div>
		
		<div class = "card-body">
			<h5 class = "card-title">
				<!-- 평가글의 제목부분  -->
				<%=evaluation.getEvaluationTitle()%>&nbsp;<small>(<%=evaluation.getLectureYear()%>년 <%=evaluation.getSemesterDivide()%>)</small>
			</h5>
			<p class = "card-text"><%=evaluation.getEvaluationContent()%></p>
			<div class = "row">
				<div class = "col-9 text-left">
					성적 <span style="color: red;"><%=evaluation.getCreditScore()%></span>
              		널널 <span style="color: red;"><%=evaluation.getComfortableScore()%></span>
             		강의 <span style="color: red;"><%=evaluation.getLectureScore()%></span>
             		 <span style="color: green;">(추천: <%=evaluation.getLikeCount()%>)</span>
				</div>
				<div class = "col-3 text-right">
					<a onclick="return confirm('추천하시겠습니까?')" href="./likeAction.jsp?evaluationID=<%= evaluation.getEvaluationID()%>">추천</a>
					<a onclick="return confirm('삭제하시겠습니까?')" href="./deleteAction.jsp?evaluationID=<%= evaluation.getEvaluationID()%>">삭제</a>
				</div>
			</div>
		</div>
	</div>
	<%
	}
	%>
	</section>
	
	<!-- 부트스트랩에서 제공해주는 페이지넘버링  -->
	<ul class="pagination justify-content-center mt-3">
 	    <li class="page-item">

<%
	if(pageNumber <= 0) {
%>     
        <a class="page-link disabled">이전</a>
<%
	} else {
%>
		<a class="page-link" href="./index.jsp?lectureDivide=<%=URLEncoder.encode(lectureDivide, "UTF-8")%>&searchType=<%=URLEncoder.encode(searchType, "UTF-8")%>&search=<%=URLEncoder.encode(search, "UTF-8")%>&pageNumber=<%=pageNumber - 1%>">이전</a>
<%
	}
%>
      </li>
      <li class="page-item">
<%
	// 6개까지 가져오게 만들었는데 6개 보다 작으면 다음이라는 아이콘을 보여준다.
	if(evaluationList.size() < 6) {
%>     
        <a class="page-link disabled">다음</a>
<%
	} else {
%>
		<a class="page-link" href="./index.jsp?lectureDivide=<%=URLEncoder.encode(lectureDivide, "UTF-8")%>&searchType=<%=URLEncoder.encode(searchType, "UTF-8")%>&search=<%=URLEncoder.encode(search, "UTF-8")%>&pageNumber=<%=pageNumber + 1%>">다음</a>
<%
	}
%>

      </li>

    </ul>

	<!-- 모달 다이어그램  -->
	<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>

 

 

 

결과값

 

추천기능 구현하기

추천 스키마 
프라이머리 설정을 해준다.
특정한 사용자가 단한번만 추천을 사용할 수 있게끔 만들어준 것이다. 

EvaluationDAO 함수 추가 (삭제, 추천, 사용자 아이디 가져오기)

package evaluation;

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

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; //데이터베이스 오류 
	}
	
	//검색 함수
	// 사용자가 입력한 값을 강의 평가 글로 보여준다.
	public ArrayList<EvaluationDTO> getList(String lectureDivide, String searchType, String search, int pageNumber) {
		//사용자가 전체로 검색했다면.
		if(lectureDivide.equals("전체")) {
			lectureDivide = "";
		}
		
		//강의 평가 글이 담기는 리스트를 만들어 준다.
		ArrayList<EvaluationDTO> evaluationList = null;

		String SQL = "";
		
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;

		try {
			// 사용자가 검색한 것이 최신순이라면, 
			if(searchType.equals("최신순")) {
				//LIKE  특정한 문자열을 포함하는지 물어볼 때 사용.
				//pageNumber * 5 + ", " + pageNumber * 5 + 6 -> 5개씩 보여주도록 만든다.
				SQL = "SELECT * FROM EVALUATION WHERE lectureDivide LIKE ? AND CONCAT(lectureName, professorName, evaluationTitle, evaluationContent) LIKE ? ORDER BY evaluationID DESC LIMIT " + pageNumber * 5 + ", " + pageNumber * 5 + 6;

			} else if(searchType.equals("추천순")) {

				SQL = "SELECT * FROM EVALUATION WHERE lectureDivide LIKE ? AND CONCAT(lectureName, professorName, evaluationTitle, evaluationContent) LIKE ? ORDER BY likeCount DESC LIMIT " + pageNumber * 5 + ", " + pageNumber * 5 + 6;

			}
			conn = DatabaseUtil.getConnection();
			pstmt = conn.prepareStatement(SQL);
			//"%" like와 함께 사용하여 문자열이 포함하는지에 대한 쿼리를 작성해준다.
			pstmt.setString(1, "%" + lectureDivide + "%");
			pstmt.setString(2, "%" + search + "%");

			rs = pstmt.executeQuery();
			
			//결과를 리스트를 초기화해준다.
			evaluationList = new ArrayList<EvaluationDTO>();
			//특정한 결과가 나올 떄마다.
			while(rs.next()) {
				//초기화를 해주고 
				EvaluationDTO evaluation = new EvaluationDTO(
					//결과를 담아준다.
					rs.getInt(1),
					rs.getString(2),
					rs.getString(3),
					rs.getString(4),
					rs.getInt(5),
					rs.getString(6),
					rs.getString(7),
					rs.getString(8),
					rs.getString(9),
					rs.getString(10),
					rs.getString(11),
					rs.getString(12),
					rs.getString(13),
					rs.getInt(14)
				);
				//리스트에 추가해서 담아준다.
				evaluationList.add(evaluation);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {

				if(rs != null) rs.close();
				if(pstmt != null) pstmt.close();
				if(conn != null) conn.close();

			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		//내용이 담긴 리스트로 결과를 반환해준다.
		return evaluationList;

	}
	
	//추천 함수 
	public int like(String evaluationID) {

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

		try {
			// 글이 추천을 받으면 1증가 시켜준다.
			String SQL = "UPDATE EVALUATION SET likeCount = likeCount + 1 WHERE evaluationID = ?";
			
			conn = DatabaseUtil.getConnection();
			pstmt = conn.prepareStatement(SQL);

			pstmt.setInt(1, Integer.parseInt(evaluationID));

			return pstmt.executeUpdate();

		} catch (Exception e) {
			e.printStackTrace();
		} finally {

			try {
				if(rs != null) rs.close();
				if(pstmt != null) pstmt.close();
				if(conn != null) conn.close();

			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return -1;
	}

	
	//글 삭제 함수 
	public int delete(String evaluationID) {

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

		try {

			String SQL = "DELETE FROM EVALUATION WHERE evaluationID = ?";
			
			conn = DatabaseUtil.getConnection();
			pstmt = conn.prepareStatement(SQL);

			pstmt.setInt(1, Integer.parseInt(evaluationID));

			return pstmt.executeUpdate();

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if(rs != null) rs.close();
				if(pstmt != null) pstmt.close();
				if(conn != null) conn.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return -1;
	}

	
	//사용자 아이디를 가져오는 함수.
	public String getUserID(String evaluationID) {
		
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		
		try {

			String SQL = "SELECT userID FROM EVALUATION WHERE evaluationID = ?";
			
			conn = DatabaseUtil.getConnection();
			pstmt = conn.prepareStatement(SQL);

			pstmt.setInt(1, Integer.parseInt(evaluationID));

			rs = pstmt.executeQuery();

			while(rs.next()) {
				return rs.getString(1);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if(pstmt != null) pstmt.close();

				if(conn != null) conn.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return null;
	}
}


LikeyDTO.java

package likey;

public class LikeyDTO {
	
	String userID;
	int evaluationID;
	String userIP;

	

	public String getUserID() {
		return userID;
	}

	public void setUserID(String userID) {
		this.userID = userID;
	}

	public int getEvaluationID() {
		return evaluationID;
	}

	public void setEvaluationID(int evaluationID) {
		this.evaluationID = evaluationID;
	}

	public String getUserIP() {
		return userIP;
	}

	public void setUserIP(String userIP) {
		this.userIP = userIP;
	}
	
	public LikeyDTO() {
		
	}

	public LikeyDTO(String userID, int evaluationID, String userIP) {

		this.userID = userID;
		this.evaluationID = evaluationID;
		this.userIP = userIP;

	}

}

삭제 기능 구현

deleteAction.jsp

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

<%@ page import="user.UserDAO"%>
<%@ page import="evaluation.EvaluationDAO"%>
<%@ page import="likey.LikeyDTO"%>
<%@ page import="java.io.PrintWriter"%>

<%

	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 evaluationID = null;

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

	EvaluationDAO evaluationDAO = new EvaluationDAO();
	//만약에 게시글을 삭제하려는 사용자가 본인이라면,
	if(userID.equals(evaluationDAO.getUserID(evaluationID))) {
		//아이디를 삭제 할 수 있도록 한다.
		int result = new EvaluationDAO().delete(evaluationID);

		if (result == 1) {

			session.setAttribute("userID", userID);

			PrintWriter script = response.getWriter();

			script.println("<script>");
			script.println("alert('삭제가 완료되었습니다.');");
			script.println("location.href='index.jsp'");
			script.println("</script>");

			script.close();

			return;

		} else {

			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("alert('자신이 쓴 글만 삭제 가능합니다.');");
		script.println("history.back();");
		script.println("</script>");

		script.close();

		return;
	}

%>

 likeAction.jsp

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

<%@ page import="user.UserDAO"%>
<%@ page import="evaluation.EvaluationDAO"%>
<%@ page import="likey.LikeyDAO"%>
<%@ page import="java.io.PrintWriter"%>

<%!
// 해당사이트에 접속한 아이피 주소를 알아내는 함수 
public static String getClientIP(HttpServletRequest request) {

    String ip = request.getHeader("X-FORWARDED-FOR"); 
	//프록시 서버를 사용한 사용자라도 아이피를 가져올 수 있게 만들어준다.
    if (ip == null || ip.length() == 0) {
        ip = request.getHeader("Proxy-Client-IP");
    }

    if (ip == null || ip.length() == 0) {
        ip = request.getHeader("WL-Proxy-Client-IP");
    }
	
    if (ip == null || ip.length() == 0) {
    	// 아이피 주소를 가져온다.
        ip = request.getRemoteAddr() ;
    }
    return ip;
}

%>

<%

	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 evaluationID = null;

	if(request.getParameter("evaluationID") != null) {

		evaluationID = (String) request.getParameter("evaluationID");

	}

	EvaluationDAO evaluationDAO = new EvaluationDAO();

	LikeyDAO likeyDAO = new LikeyDAO();
	
	//라이크 함수를 실행시킬 수 있도록 한다. 아이피 주소 까지 담아준다.
	int result = likeyDAO.like(userID, evaluationID, getClientIP(request));

	if (result == 1) {

		result = evaluationDAO.like(evaluationID);

		if (result == 1) {

			PrintWriter script = response.getWriter();

			script.println("<script>");

			script.println("alert('추천이 완료되었습니다.');");
			script.println("location.href='index.jsp'");
			script.println("</script>");

			script.close();

			return;

		} else {

			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("alert('이미 추천을 누른 글입니다.');");
		script.println("history.back();");
		script.println("</script>");

		script.close();

		return;

	}

%>

 

XSS 방어 (보안요소 추가)

	// 사용자가 한 개의 글을 쓰게 해주는 함수 
	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().replaceAll("<", "&lt;").replaceAll(">", " &gt;").replaceAll("\r\n", "<br>"));
			pstmt.setString(2, evaluationDTO.getLectureName().replaceAll("<", "&lt;").replaceAll(">", " &gt;").replaceAll("\r\n", "<br>"));
			pstmt.setString(3, evaluationDTO.getProfessorName().replaceAll("<", "&lt;").replaceAll(">", " &gt;").replaceAll("\r\n", "<br>"));
			pstmt.setInt(4, evaluationDTO.getLectureYear());
			pstmt.setString(5, evaluationDTO.getSemesterDivide().replaceAll("<", "&lt;").replaceAll(">", " &gt;").replaceAll("\r\n", "<br>"));
			pstmt.setString(6, evaluationDTO.getLectureDivide().replaceAll("<", "&lt;").replaceAll(">", " &gt;").replaceAll("\r\n", "<br>"));
			pstmt.setString(7, evaluationDTO.getEvaluationTitle().replaceAll("<", "&lt;").replaceAll(">", " &gt;").replaceAll("\r\n", "<br>"));
			pstmt.setString(8, evaluationDTO.getEvaluationContent().replaceAll("<", "&lt;").replaceAll(">", " &gt;").replaceAll("\r\n", "<br>"));
			pstmt.setString(9, evaluationDTO.getTotalScore().replaceAll("<", "&lt;").replaceAll(">", " &gt;").replaceAll("\r\n", "<br>"));
			pstmt.setString(10, evaluationDTO.getCreditScore().replaceAll("<", "&lt;").replaceAll(">", " &gt;").replaceAll("\r\n", "<br>"));
			pstmt.setString(11, evaluationDTO.getComfortableScore().replaceAll("<", "&lt;").replaceAll(">", " &gt;").replaceAll("\r\n", "<br>"));
			pstmt.setString(12, evaluationDTO.getLectureScore().replaceAll("<", "&lt;").replaceAll(">", " &gt;").replaceAll("\r\n", "<br>"));

			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; //데이터베이스 오류 
	}

 

Lecture Evaluation 완성.zip
4.59MB

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

 

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;

%>

 

SHA256.java 

package util;

import java.security.MessageDigest;

public class SHA256 {
	
	// 해쉬태그를 이용하여 메일에서 받은 코드로 인증 할 수 있도록 하는 것.
	
	//SHA256으로 해쉬 값을구하는 함수.
	public static String getSHA256(String input) {
		StringBuffer result = new StringBuffer();
		
		try {
			//사용자가 입력한 값을 알고리즘을 적용하여 반영.
			MessageDigest digest = MessageDigest.getInstance("SHA-256");
			//해킹을 방지하기 위하여 salt값을 반영해준다.
			byte[] salt = "Hello! This is salt.".getBytes();
			digest.reset();
			digest.update(salt);
			//해쉬를 적용한 값을 chars에 담아준다.
			byte[] chars = digest.digest(input.getBytes("UTF-8"));
			//문자열 형태로 만들어준다.
			for(int i = 0; i < chars.length; i++) {
				String hex = Integer.toHexString(0xff & chars[i]);
				//한자리 수인 경우 0을 붙여서 16진수로 만들어 준다.
				if(hex.length() == 1) result.append("0");
				//윗 결과를 반환해준다. 
				result.append(hex);
			}
			
		}catch (Exception e) {
			e.printStackTrace();
		}
		return result.toString();
	}

}

 

Gmail.java

Mail 라이브러리 다운로드 사이트: http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-eeplat-419426.html#javamail-1.4.7-oth-JPR

Activation 라이브러리 다운로드 사이트: http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-java-plat-419418.html#jaf-1.1-fr-oth-JPR
출처: https://ndb796.tistory.com/40 [안경잡이개발자]

 

라이브러리들을 폴더 안에 넣어준다.

 

jaf-1_1_1.zip
0.36MB
javamail1_4_7.zip
2.30MB

 

package util;

import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;

//인증수행을 도와주는 클래스를 상속 받는다.
public class Gmail extends Authenticator {
	
	//자신의 구글 아이디와 비밀번호를 넣어준다.
    @Override
    protected PasswordAuthentication getPasswordAuthentication() {

        return new PasswordAuthentication("실제아이디","실제비밀번호");
    }
}

구글 계정 설정에서 앱설정을 사용함으로 바꿔준다.

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;
	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();

		}

	}

%>

DB접속을 위해 라이브러리를 넣어준다.
mysql-connector-java-5.1.42-bin.jar
0.95MB
mysql-connector-java-8.0.19.zip
4.41MB

 

결과값 확인

회원가입을 해주고
정상적으로 다음 페이지로 넘어가면서 성공한 것을 알려준다.
다시한번 같은 것을 입력하면 경고창이 뜨는 것을 확인 할 수 있다.
정상적으로 값이 들어간 것을 확인 할 수 있다.

 

emailCheckAction.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>

      <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="userLogin.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-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>

 

emailCheckAction.jsp: 사용자가 이메일 인증을 하게 되면 그에 대한 정보를 처리하는 페이지

<%@page import="java.io.PrintWriter"%>
<%@page import="util.SHA256"%>
<%@page import="user.UserDAO"%>

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

<%

	request.setCharacterEncoding("UTF-8");
	//사용자로부터 코드를 받는다.
	String code = request.getParameter("code");

	UserDAO userDAO = new UserDAO();
	//사용자로부터 아이디를 받는다.
	String userID = null;
	//사용자가 로그인 한 상태라면.
	if(session.getAttribute("userID") != null) {
		//변수를 초기화준다. 세션 값은 오브젝트 값으로 반환하기 때문에 String으로 형변환을 시켜줘야한다.
		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;

	}
	
	//현재 사용자의 이메일 주소를 받는다.
	String userEmail = userDAO.getUserEmail(userID);
	//현재 사용자가 보낸 코드가 실제 코드와 같는지 일치하는지 확인한다.
	boolean rightCode = (new SHA256().getSHA256(userEmail).equals(code)) ? true : false;
	//일치 한다면.
	if(rightCode == true) {

		userDAO.setUserEmailChecked(userID);

		PrintWriter script = response.getWriter();

		script.println("<script>");
		script.println("alert('인증에 성공했습니다.');");
		script.println("location.href = 'index.jsp'");
		script.println("</script>");

		script.close();		

		return;

	} else {

		PrintWriter script = response.getWriter();

		script.println("<script>");
		script.println("alert('유효하지 않은 코드입니다.');");
		script.println("location.href = 'index.jsp'");
		script.println("</script>");

		script.close();		

		return;

	}
 %>

mysql 접속

mysql.server start

mysql -uroot -p

create database LectureEvaluation;

use LectureEvaluation;

//회원가입 테이블
create table user(
userID varchar(20),
userPassword varchar(64),
userEmail varchar(50),
userEmailHash varchar(64), //이메일 확인(메일을 보내서 이 이메일이 확실히 한지 확인 될 수 있는지 확인한다.)
userEmailChecked boolean //이메일 인증을 완료했는지 확인하는 것
);

desc user; //필드확인

겹치지 않도록 PK설정
alter table user add primary key(userID);

//강의평가작성 테이블
create table evaluation(
evaluationID int primary key auto_increment,
userID varchar(20),
lectureName varchar(50),
professorName varchar(20),
lectureYear int,
semesterDivide varchar(20),
lectureDivide varchar(10),
evaluationTitle varchar(50),
evaluationContent varchar(2048),
titalScore varchar(5),
creditScore varchar(5),
comfortableScore varchar(5),
lectureScore varchar(5),
likeCount int
);

desc evaluation;

//추천 테이블
create table likey(
userID varchar(20),
evaluationID int,
userIP varchar(50)
);

commit;

DTO 구축

생성자 만들기

UserDTO.java 만들기

package user;

public class UserDTO {
	
	private String UserID;
	private String UserPassword;
	private String UserEmail;
	private String UserEmailHash;
	private boolean userEmailChecked;
	
	public  UserDTO() {
		//기본 생성자 (초기화 하는 함수)
	}
	
	public UserDTO(String userID, String userPassword, String userEmail, String userEmailHash,
			boolean userEmailChecked) {
		super();
		UserID = userID;
		UserPassword = userPassword;
		UserEmail = userEmail;
		UserEmailHash = userEmailHash;
		this.userEmailChecked = userEmailChecked;
	}
	
	public String getUserID() {
		return UserID;
	}
	public void setUserID(String userID) {
		UserID = userID;
	}
	public String getUserPassword() {
		return UserPassword;
	}
	public void setUserPassword(String userPassword) {
		UserPassword = userPassword;
	}
	public String getUserEmail() {
		return UserEmail;
	}
	public void setUserEmail(String userEmail) {
		UserEmail = userEmail;
	}
	public String getUserEmailHash() {
		return UserEmailHash;
	}
	public void setUserEmailHash(String userEmailHash) {
		UserEmailHash = userEmailHash;
	}
	public boolean isUserEmailChecked() {
		return userEmailChecked;
	}
	public void setUserEmailChecked(boolean userEmailChecked) {
		this.userEmailChecked = userEmailChecked;
	}

}

 

UserDAO.java

package user;

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


import util.DatabaseUtil;

public class UserDAO {
	
	//실질적으로 데이터베이스에 접근할 수 있도록 해준다.
	
	// 로그인을 시도하는 함수 
	   public int login(String userID, String userPassword) {
			String SQL = "SELECT userPassword FROM USER WHERE userID = ?";
					Connection conn = null;
					PreparedStatement pstmt = null;
					ResultSet rs = null;

					try {
						//연결하는 객체 
						conn = DatabaseUtil.getConnection();
						//conn객체를 가지고 와서 sql 문장을 실행 시켜줄 준비를 한다.
						pstmt = conn.prepareStatement(SQL);
						//받아온 ID 값을 ?에 넣어준다.
						pstmt.setString(1, userID); 
						//실행한 결과를 rs에 넣어준다.
						rs = pstmt.executeQuery(); // 결과를 조회 하는 것 꼭 rs와 같이 사용한다.
						//실행한 후 만약 값이 있다면, 
						if (rs.next()) { 
							//아이디가 있다면, 결과(비번)을 받아서 같다면, 
							if(rs.getString(1).equals(userPassword)) {
								return 1;// 로그인 성공.
							}
							else
								return 0;//비밀번호가 불일치 한다. 
						}
						return -1; //아이디가 없다..
					} 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; //데이터베이스 오류 
	   		}//login end

	// 회원가입을 시도하는 함수 
	   public int join(UserDTO user) {
				String SQL = "INSERT INTO USER VALUES(?, ?, ?, ?, false)";
					Connection conn = null;
					PreparedStatement pstmt = null;
					ResultSet rs = null;

					try {
						//연결하는 객체 
						conn = DatabaseUtil.getConnection();
						//conn객체를 가지고 와서 sql 문장을 실행 시켜줄 준비를 한다.
						pstmt = conn.prepareStatement(SQL);
						//받아온 ID 값을 ?에 넣어준다.
						pstmt.setString(1,  user.getUserID());
						pstmt.setString(2,  user.getUserPassword());
						pstmt.setString(3,  user.getUserEmail());
						pstmt.setString(4,  user.getUserEmailHash());
						return pstmt.executeUpdate(); //insert , 삭제는 이것을 사용해서 처리한다.실제로 영향을 받은 데이터 개수를 반환한다. 성공하면 1이상을 반환한다.
						// 0 이상의 숫자가 나오기 떄문에 성공
					} 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 -1; //프라이머리키가 걸려있어서 -1을 반환한다.
	   		}//join end
	   
	   // 이메일을 검증하는 함수 
	   public boolean getUserEmailChecked(String userID) {
		   		//사용자의 아이디 값을 받아서 인증을 받았는지 확인한다.
				String SQL = "select userEmailChecked from user where userID = ?";
					Connection conn = null;
					PreparedStatement pstmt = null;
					ResultSet rs = null;

					try {
						//연결하는 객체 
						conn = DatabaseUtil.getConnection();
						//conn객체를 가지고 와서 sql 문장을 실행 시켜줄 준비를 한다.
						pstmt = conn.prepareStatement(SQL);
						//받아온 ID 값을 ?에 넣어준다.
						pstmt.setString(1, userID);
						//실행 결과 값을 rs	에 받아서 저장한다.
						rs = pstmt.executeQuery(); 
						//실행한 후 만약 값이 있다면, 
						if (rs.next()) { 
							//
							return rs.getBoolean(1); //userEmailChecked의 값을 반환하도록 만든다.
						}
						
					} 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 false; //boolean이기 떄문에 true or false 값을 반환한다. 데이터베이스 오류 
	   		}//getUserEmailChecked end
	   
	   //회원의 이메일 자체를 반환해주는 함수 
	   public String getUserEmail(String userID) {
		 //사용자의 아이디 값을 받아서 인증을 받았는지 확인한다.
			String SQL = "select userEmail from user where userID = ?";
				Connection conn = null;
				PreparedStatement pstmt = null;
				ResultSet rs = null;

				try {
					//연결하는 객체 
					conn = DatabaseUtil.getConnection();
					//conn객체를 가지고 와서 sql 문장을 실행 시켜줄 준비를 한다.
					pstmt = conn.prepareStatement(SQL);
					//받아온 ID 값을 ?에 넣어준다.
					pstmt.setString(1, userID);
					//실행 결과 값을 rs	에 받아서 저장한다.
					rs = pstmt.executeQuery(); 
					//실행한 후 만약 값이 있다면, 
					if (rs.next()) { 
						//
						return rs.getString(1); //userEmailChecked의 값을 반환하도록 만든다.
					}
					
				} 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 null; //boolean이기 떄문에 true or false 값을 반환한다. 데이터베이스 오류 
		   
	   }
	   
	   
	// 이메일을 인증을 완료하는 함수 
	   public boolean setUserEmailChecked(String userID) {
		   		//특정한 아이디 값을 가지는 사용자로 하여금 이메일 인증을 해주는 것 
				String SQL = "update user set userEmailChecked = true where userID = ?";
					Connection conn = null;
					PreparedStatement pstmt = null;
					ResultSet rs = null;

					try {
						//연결하는 객체 
						conn = DatabaseUtil.getConnection();
						//conn객체를 가지고 와서 sql 문장을 실행 시켜줄 준비를 한다.
						pstmt = conn.prepareStatement(SQL);
						//받아온 ID 값을 ?에 넣어준다.
						pstmt.setString(1, userID);
						pstmt.executeUpdate();
						return true; //이미 인증이 된 상태라도 한번더 확인해준다.
					} 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 false; //boolean이기 떄문에 true or false 값을 반환한다. 데이터베이스 오류 
	   		}//setUserEmailChecked end
}

 

DatabaseUtil.java

package util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;


public class DatabaseUtil {
	
	public static Connection getConnection() {
		try {
			String dbURL ="jdbc:mysql://localhost:3306/LectureEvaluation?serverTimezone=UTC";
			String dbID = "root";
			String dbPassword = "1234";
			Class.forName("com.mysql.jdbc.Driver");
			return DriverManager.getConnection(dbURL,dbID,dbPassword);
		}catch (Exception e) {
			e.printStackTrace();
		}
		return null;
		
	}
		
}

로그인폼과 회원가입폼

userJogin.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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">
              <a class="dropdown-item" href="userLogin.jsp">로그인</a>
              <a class="dropdown-item" href="userJoin.jsp">회원가입</a>
              <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"%>
<!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">
              <a class="dropdown-item" href="userLogin.jsp">로그인</a>
              <a class="dropdown-item" href="userJoin.jsp">회원가입</a>
              <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>

index.jsp에 이동 경로를 수정해준다.

 

결과물

Untitled.zip
0.11MB

mysql -uroot -p

create database tutorial;

use tutorial;
show tables;

create table user (
userID varchar(20),
userPassword varchar(64)
);

 insert into user values ('1','123');
 select * from user;
 select userID from user;
 
 권한설정 에러 시
 use mysql;
 select host,user from user;
 create user 'root'@'%' identified by '1234';
 use tutorial;
 alter user 'root'@'localhost' identified with mysql_native_password by '1234';
 commit;

mysql-connector-java-5.1.42-bin.jar
0.95MB
mysql-connector-java-8.0.19.jar
2.25MB

https://offbyone.tistory.com/318

 

MySQL(MariaDB) 서버 타임존 설정하기

Java에서 MySQL 서버에 연결하니 다음과 같은 에러가 발생하였습니다. ### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql..

offbyone.tistory.com

https://lhc9138.tistory.com/63

 

mysql 8.0과 JDBC 연결

JDBC Driver 다운로드 mySQL 버전 8.0 이상에서 사용 할 수 있는 JDBC Driver를 다운로드 해야한다. 다운로드 사이트 https://dev.mysql.com/downloads/connector/j/ 여기서 각자 플랫폼에 맞는 JDBC 다운로드 * j..

lhc9138.tistory.com

package util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import com.mysql.jdbc.PreparedStatement;

public class DatabaseUtil {
	
	public static Connection getConnection() {
		try {
        	// 추가 
			String dbURL ="jdbc:mysql://localhost:3306/tutorial?serverTimezone=UTC";
			String dbID = "root";
			String dbPassword = "1234";
			Class.forName("com.mysql.jdbc.Driver");
			return DriverManager.getConnection(dbURL,dbID,dbPassword);
		}catch (Exception e) {
			e.printStackTrace();
		}
		return null;
		
	}
		
}

bootstrap-3.3.2-dist.zip
0.25MB

https://unpkg.com/popper.js@1.12.9/dist/umd/popper.min.js

https://hane-1.tistory.com/35

 

[jQuery] 다운로드 및 적용 방법

1. 다운로드 첫번째. 다운로드 하는 방법. 1_ 홈페이지에 접속합니다. 2_ Download jQuery를 클릭합니다. 3_ 다운로드(Download the comporessed....)를 클릭합니다. 4_ 만약 아래와 그림과 같이 문서가 출력이..

hane-1.tistory.com

https://fonts.google.com/earlyaccess

 

Google Fonts

Making the web more beautiful, fast, and open through great typography

fonts.google.com

@import url(//fonts.googleapis.com/earlyaccess/jejugothic.css);

 

 

index.jsp 폼 만들어주기 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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">
              <a class="dropdown-item" href="#">로그인</a>
              <a class="dropdown-item" href="#">회원가입</a>
              <a class="dropdown-item" href="#">로그아웃</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>

 

custom.css 만들어주기 

@import url(https://fonts.googleapis.com/earlyaccess/jejugothic.css);
@import url(https://fonts.googleapis.com/earlyaccess/nanumgothic.css);

.navbar-brand, h1,h2,h3,h4{
	font-family: 'Jeju Gothic';
}
h5 {
	font-family: 'Jeju Gothic';
	font-size: 18px;
}
body {
	font-family: 'Nanum Gothic';
}

 

결과물

 

 

mysql 게시판 DB 구축하기

use bbs;

create table bbs(
bbsID INT,
bbsTitle varchar(50),
userID varchar(20),
bbsDate datetime,
bbsContent varchar(2048),
bbsAvailable int, //현재 글이 삭제 되었는지 알려준다. 1: 삭제되지않은 글/ 0: 삭제 된 글
primary key(bbsID)
);

 

bbs.java (데이터베이스 접근 객체 만들기/ 자바빈즈 만들기)

 

package bbs;

public class Bbs {
private int bbsID;
private String bbsTitle;
private String userID;
private String bbsDate;
private String bbsContent;
private int bbsAvailable;

public int getBbsID() {
	return bbsID;
}
public void setBbsID(int bbsID) {
	this.bbsID = bbsID;
}
public String getBbsTitle() {
	return bbsTitle;
}
public void setBbsTitle(String bbsTitle) {
	this.bbsTitle = bbsTitle;
}
public String getUserID() {
	return userID;
}
public void setUserID(String userID) {
	this.userID = userID;
}
public String getBbsDate() {
	return bbsDate;
}
public void setBbsDate(String bbsDate) {
	this.bbsDate = bbsDate;
}
public String getBbsContent() {
	return bbsContent;
}
public void setBbsContent(String bbsContent) {
	this.bbsContent = bbsContent;
}
public int getBbsAvailable() {
	return bbsAvailable;
}
public void setBbsAvailable(int bbsAvailable) {
	this.bbsAvailable = bbsAvailable;
}
}

글쓰기

bbsDAO.java(글쓰기 기능 구현하기)

package bbs;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

public class BbsDAO {
	private Connection conn;
	private ResultSet rs;

	public BbsDAO() {
		try {
			String dbURL = "jdbc:mysql://localhost:3306/BBS?serverTimezone=UTC";
			String dbID = "root";
			String dbPassword = "920424";
			Class.forName("com.mysql.jdbc.Driver");
			conn = DriverManager.getConnection(dbURL, dbID, dbPassword);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	//현재의 시간을 가져오는 것 
	public String getDate() {
		String SQL = "SELECT NOW()";
		try {
			PreparedStatement pstmt = conn.prepareStatement(SQL);
			rs = pstmt.executeQuery();
			if (rs.next()) {
				//현재의 날짜를 그대로 가져올 수 있게 한다.
				return rs.getString(1);
			} 
		}catch (Exception e){
			e.printStackTrace();
		}
		return ""; // 데이터베이스 오류 
	}
	
	//아이디를 가져오는 것 
	public int getNext() {
		//제일 마지막에 쓰인 글을 가져오는 것 
		String SQL = "SELECT bbsID FROM BBS ORDER BY bbsID DESC";
		try {
			PreparedStatement pstmt = conn.prepareStatement(SQL);
			rs = pstmt.executeQuery();
			if (rs.next()) {
				return rs.getInt(1)+1; // 그다음 게시글이 나오게 하는 것 
			}
			return 1; // 첫 번째 게시물인 경우 
		}catch (Exception e){
			e.printStackTrace();
		}
		return -1; //데이터베이스 오류 
	}
	
	//글쓰기 기능 
	public int  write(String bbsTitle, String userID, String bbsContent) {
		String SQL = "INSERT INTO BBS VALUES (?, ?, ?, ?, ?, ?)";
		try {
			PreparedStatement pstmt = conn.prepareStatement(SQL);
		
			pstmt.setInt(1, getNext()); // 다음번에 쓰기게 될 게시물의 번호 
			pstmt.setString(2, bbsTitle);
			pstmt.setString(3, userID);
			pstmt.setString(4, getDate());
			pstmt.setString(5, bbsContent);
			pstmt.setInt(6, 1); // 삭제가 안된 글이기 때문에 1을 넣어준다.
			
			return pstmt.executeUpdate();
		} catch (Exception e){
			e.printStackTrace();
		}
		return -1; //데이터베이스 오류 
	}
}

 

write.jsp만들기(글쓰기 폼)

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
	<%@ page import="java.io.PrintWriter" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width", initial-scale="1">
<link rel="stylesheet" href="css/bootstrap.css">
<title>JSP 게시판 웹 사이트</title>
</head>
<body>
<%
String userID = null;
if(session.getAttribute("userID") != null){
	userID = (String) session.getAttribute("userID");
}
%>

	<nav class="navbar navbar-default">
		<div class="navbar-header">
			<button type="button" class="navbar-toggle collapsed"
				data-toggle="collapse" data-target="#bs-example-navbar-collapse-1"
				aria-expanded="false">
				<span class="icon-bar"></span> <span class="icon-bar"></span> <span
					class="icon-bar"></span>
			</button>
			<a class="navbar-brand" href="main.jsp">JSP 게시판 웹 사이트</a>
		</div>
		<div class="collapse navbar-collapse"
			id="bs-example-navbar-collapse-1">
			<ul class="nav navbar-nav">
				<li><a href="main.jsp">메인</a>
				<li class="active"><a href="bbs.jsp">게시판</a>
			</ul>
			<%
			if(userID == null) {
			%>
			<ul class="nav navbar-nav navbar-right">
				<li class="dropdown"><a href="#" class="dropdown-toggle"
					data-toggle="dropdown" role="button" aria-haspopup="true"
					aria-expanded="false">접속하기<span class="caret"></span></a>
					<ul class="dropdown-menu">
						<li><a href="login.jsp">로그인</a></li>
						<li><a href="join.jsp">회원가입</a></li>
					</ul></li>
			</ul>

			<%
			  } else {
						%>

							<ul class="nav navbar-nav navbar-right">
				<li class="dropdown"><a href="#" class="dropdown-toggle"
					data-toggle="dropdown" role="button" aria-haspopup="true"
					aria-expanded="false">접속하기<span class="caret"></span></a>
					<ul class="dropdown-menu">
						<li><a href="logoutAction.jsp">로그아웃</a></li>
					</ul></li>
			</ul>
			<%
			}
			%>
		</div>
		
	</nav>
	<div class="container">
	<div class="row">
	<form method="post" action="writeAction.jsp">


	<table class="table table-striped" style="text-align:center; border:1px solid #dddddd">
	
			<thead>
				<tr>
					<th colspan="2" style="background-color:#eeeeee; text-align:center;">게시판 글쓰기 양식</th>
				</tr>
			</thead>
			
			<tbody>
				<tr>
					<td><input type="text" class="form-control" placeholder="글 제목" name="bbsTitle" maxlength="50"></td>
				</tr>
		
				<tr>
					<td><textarea class="form-control" placeholder="글 내용" name="bbsContent" maxlength="2048" style="height: 350px;"></textarea></td>
				</tr>
			</tbody>
			
	</table>
	
		<input type="submit" class="btn btn-primary pull-right" value="글 쓰기">
		
	</form>
	</div>
	</div>
	<script src="http://code.jquery.com/jquery-1.10.2.js"></script>
	<script src="js/bootstrap.js"></script>
</body>
</html>

 

writeAction.jsp 만들기(글쓰기 기능을 처리하는 것)

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!--게시 자바빈즈 가져오기  -->
<%@ page import="bbs.BbsDAO"%>
<%@ page import="java.io.PrintWriter"%>
<%
	request.setCharacterEncoding("UTF-8");
%>
<!-- 하나의 게시글 정보를 담을 수 있게한다. -->
<jsp:useBean id="bbs" class="bbs.Bbs" scope="page" />
<jsp:setProperty name="bbs" property="bbsTitle" />
<jsp:setProperty name="bbs" property="bbsContent" />

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP 게시판 웹 사이트</title>
</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 = 'login.jsp'");
		script.println("</script>");
	} else {//로그인이 되어있는 경우 
		//어떠한 정보를 입력하지 않았다면
		if (bbs.getBbsTitle() == null || bbs.getBbsContent() == null) {
			PrintWriter script = response.getWriter();
			script.println("<script>");
			script.println("alert('입력이 안 된 사항이 있습니다.')");
			script.println("history.back()");
			script.println("</script>");
		} else { // 정보가 입력 되었다면, 
			BbsDAO bbsDAO = new BbsDAO();
			//데이터베이스에 글을 작성하게 해준다.
			int result = bbsDAO.write(bbs.getBbsTitle(), userID, bbs.getBbsContent());
			//만약 리턴 값이 -1이라면 
			if (result == -1) {
				PrintWriter script = response.getWriter();
				script.println("<script>");
				script.println("alert('글쓰기에 실패하였습니다.')");
				script.println("history.back()");
				script.println("</script>");
			}
			else {//성공적으로 작성 된 경우.
				PrintWriter script = response.getWriter();
				script.println("<script>");
				script.println("location.href='bbs.jsp'");
				script.println("</script>");
			}
		}
	}
	%>
</body>
</html> 

 

게시판 목록

bbsDAO.java 추가하기 (게시판 글 목록 구현기능)

package bbs;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

public class BbsDAO {
	private Connection conn;
	private ResultSet rs;

	public BbsDAO() {
		try {
			String dbURL = "jdbc:mysql://localhost:3306/BBS?serverTimezone=UTC";
			String dbID = "root";
			String dbPassword = "920424";
			Class.forName("com.mysql.jdbc.Driver");
			conn = DriverManager.getConnection(dbURL, dbID, dbPassword);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	//현재의 시간을 가져오는 것 
	public String getDate() {
		String SQL = "SELECT NOW()";
		try {
			PreparedStatement pstmt = conn.prepareStatement(SQL);
			rs = pstmt.executeQuery();
			if (rs.next()) {
				//현재의 날짜를 그대로 가져올 수 있게 한다.
				return rs.getString(1);
			} 
		}catch (Exception e){
			e.printStackTrace();
		}
		return ""; // 데이터베이스 오류 
	}
	
	//아이디를 가져오는 것 
	public int getNext() {
		//제일 마지막에 쓰인 글을 가져오는 것 
		String SQL = "SELECT bbsID FROM BBS ORDER BY bbsID DESC";
		try {
			PreparedStatement pstmt = conn.prepareStatement(SQL);
			rs = pstmt.executeQuery();
			if (rs.next()) {
				return rs.getInt(1)+1; // 그다음 게시글이 나오게 하는 것 
			}
			return 1; // 첫 번째 게시물인 경우 
		}catch (Exception e){
			e.printStackTrace();
		}
		return -1; //데이터베이스 오류 
	}
	
	//글쓰기 기능 
	public int  write(String bbsTitle, String userID, String bbsContent) {
		String SQL = "INSERT INTO BBS VALUES (?, ?, ?, ?, ?, ?)";
		try {
			PreparedStatement pstmt = conn.prepareStatement(SQL);
		
			pstmt.setInt(1, getNext()); // 다음번에 쓰기게 될 게시물의 번호 
			pstmt.setString(2, bbsTitle);
			pstmt.setString(3, userID);
			pstmt.setString(4, getDate());
			pstmt.setString(5, bbsContent);
			pstmt.setInt(6, 1); // 삭제가 안된 글이기 때문에 1을 넣어준다.
			
			return pstmt.executeUpdate();
		} catch (Exception e){
			e.printStackTrace();
		}
		return -1; //데이터베이스 오류 
	}
	
	//게시판 목록 보여주기 기능 
	public ArrayList<Bbs> getList(int pageNumber) {
		//특정한 숫자보다 작을 때, 삭제되지 않았을 때, 위에서 열개까지만 가져온다.
		String SQL = "SELECT * FROM BBS WHERE bbsID < ? AND bbsAvailable = 1 ORDER BY bbsID DESC LIMIT 10";
		//인스턴스를 보관할 수 있는 리스트를 만들어준다.
		ArrayList<Bbs> list = new ArrayList<Bbs>();
		try {
			PreparedStatement pstmt = conn.prepareStatement(SQL);
			// 다음으로 작성 될 글 번호(getnext) 6이라는 값이 담긴다. 
			pstmt.setInt(1, getNext() - (pageNumber - 1) * 10);
			rs = pstmt.executeQuery();
			
			while (rs.next()) {
				Bbs bbs = new Bbs();//인스턴스를 만들어준다.
				bbs.setBbsID(rs.getInt(1));
				bbs.setBbsTitle(rs.getString(2));
				bbs.setUserID(rs.getString(3));
				bbs.setBbsDate(rs.getString(4));
				bbs.setBbsContent(rs.getString(5));
				bbs.setBbsAvailable(rs.getInt(6));
				list.add(bbs); //해당인스턴트를 담아서 반환한다.
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return list; //담겨진 인스턴트를 반환한다.
	}
	
	//만약 게시판이 10단위로 끊긴다면 다음 페이지가 없다는 것을 뜻한다.
	//페이징 처리 함수 
	public boolean nextPage(int pageNumber) {
		String SQL = "SELECT * FROM BBS WHERE bbsID < ? AND bbsAvailable =1";
		ArrayList<Bbs> list = new ArrayList<Bbs>();
		try {
			PreparedStatement pstmt = conn.prepareStatement(SQL);
			pstmt.setInt(1, getNext() - (pageNumber - 1) * 10);
			rs = pstmt.executeQuery();
			if (rs.next()) {
				return true; //다음페이지로 넘어갈 수 있다.
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return false; //다음페이지로 넘어갈 수 없다. 
	}
}

bbs.jsp(글 목록 폼)만들기

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
	<%@ page import="java.io.PrintWriter" %>
	<%@ page import="bbs.BbsDAO" %>
	<%@ page import="bbs.Bbs" %>
	<%@ page import="java.util.ArrayList" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width", initial-scale="1">
<link rel="stylesheet" href="css/bootstrap.css">
<title>JSP 게시판 웹 사이트</title>

<!-- 디자인을 수정한다. -->
<style>
	a, a:hover {
		color:#000000;
		text-decoration:none;}
</style>

</head>

<body>
<%
//세션 
String userID = null;
if(session.getAttribute("userID") != null){
	userID = (String) session.getAttribute("userID");
}
//현재 게시판의 몇번째인지 알려준다.
int pageNumber = 1; //기본적으로 1페이지라는 것을 알려준다.
if(request.getParameter("pageNumber") != null) {
	//정수 형으로 바꿔줘야한다.
	pageNumber = Integer.parseInt(request.getParameter("pageNumber"));
}
%>

	<nav class="navbar navbar-default">
@@ -77,13 +90,34 @@ if(session.getAttribute("userID") != null){
	<th style="background-color:#eeeeee; text-align:center;">작성일</th>
	</tr>
	</thead>
	
	<tbody>
	<%
		BbsDAO bbsDAO = new BbsDAO();
		ArrayList<Bbs> list = bbsDAO.getList(pageNumber); //현재의 페이지에서 가져오는 리스트/게시물 목록 
		for(int i = 0; i < list.size(); i++){
	%>
	
	<tr>
		<!-- 현재 게시물을 디비에서 가져온다.  -->
		<td><%= list.get(i).getBbsID() %></td>
		<td><a href="view.jsp?bbsID=<%= list.get(i).getBbsID() %>"><%= list.get(i).getBbsTitle().replaceAll(" ", "&nbsp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll("\n", "<br>") %></a></td>
		<td><%= list.get(i).getUserID() %></td>
		<!-- substring : 필요한 정보만 잘라준다. -->
		<td><%= list.get(i).getBbsDate().substring(0,11) + list.get(i).getBbsDate().substring(11,13)+"시 "+list.get(i).getBbsDate().substring(14,16)+" 분" %></td>
	</tr>
	
	<%
	}
	%>
	</tbody>
	
	<!-- 다음페이지와 이전페이지를 이동하는 부분  -->
	</table>
	<%
	//페이지 넘버가 1이 아니라면 
	if(pageNumber != 1){
	%>
	<!-- 이전페이지로 갈 수 있게 한다. -->
	<a href="bbs.jsp?pageNumber=<%=pageNumber - 1%>" class="btn btn-success btn-arrow-left">이전</a>
	<%
	//다음페이지가 존재한다면.
	} if (bbsDAO.nextPage(pageNumber +1)){
	%>
	<!-- 다음페이지로 넘어갈 수 있게 한다. -->
	<a href="bbs.jsp?pageNumber=<%=pageNumber + 1 %>" class="btn btn-success btn-arrow-left">다음</a>
	<%
	}
	%>
	<a href="write.jsp" class="btn btn-primary pull-right">글쓰기</a>
	</div>
	</div>

 

글 상세보기 구현

bbsDAO.java (글 상세보기 기능 구현)

package bbs;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

public class BbsDAO {
	private Connection conn;
	private ResultSet rs;

	public BbsDAO() {
		try {
			String dbURL = "jdbc:mysql://localhost:3306/BBS?serverTimezone=UTC";
			String dbID = "root";
			String dbPassword = "920424";
			Class.forName("com.mysql.jdbc.Driver");
			conn = DriverManager.getConnection(dbURL, dbID, dbPassword);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	//현재의 시간을 가져오는 것 
	public String getDate() {
		String SQL = "SELECT NOW()";
		try {
			PreparedStatement pstmt = conn.prepareStatement(SQL);
			rs = pstmt.executeQuery();
			if (rs.next()) {
				//현재의 날짜를 그대로 가져올 수 있게 한다.
				return rs.getString(1);
			} 
		}catch (Exception e){
			e.printStackTrace();
		}
		return ""; // 데이터베이스 오류 
	}
	
	//아이디를 가져오는 것 
	public int getNext() {
		//제일 마지막에 쓰인 글을 가져오는 것 
		String SQL = "SELECT bbsID FROM BBS ORDER BY bbsID DESC";
		try {
			PreparedStatement pstmt = conn.prepareStatement(SQL);
			rs = pstmt.executeQuery();
			if (rs.next()) {
				return rs.getInt(1)+1; // 그다음 게시글이 나오게 하는 것 
			}
			return 1; // 첫 번째 게시물인 경우 
		}catch (Exception e){
			e.printStackTrace();
		}
		return -1; //데이터베이스 오류 
	}
	
	//글쓰기 기능 
	public int  write(String bbsTitle, String userID, String bbsContent) {
		String SQL = "INSERT INTO BBS VALUES (?, ?, ?, ?, ?, ?)";
		try {
			PreparedStatement pstmt = conn.prepareStatement(SQL);
		
			pstmt.setInt(1, getNext()); // 다음번에 쓰기게 될 게시물의 번호 
			pstmt.setString(2, bbsTitle);
			pstmt.setString(3, userID);
			pstmt.setString(4, getDate());
			pstmt.setString(5, bbsContent);
			pstmt.setInt(6, 1); // 삭제가 안된 글이기 때문에 1을 넣어준다.
			
			return pstmt.executeUpdate();
		} catch (Exception e){
			e.printStackTrace();
		}
		return -1; //데이터베이스 오류 
	}
	
	//게시판 목록 보여주기 기능 
	public ArrayList<Bbs> getList(int pageNumber) {
		//특정한 숫자보다 작을 때, 삭제되지 않았을 때, 위에서 열개까지만 가져온다.
		String SQL = "SELECT * FROM BBS WHERE bbsID < ? AND bbsAvailable = 1 ORDER BY bbsID DESC LIMIT 10";
		//인스턴스를 보관할 수 있는 리스트를 만들어준다.
		ArrayList<Bbs> list = new ArrayList<Bbs>();
		try {
			PreparedStatement pstmt = conn.prepareStatement(SQL);
			// 다음으로 작성 될 글 번호(getnext) 6이라는 값이 담긴다. 
			pstmt.setInt(1, getNext() - (pageNumber - 1) * 10);
			rs = pstmt.executeQuery();
			
			while (rs.next()) {
				Bbs bbs = new Bbs();//인스턴스를 만들어준다.
				bbs.setBbsID(rs.getInt(1));
				bbs.setBbsTitle(rs.getString(2));
				bbs.setUserID(rs.getString(3));
				bbs.setBbsDate(rs.getString(4));
				bbs.setBbsContent(rs.getString(5));
				bbs.setBbsAvailable(rs.getInt(6));
				list.add(bbs); //해당인스턴트를 담아서 반환한다.
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return list; //담겨진 인스턴트를 반환한다.
	}
	
	//만약 게시판이 10단위로 끊긴다면 다음 페이지가 없다는 것을 뜻한다.
	//페이징 처리 함수 
	public boolean nextPage(int pageNumber) {
		String SQL = "SELECT * FROM BBS WHERE bbsID < ? AND bbsAvailable =1";
		ArrayList<Bbs> list = new ArrayList<Bbs>();
		try {
			PreparedStatement pstmt = conn.prepareStatement(SQL);
			pstmt.setInt(1, getNext() - (pageNumber - 1) * 10);
			rs = pstmt.executeQuery();
			if (rs.next()) {
				return true; //다음페이지로 넘어갈 수 있다.
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return false; //다음페이지로 넘어갈 수 없다. 
	}

	//글 상세보기 기능 구현 
	public Bbs getBbs(int bbsID) {
		//숫자에 해당하는 게시글을 가져온다.
		String SQL = "SELECT * FROM BBS WHERE bbsID = ?";
		ArrayList<Bbs> list = new ArrayList<Bbs>();
		try {
			PreparedStatement pstmt = conn.prepareStatement(SQL);
			pstmt.setInt(1, bbsID);
			rs = pstmt.executeQuery();
			if (rs.next()) {
				Bbs bbs = new Bbs();
				bbs.setBbsID(rs.getInt(1));
				bbs.setBbsTitle(rs.getString(2));
				bbs.setUserID(rs.getString(3));
				bbs.setBbsDate(rs.getString(4));
				bbs.setBbsContent(rs.getString(5));
				bbs.setBbsAvailable(rs.getInt(6));
				return bbs;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

}

 

view.jsp 만들기 (상세보기 페이지)

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ page import="java.io.PrintWriter" %>
<%@ page import="bbs.Bbs" %>
<%@ page import="bbs.BbsDAO" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width", initial-scale="1">
<link rel="stylesheet" href="css/bootstrap.css">
<title>JSP 게시판 웹 사이트</title>
</head>
<body>
<%
String userID = null;
if(session.getAttribute("userID") != null){
	userID = (String) session.getAttribute("userID");
}
int bbsID = 0;
if(request.getParameter("bbsID") != null){
	bbsID = Integer.parseInt(request.getParameter("bbsID"));
}
if(bbsID == 0){
	PrintWriter script = response.getWriter();
	script.println("<script>");
	script.println("alert('유효하지 않은 글입니다.')");
	script.println("location.href = 'bbs.jsp'");
	script.println("</script>");
	}
Bbs bbs = new BbsDAO().getBbs(bbsID);
%>

	<nav class="navbar navbar-default">
		<div class="navbar-header">
			<button type="button" class="navbar-toggle collapsed"
				data-toggle="collapse" data-target="#bs-example-navbar-collapse-1"
				aria-expanded="false">
				<span class="icon-bar"></span> <span class="icon-bar"></span> <span
					class="icon-bar"></span>
			</button>
			<a class="navbar-brand" href="main.jsp">JSP 게시판 웹 사이트</a>
		</div>
		<div class="collapse navbar-collapse"
			id="bs-example-navbar-collapse-1">
			<ul class="nav navbar-nav">
				<li><a href="main.jsp">메인</a>
				<li class="active"><a href="bbs.jsp">게시판</a>
			</ul>
			<%
			if(userID == null) {
			%>
			<ul class="nav navbar-nav navbar-right">
				<li class="dropdown"><a href="#" class="dropdown-toggle"
					data-toggle="dropdown" role="button" aria-haspopup="true"
					aria-expanded="false">접속하기<span class="caret"></span></a>
					<ul class="dropdown-menu">
						<li><a href="login.jsp">로그인</a></li>
						<li><a href="join.jsp">회원가입</a></li>
					</ul></li>
			</ul>

			<%
			  } else {
						%>

							<ul class="nav navbar-nav navbar-right">
				<li class="dropdown"><a href="#" class="dropdown-toggle"
					data-toggle="dropdown" role="button" aria-haspopup="true"
					aria-expanded="false">접속하기<span class="caret"></span></a>
					<ul class="dropdown-menu">
						<li><a href="logoutAction.jsp">로그아웃</a></li>
					</ul></li>
			</ul>



			<%
			}
			%>
		</div>
	</nav>
	<div class="container">
	<div class="row">



	<table class="table table-striped" style="text-align:center; border:1px solid #dddddd">
	<thead>
	<tr>
	<th colspan="3" style="background-color:#eeeeee; text-align:center;">게시판 글 보기 양식</th>
	</tr>
	</thead>
	<tbody>
	<tr>
<td style="width:20%;">글 제목</td>
<!-- replaceAll 정상적으로 공백이나 태그 내용들을 보여주는 태그 (특수문자처리기능) -->
<td colspan="2"><%= bbs.getBbsTitle().replaceAll(" ", "&nbsp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll("\n", "<br>") %></td>
</tr>
	<tr>
<td>작성자</td>
<td colspan="2"><%= bbs.getUserID() %></td>
</tr>
	<tr>
<td>작성일자</td>
<td colspan="2"><%= bbs.getBbsDate().substring(0,11) + bbs.getBbsDate().substring(11,13)+"시 "+bbs.getBbsDate().substring(14,16)+" 분" %></td>
</tr>
	<tr>
<td>내용</td>
<td colspan="2" style="min-height: 200px; text-align:left;"><%= bbs.getBbsContent().replaceAll(" ", "&nbsp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll("\n", "<br>") %></td>
</tr>
	</tbody>
	</table>
	<a href="bbs.jsp" class="btn btn-primary">목록</a>
	
	<%
	//해당 작성자가 본인이라면 수정할 수 있도록 한다. 
	if(userID != null && userID.equals(bbs.getUserID())) {
		%>
		<a href="update.jsp?bbsID=<%= bbsID %>" class="btn btn-primary">수정</a>
		<a href="deleteAction.jsp?bbsID=<%= bbsID %>" class="btn btn-primary">삭제</a>
	<%
	}
	%>
		<input type="submit" class="btn btn-primary pull-right" value="글 쓰기">

	</div>
	</div>
	<script src="http://code.jquery.com/jquery-1.10.2.js"></script>
	<script src="js/bootstrap.js"></script>
</body>
</html> 

 

글 수정 및 삭제

bbsDAO.java(글 수정 기능 추가)

package bbs;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

public class BbsDAO {
	private Connection conn;
	private ResultSet rs;

	public BbsDAO() {
		try {
			String dbURL = "jdbc:mysql://localhost:3306/BBS?serverTimezone=UTC";
			String dbID = "root";
			String dbPassword = "920424";
			Class.forName("com.mysql.jdbc.Driver");
			conn = DriverManager.getConnection(dbURL, dbID, dbPassword);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	//현재의 시간을 가져오는 것 
	public String getDate() {
		String SQL = "SELECT NOW()";
		try {
			PreparedStatement pstmt = conn.prepareStatement(SQL);
			rs = pstmt.executeQuery();
			if (rs.next()) {
				//현재의 날짜를 그대로 가져올 수 있게 한다.
				return rs.getString(1);
			} 
		}catch (Exception e){
			e.printStackTrace();
		}
		return ""; // 데이터베이스 오류 
	}
	
	//아이디를 가져오는 것 
	public int getNext() {
		//제일 마지막에 쓰인 글을 가져오는 것 
		String SQL = "SELECT bbsID FROM BBS ORDER BY bbsID DESC";
		try {
			PreparedStatement pstmt = conn.prepareStatement(SQL);
			rs = pstmt.executeQuery();
			if (rs.next()) {
				return rs.getInt(1)+1; // 그다음 게시글이 나오게 하는 것 
			}
			return 1; // 첫 번째 게시물인 경우 
		}catch (Exception e){
			e.printStackTrace();
		}
		return -1; //데이터베이스 오류 
	}
	
	//글쓰기 기능 
	public int  write(String bbsTitle, String userID, String bbsContent) {
		String SQL = "INSERT INTO BBS VALUES (?, ?, ?, ?, ?, ?)";
		try {
			PreparedStatement pstmt = conn.prepareStatement(SQL);
		
			pstmt.setInt(1, getNext()); // 다음번에 쓰기게 될 게시물의 번호 
			pstmt.setString(2, bbsTitle);
			pstmt.setString(3, userID);
			pstmt.setString(4, getDate());
			pstmt.setString(5, bbsContent);
			pstmt.setInt(6, 1); // 삭제가 안된 글이기 때문에 1을 넣어준다.
			
			return pstmt.executeUpdate();
		} catch (Exception e){
			e.printStackTrace();
		}
		return -1; //데이터베이스 오류 
	}
	
	//게시판 목록 보여주기 기능 
	public ArrayList<Bbs> getList(int pageNumber) {
		//특정한 숫자보다 작을 때, 삭제되지 않았을 때, 위에서 열개까지만 가져온다.
		String SQL = "SELECT * FROM BBS WHERE bbsID < ? AND bbsAvailable = 1 ORDER BY bbsID DESC LIMIT 10";
		//인스턴스를 보관할 수 있는 리스트를 만들어준다.
		ArrayList<Bbs> list = new ArrayList<Bbs>();
		try {
			PreparedStatement pstmt = conn.prepareStatement(SQL);
			// 다음으로 작성 될 글 번호(getnext) 6이라는 값이 담긴다. 
			pstmt.setInt(1, getNext() - (pageNumber - 1) * 10);
			rs = pstmt.executeQuery();
			
			while (rs.next()) {
				Bbs bbs = new Bbs();//인스턴스를 만들어준다.
				bbs.setBbsID(rs.getInt(1));
				bbs.setBbsTitle(rs.getString(2));
				bbs.setUserID(rs.getString(3));
				bbs.setBbsDate(rs.getString(4));
				bbs.setBbsContent(rs.getString(5));
				bbs.setBbsAvailable(rs.getInt(6));
				list.add(bbs); //해당인스턴트를 담아서 반환한다.
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return list; //담겨진 인스턴트를 반환한다.
	}
	
	//만약 게시판이 10단위로 끊긴다면 다음 페이지가 없다는 것을 뜻한다.
	//페이징 처리 함수 
	public boolean nextPage(int pageNumber) {
		String SQL = "SELECT * FROM BBS WHERE bbsID < ? AND bbsAvailable =1";
		ArrayList<Bbs> list = new ArrayList<Bbs>();
		try {
			PreparedStatement pstmt = conn.prepareStatement(SQL);
			pstmt.setInt(1, getNext() - (pageNumber - 1) * 10);
			rs = pstmt.executeQuery();
			if (rs.next()) {
				return true; //다음페이지로 넘어갈 수 있다.
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return false; //다음페이지로 넘어갈 수 없다. 
	}

	//글 상세보기 기능 구현 
	public Bbs getBbs(int bbsID) {
		//숫자에 해당하는 게시글을 가져온다.
		String SQL = "SELECT * FROM BBS WHERE bbsID = ?";
		ArrayList<Bbs> list = new ArrayList<Bbs>();
		try {
			PreparedStatement pstmt = conn.prepareStatement(SQL);
			pstmt.setInt(1, bbsID);
			rs = pstmt.executeQuery();
			if (rs.next()) {
				Bbs bbs = new Bbs();
				bbs.setBbsID(rs.getInt(1));
				bbs.setBbsTitle(rs.getString(2));
				bbs.setUserID(rs.getString(3));
				bbs.setBbsDate(rs.getString(4));
				bbs.setBbsContent(rs.getString(5));
				bbs.setBbsAvailable(rs.getInt(6));
				return bbs;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
	
	// 글수정하기 기능 
	public int update(int bbsID, String bbsTitle, String bbsContent) {
		String SQL = "update bbs set bbsTitle = ?, bbsContent = ? where bbsID = ?";
		try {
			PreparedStatement pstmt = conn.prepareStatement(SQL);
			pstmt.setString(1, bbsTitle);
			pstmt.setString(2, bbsContent);
			pstmt.setInt(3, bbsID);
			return pstmt.executeUpdate();
		} catch (Exception e){
			e.printStackTrace();
		}
		return -1; //데이터베이스 오류 
		
	}

}

 

update.jsp(글 수정 폼)

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
	<%@ page import="java.io.PrintWriter" %>
	<%@ page import="bbs.Bbs" %>
	<%@ page import="bbs.BbsDAO" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width", initial-scale="1">
<link rel="stylesheet" href="css/bootstrap.css">
<title>JSP 게시판 웹 사이트</title>
</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 = 'login.jsp'");
	script.println("</script>");
}

int bbsID = 0;
if(request.getParameter("bbsID") != null){
	bbsID = Integer.parseInt(request.getParameter("bbsID"));
}
if(bbsID == 0){
	PrintWriter script = response.getWriter();
	script.println("<script>");
	script.println("alert('유효하지 않은 글입니다.')");
	script.println("location.href = 'bbs.jsp'");
	script.println("</script>");
	}
	Bbs bbs = new BbsDAO().getBbs(bbsID);
	if (!userID.equals(bbs.getUserID())) {
		script.println("<script>");
		script.println("alert('권한이 없습니다.'.')");
		script.println("location.href = 'bbs.jsp'");
		script.println("</script>");
		
	}

%>

	<nav class="navbar navbar-default">
		<div class="navbar-header">
			<button type="button" class="navbar-toggle collapsed"
				data-toggle="collapse" data-target="#bs-example-navbar-collapse-1"
				aria-expanded="false">
				<span class="icon-bar"></span> <span class="icon-bar"></span> <span
					class="icon-bar"></span>
			</button>
			<a class="navbar-brand" href="main.jsp">JSP 게시판 웹 사이트</a>
		</div>
		<div class="collapse navbar-collapse"
			id="bs-example-navbar-collapse-1">
			<ul class="nav navbar-nav">
				<li><a href="main.jsp">메인</a>
				<li class="active"><a href="bbs.jsp">게시판</a>
			</ul>

			<ul class="nav navbar-nav navbar-right">
				<li class="dropdown"><a href="#" class="dropdown-toggle"
					data-toggle="dropdown" role="button" aria-haspopup="true"
					aria-expanded="false">접속하기<span class="caret"></span></a>
					<ul class="dropdown-menu">
						<li><a href="logoutAction.jsp">로그아웃</a></li>
					</ul></li>
			</ul>
			<%
			}
			%>
		</div>
		
	</nav>
	<div class="container">
	<div class="row">
	<form method="post" action="updateAction.jsp?bbsID=<%= bbsID%>">


	<table class="table table-striped" style="text-align:center; border:1px solid #dddddd">
	
			<thead>
				<tr>
					<th colspan="2" style="background-color:#eeeeee; text-align:center;">게시판 글 수 양식</th>
				</tr>
			</thead>
			
			<tbody>
				<tr>
					<td><input type="text" class="form-control" placeholder="글 제목" name="bbsTitle" maxlength="50" value="<%= bbs.getBbsTitle() %>"></td>
				</tr>
		
				<tr>
					<td><textarea class="form-control" placeholder="글 내용" name="bbsContent" maxlength="2048" style="height: 350px;"><%= bbs.getBbsContent() %></textarea></td>
				</tr>
			</tbody>
			
	</table>
	
		<input type="submit" class="btn btn-primary pull-right" value="글 수">
		
	</form>
	</div>
	</div>
	<script src="http://code.jquery.com/jquery-1.10.2.js"></script>
	<script src="js/bootstrap.js"></script>
</body>
</html>

 

updateAction.jsp(기능처리하기)

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!--게시 자바빈즈 가져오기  -->
<%@ page import="bbs.BbsDAO"%>
<%@ page import="java.io.PrintWriter"%>
<%
	request.setCharacterEncoding("UTF-8");
%>
<!-- 하나의 게시글 정보를 담을 수 있게한다. -->
<jsp:useBean id="bbs" class="bbs.Bbs" scope="page" />
<jsp:setProperty name="bbs" property="bbsTitle" />
<jsp:setProperty name="bbs" property="bbsContent" />

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP 게시판 웹 사이트</title>
</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 = 'login.jsp'");
		script.println("</script>");
	} 
	int bbsID = 0;
	if(request.getParameter("bbsID") != null){
		bbsID = Integer.parseInt(request.getParameter("bbsID"));
	}
	if(bbsID == 0){
		PrintWriter script = response.getWriter();
		script.println("<script>");
		script.println("alert('유효하지 않은 글입니다.')");
		script.println("location.href = 'bbs.jsp'");
		script.println("</script>");
		}
		Bbs bbs = new BbsDAO().getBbs(bbsID);
		if (!userID.equals(bbs.getUserID())) {
			script.println("<script>");
			script.println("alert('권한이 없습니다.'.')");
			script.println("location.href = 'bbs.jsp'");
			script.println("</script>");
			
		}else {//로그인이 되어있는 경우 
		//어떠한 정보를 입력하지 않았다면
		if (request.getParameter("bbsTitle") == null || request.getParameter("bbsContent") == null
			|| request.getParameter("bbsTitle").equals("") || request.getParameter("bbsContent").equals("")){
			PrintWriter script = response.getWriter();
			script.println("<script>");
			script.println("alert('입력이 안 된 사항이 있습니다.')");
			script.println("history.back()");
			script.println("</script>");
		} else { // 정보가 입력 되었다면, 
			BbsDAO bbsDAO = new BbsDAO();
			//데이터베이스에 글을 작성하게 해준다.
			int result = bbsDAO.update(bbsID, request.getParameter("bbsTitle"),request.getParameter("bbsContent"));
			//만약 리턴 값이 -1이라면 
			if (result == -1) {
				PrintWriter script = response.getWriter();
				script.println("<script>");
				script.println("alert('글 수 실패하였습니다.')");
				script.println("history.back()");
				script.println("</script>");
			}
			else {//성공적으로 작성 된 경우.
				PrintWriter script = response.getWriter();
				script.println("<script>");
				script.println("location.href='bbs.jsp'");
				script.println("</script>");
			}
		}
	}
	%>
</body>
</html> 

 

글 삭제하기

bbsDAO.java(삭제하기 기능 추가)

package bbs;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

public class BbsDAO {
	private Connection conn;
	private ResultSet rs;

	public BbsDAO() {
		try {
			String dbURL = "jdbc:mysql://localhost:3306/BBS?serverTimezone=UTC";
			String dbID = "root";
			String dbPassword = "920424";
			Class.forName("com.mysql.jdbc.Driver");
			conn = DriverManager.getConnection(dbURL, dbID, dbPassword);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	//현재의 시간을 가져오는 것 
	public String getDate() {
		String SQL = "SELECT NOW()";
		try {
			PreparedStatement pstmt = conn.prepareStatement(SQL);
			rs = pstmt.executeQuery();
			if (rs.next()) {
				//현재의 날짜를 그대로 가져올 수 있게 한다.
				return rs.getString(1);
			} 
		}catch (Exception e){
			e.printStackTrace();
		}
		return ""; // 데이터베이스 오류 
	}
	
	//아이디를 가져오는 것 
	public int getNext() {
		//제일 마지막에 쓰인 글을 가져오는 것 
		String SQL = "SELECT bbsID FROM BBS ORDER BY bbsID DESC";
		try {
			PreparedStatement pstmt = conn.prepareStatement(SQL);
			rs = pstmt.executeQuery();
			if (rs.next()) {
				return rs.getInt(1)+1; // 그다음 게시글이 나오게 하는 것 
			}
			return 1; // 첫 번째 게시물인 경우 
		}catch (Exception e){
			e.printStackTrace();
		}
		return -1; //데이터베이스 오류 
	}
	
	//글쓰기 기능 
	public int  write(String bbsTitle, String userID, String bbsContent) {
		String SQL = "INSERT INTO BBS VALUES (?, ?, ?, ?, ?, ?)";
		try {
			PreparedStatement pstmt = conn.prepareStatement(SQL);
		
			pstmt.setInt(1, getNext()); // 다음번에 쓰기게 될 게시물의 번호 
			pstmt.setString(2, bbsTitle);
			pstmt.setString(3, userID);
			pstmt.setString(4, getDate());
			pstmt.setString(5, bbsContent);
			pstmt.setInt(6, 1); // 삭제가 안된 글이기 때문에 1을 넣어준다.
			
			return pstmt.executeUpdate();
		} catch (Exception e){
			e.printStackTrace();
		}
		return -1; //데이터베이스 오류 
	}
	
	//게시판 목록 보여주기 기능 
	public ArrayList<Bbs> getList(int pageNumber) {
		//특정한 숫자보다 작을 때, 삭제되지 않았을 때, 위에서 열개까지만 가져온다.
		String SQL = "SELECT * FROM BBS WHERE bbsID < ? AND bbsAvailable = 1 ORDER BY bbsID DESC LIMIT 10";
		//인스턴스를 보관할 수 있는 리스트를 만들어준다.
		ArrayList<Bbs> list = new ArrayList<Bbs>();
		try {
			PreparedStatement pstmt = conn.prepareStatement(SQL);
			// 다음으로 작성 될 글 번호(getnext) 6이라는 값이 담긴다. 
			pstmt.setInt(1, getNext() - (pageNumber - 1) * 10);
			rs = pstmt.executeQuery();
			
			while (rs.next()) {
				Bbs bbs = new Bbs();//인스턴스를 만들어준다.
				bbs.setBbsID(rs.getInt(1));
				bbs.setBbsTitle(rs.getString(2));
				bbs.setUserID(rs.getString(3));
				bbs.setBbsDate(rs.getString(4));
				bbs.setBbsContent(rs.getString(5));
				bbs.setBbsAvailable(rs.getInt(6));
				list.add(bbs); //해당인스턴트를 담아서 반환한다.
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return list; //담겨진 인스턴트를 반환한다.
	}
	
	//만약 게시판이 10단위로 끊긴다면 다음 페이지가 없다는 것을 뜻한다.
	//페이징 처리 함수 
	public boolean nextPage(int pageNumber) {
		String SQL = "SELECT * FROM BBS WHERE bbsID < ? AND bbsAvailable =1";
		ArrayList<Bbs> list = new ArrayList<Bbs>();
		try {
			PreparedStatement pstmt = conn.prepareStatement(SQL);
			pstmt.setInt(1, getNext() - (pageNumber - 1) * 10);
			rs = pstmt.executeQuery();
			if (rs.next()) {
				return true; //다음페이지로 넘어갈 수 있다.
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return false; //다음페이지로 넘어갈 수 없다. 
	}

	//글 상세보기 기능 구현 
	public Bbs getBbs(int bbsID) {
		//숫자에 해당하는 게시글을 가져온다.
		String SQL = "SELECT * FROM BBS WHERE bbsID = ?";
		ArrayList<Bbs> list = new ArrayList<Bbs>();
		try {
			PreparedStatement pstmt = conn.prepareStatement(SQL);
			pstmt.setInt(1, bbsID);
			rs = pstmt.executeQuery();
			if (rs.next()) {
				Bbs bbs = new Bbs();
				bbs.setBbsID(rs.getInt(1));
				bbs.setBbsTitle(rs.getString(2));
				bbs.setUserID(rs.getString(3));
				bbs.setBbsDate(rs.getString(4));
				bbs.setBbsContent(rs.getString(5));
				bbs.setBbsAvailable(rs.getInt(6));
				return bbs;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
	
	// 글수정하기 기능 
	public int update(int bbsID, String bbsTitle, String bbsContent) {
		String SQL = "update bbs set bbsTitle = ?, bbsContent = ? where bbsID = ?";
		try {
			PreparedStatement pstmt = conn.prepareStatement(SQL);
			pstmt.setString(1, bbsTitle);
			pstmt.setString(2, bbsContent);
			pstmt.setInt(3, bbsID);
			return pstmt.executeUpdate();
		} catch (Exception e){
			e.printStackTrace();
		}
		return -1; //데이터베이스 오류 
		
	}
	
	//글 삭제하기
	public int delete(int bbsID) {
		String SQL = "update bbs set bbsAvailable = 0 where bbsID = ?";
		try {
			PreparedStatement pstmt = conn.prepareStatement(SQL);
			ppstmt.setInt(1, bbsID);
			return pstmt.executeUpdate();	
		}catch (Exception e){
			e.printStackTrace();
		}
		return -1; //데이터베이스 오류 
		
		
	}

}

 

deleteAction.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!--게시 자바빈즈 가져오기  -->
<%@ page import="bbs.BbsDAO"%>
<%@ page import="java.io.PrintWriter"%>
<%
	request.setCharacterEncoding("UTF-8");
%>
<!-- 하나의 게시글 정보를 담을 수 있게한다. -->
<jsp:useBean id="bbs" class="bbs.Bbs" scope="page" />
<jsp:setProperty name="bbs" property="bbsTitle" />
<jsp:setProperty name="bbs" property="bbsContent" />

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP 게시판 웹 사이트</title>
</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 = 'login.jsp'");
		script.println("</script>");
	} 
	int bbsID = 0;
	if(request.getParameter("bbsID") != null){
		bbsID = Integer.parseInt(request.getParameter("bbsID"));
	}
	if(bbsID == 0){
		PrintWriter script = response.getWriter();
		script.println("<script>");
		script.println("alert('유효하지 않은 글입니다.')");
		script.println("location.href = 'bbs.jsp'");
		script.println("</script>");
		}
		Bbs bbs = new BbsDAO().getBbs(bbsID);
		if (!userID.equals(bbs.getUserID())) {
			script.println("<script>");
			script.println("alert('권한이 없습니다.'.')");
			script.println("location.href = 'bbs.jsp'");
			script.println("</script>");
			
		}else {//로그인이 되어있는 경우 
		// 정보가 입력 되었다면, 
			BbsDAO bbsDAO = new BbsDAO();
			//데이터베이스에 글을 작성하게 해준다.
			int result = bbsDAO.delete(bbsID);
			//만약 리턴 값이 -1이라면 
			if (result == -1) {
				PrintWriter script = response.getWriter();
				script.println("<script>");
				script.println("alert('글 삭제 실패하였습니다.')");
				script.println("history.back()");
				script.println("</script>");
			}
			else {//성공적으로 작성 된 경우.
				PrintWriter script = response.getWriter();
				script.println("<script>");
				script.println("location.href='bbs.jsp'");
				script.println("</script>");
			}
		}
	
	%>
</body>
</html> 

 

옵션(글 삭제시 '정말로 삭제하겠나'라는 알림창 뜨게하기)

join.jsp (회원가입 폼 만들기)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<!-- 부트 캠프 참조 -->
<meta name="viewport" content="width=device-width", initial-scale="1">
<!--  css 폴더에 있는 것을 참조한다. -->
<link rel="stylesheet" href="css/bootstrap.css">
<title>JSP 게시판 웹 사이트</title>
</head>
<body>
	<!-- 네비게이션 구현 (바)-->
	<nav class="navbar navbar-default">
		<div class="navbar-header">
			<button type="button" class="navbar-toggle collapsed"
				data-toggle="collapse" data-target="#bs-example-navbar-collapse-1"
				aria-expanded="false">
				<span class="icon-bar"></span>
				<span class="icon-bar"></span>
				<span class="icon-bar"></span>
			</button>
			<a class="navbar-brand" href="main.jsp">JSP 게시판 웹 사이트</a>
		</div>
		<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
			<ul class="nav navbar-nav">
				<li><a href="main.jsp">메인</a></li>
				<li><a href="bbs.jsp">게시판</a></li>
			</ul>
			<ul  class="nav navbar-nav navbar-right">
				<li class="dropdown">
					<a href="#" class="dropdown-toggle"
						data-toggle="dropdown" role="button" aria-haspopup="true"
						aria-expended="false">접속하기<span class="caret"></span></a>
					<ul class="dropdown-menu">
						<li><a href="login.jsp">로그인</a></li>
						<li class="active"><a href="join.jsp">회원가입</a></li>
					</ul>
				</li>
			</ul>
		</div>
	</nav>
	<div class="container">
		<div class="col-lg-4"></div>
		<div class="col=lg-4">
			<div class="jumbotron" style="padding-top:20px;">
				<form method ="post" action="joinAction.jsp">
				<h3 style="text-align: center;">회원가입 화면</h3>
				
				<div class="form-group">
					<input type="text" class="form-control" placeholder="아이디" name="userID" maxlength="20">
				</div>
				
				<div class="form-group">
					<input type="password" class="form-control" placeholder="비밀번호" name="userPassword" maxlength="20">
				</div>
				
				<div class="form-group">
					<input type="text" class="form-control" placeholder="이름" name="userName" maxlength="20">
				</div>
				
				<div class="form-group" style="text-align: center;">
					<div class="btn-group" data-toggle="buttons">
						<label class="btn btn-primary active">
							<input type="radio" name="userGender" autocomplete="off" value="남자" checked>남자
						</label>
						<label class="btn btn-primary">
							<input type="radio" name="userGender" autocomplete="off" value="여자">여자
						</label>
					</div>
				</div>
				
					<div class="form-group">
						<input type="email" class="form-control" placeholder="이메일" name="userEmail" maxlength="20">
					</div>
					
					<input type="submit" class="btn btn-primary form-control" value="회원가입">
				</form>
			</div>
		</div>
		<div class="col-lg-4"></div>
	</div>
	<script src = "https://code.jquery.com/jquery-3.1.1.min.js"></script>
	<script src = "js/bootstrap.js"></script>
</body>
</html>

 

userDAO.java에 회원가입 기능 추가하기

package user;

//외부 라이브러리를 연결해준다.
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class UserDAO {

   private Connection conn;
   private PreparedStatement pstmt;
   private ResultSet rs;

   public UserDAO() {
      try {
         String dbURL = "jdbc:mysql://localhost:3306/bbs?serverTimezone=UTC";
         String dbID = "root";
         String dbPassword = "920424";
         //mysql에 접속 할 수 있도록 매개체 역할을 해주 코딩 
         Class.forName("com.mysql.jdbc.Driver");
         conn = DriverManager.getConnection(dbURL, dbID, dbPassword);
         System.out.println("db 접속 완료");
         
      } catch (Exception e) {
         e.printStackTrace();
      }
   }
   
   // 로그인을 시도하는 함수 
   public int login(String userID, String userPassword) {
		String SQL = "SELECT userPassword FROM USER WHERE userID = ?";
				try {
					//해킹 기법을 방어하기 위한 코딩 
					pstmt = conn.prepareStatement(SQL);
					//값을 가져온다.
					pstmt.setString(1, userID) ; 
					//실행한 결과를 rs에 넣어준다.
					rs = pstmt.executeQuery();
					//만약값이 있다면, 
					if (rs.next()) { 
						//아이디가 있다면, 결과(비번)을 받아서 같다면, 
						if(rs.getString(1).equals(userPassword)) {
							return 1;// 로그인 성공.
						}
						else
							return 0;//비밀번호가 불일치 한다. 
					}
					return -1; //아이디가 없다.
				} catch (Exception e) {
					e.printStackTrace();
				}
				return -2; //데이터베이스 오류 
   		}//login end
   
   //회원가입 기능 
   public int join(User user) { //유저아이디를 받는다.
		String SQL = "INSERT INTO USER VALUES(?, ?, ?, ?, ?)";

		try { pstmt = conn.prepareStatement(SQL);
				pstmt.setString(1,  user.getUserID());
				pstmt.setString(2,  user.getUserPassword());
				pstmt.setString(3,  user.getUserName());
				pstmt.setString(4,  user.getUserGender());
				pstmt.setString(5,  user.getUserEmail());
				return pstmt.executeUpdate();
				// 0 이상의 숫자가 나오기 떄문에 성공
				}catch(Exception e) {
					e.printStackTrace();
				}
					return -1; //데이터베이스 오류
		}//join end
  }

 

joinAction.jsp (회원가입 기능을 처리)

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

<!--login.jsp에서 받아온 자바빈즈를 UTF-8로 받아준다. -->
<%
	request.setCharacterEncoding("UTF-8");
%>
<!-- 현재 페이지에서만 자바빈즈를 사용해준다. -->
<jsp:useBean id="user" class="user.User" scope="page" />
<!-- join.jsp에서 보내는 id 값을 가져온다 -->
<jsp:setProperty name="user" property="userID" />
<jsp:setProperty name="user" property="userPassword" />
<jsp:setProperty name="user" property="userName" />
<jsp:setProperty name="user" property="userGender" />
<jsp:setProperty name="user" property="userEmail" />

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP 게시판 웹 사이트</title>
</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("이미 로그인이 되어있습니다.");
		script.println("location.href = 'main.jsp'");
		script.println("</script>");
	}
	
		//사용자가 입력을 안했을 경우의 수를 넣는다.
		if (user.getUserID() == null || user.getUserPassword() == null || user.getUserName() == null
				|| user.getUserGender() == null || user.getUserEmail() == null) {
			PrintWriter script = response.getWriter();
			script.println("<script>");
			script.println("alert('입력이 안 된 사항이 있습니다.')");
			script.println("history.back()");
			script.println("</script>");
		} else {
			//db 접근 할 수 있는 객체를 써준다.
			UserDAO userDAO = new UserDAO();
			// <jsp:useBean id="user" 의 아이디가 온다
			int result = userDAO.join(user);
			if (result == -1) {
				PrintWriter script = response.getWriter();
				script.println("<script>");
				script.println("alert('이미 존재하는 아이디 입니다.')");
				//로그인페이지로 돌려보낸다.
				script.println("history.back()");
				script.println("</script>");
			}
			else {
				//세션을 부여해주기
				session.setAttribute("userID", user.getUserID());
				PrintWriter script = response.getWriter();
				script.println("<script>");
				script.println("location.href='main.jsp'");
				script.println("</script>");
			}
		}
	%>
</body>
</html> 

 

세션 부여해주기

- 로그인 엑션 페이지에서 세션을 할당해준다.

-조인엑션에 세션을 부여해준다.

 

logoutAction.jsp 만들기 (부여된 세션을 없애준다.)

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP 웹 게시판 사이트</title>
</head>
<body>
<%
	//세션값 해제 해주기
	session.invalidate();
%>
	<script>
		//해제하고 메인으로 돌아가기
		location.href = 'main.jsp';
	</script>

</body>
</html>

loginAction.jsp 페이지에 아래 같은 코드를 넣어준다.(세션 확인해서 처리하기)

	String userID = null;
		//세션을 확인해서 userID가 있다면,
		if(session.getAttribute("userID") != null) {
			// 자신에게 할당된 유저아이디를 유저 아이디에 저장한다.
			userID = (String) session.getAttribute("userID");
		}
		//만약 유저아이디가 널값이 아니라면
		if (userID != null){
			PrintWriter script = response.getWriter();
			script.println("<script>");
			script.println("이미 로그인이 되어있습니다.");
			script.println("location.href = 'main.jsp'");
			script.println("</script>");
		}

joinAction.jsp 페이지에 아래 같은 코드를 넣어준다.(세션을 확인해서 처리하기)

	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("이미 로그인이 되어있습니다.");
		script.println("location.href = 'main.jsp'");
		script.println("</script>");
	}

 

 

main.jsp만들기

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
	<!--  스크립트 문장을 수행 하게  함 -->
	<%@ page import="java.io.PrintWriter" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width", initial-scale="1">
<link rel="stylesheet" href="css/bootstrap.css">
<title>JSP 게시판 웹 사이트</title>
</head>
<body>
<%
//로그인이 된 사람은 로그인 정보를 담아두게한다.
	String userID = null;
	// 만약 세션이 존재하는 사람이다면, 
	if(session.getAttribute("userID") != null){
	//스트링 형태로 값을 형변환 해준다. 
	userID = (String) session.getAttribute("userID");
}
%>

	<nav class="navbar navbar-default">
		<div class="navbar-header">
			<button type="button" class="navbar-toggle collapsed"
				data-toggle="collapse" data-target="#bs-example-navbar-collapse-1"
				aria-expanded="false">
				<span class="icon-bar"></span> <span class="icon-bar"></span> <span
					class="icon-bar"></span>
			</button>
			<a class="navbar-brand" href="main.jsp">JSP 게시판 웹 사이트</a>
		</div>
		<div class="collapse navbar-collapse"
			id="bs-example-navbar-collapse-1">
			<ul class="nav navbar-nav">
				<li class="active"><a href="main.jsp">메인</a>
				<li><a href="bbs.jsp">게시판</a>
			</ul>
			<%
			//로그인이 되어있지 않다면
			if(userID == null) {
			%>
			<ul class="nav navbar-nav navbar-right">
				<li class="dropdown"><a href="#" class="dropdown-toggle"
					data-toggle="dropdown" role="button" aria-haspopup="true"
					aria-expanded="false">접속하기<span class="caret"></span></a>
					<ul class="dropdown-menu">
						<li><a href="login.jsp">로그인</a></li>
						<li><a href="join.jsp">회원가입</a></li>
					</ul>
				</li>
			</ul>
			<%
			  } else { //로그인 된 회원만 볼수 있는 화면 
						%>
							<ul class="nav navbar-nav navbar-right">
								<li class="dropdown">
									<a href="#" class="dropdown-toggle"
										data-toggle="dropdown" role="button" aria-haspopup="true"
										aria-expanded="false">접속하기<span class="caret"></span></a>
									<ul class="dropdown-menu">
									<li><a href="logoutAction.jsp">로그아웃</a></li>
								</ul>
							</li>
				</ul>
			<%
			}
			%>
		</div>
	</nav>

	<script src="http://code.jquery.com/jquery-1.10.2.js"></script>
	<script src="js/bootstrap.js"></script>
</body>

 

+ Recent posts