로컬 호스트에서 웹서버 구동 시

 

<!doctype html>

<html>

  <head>

  <link rel="stylesheet" href="{{ url_for('static', filename='css/w3.css') }}">

  </head>

  <body>

  <div class="w3-container w3-center">

    <h2>{{ subject }}</h2>

    <a href="http://127.0.0.1:5000/hello">내 웹싸이트의 hello로 이동합니다.</a>

  </div>

  </body>

</html>

 

 but 배포시 웹서버의 주소가 바뀌기 때문에 사용 할 수 없다.

 

그래서 아래와 같이 url_for 함수를 사용 하면 알아서 내부 웹서버의 주소를 바꿔주기 때문에 바꿀 필요가 없다.

 

<!doctype html>

<html>

  <head>

  <link rel="stylesheet" href="{{ url_for('static', filename='css/w3.css') }}">

  </head>

  <body>

  <div class="w3-container w3-center">

    <h2>{{ subject }}</h2>

    <a href={{ url_for('hello') }}>내 웹싸이트의 hello로 이동합니다.</a>

  </div>

  </body>

</html>

 

 

URL에 파라미터 값을 넣을 땐 '파라미터 = 값' 형태로 넣어준다.(값은 ""로 감싸줘야한다)

<!doctype html>

<html>

  <head>

  <link rel="stylesheet" href="{{ url_for('static', filename='css/w3.css') }}">

  </head>

  <body>

  <div class="w3-container w3-center">

    <h2>{{ subject }}</h2>

    <a href={{ url_for('hello', variable="foo", act="do") }}>내 웹싸이트의 hello로 이동합니다.</a>

  </div>

  </body>

</html>

 

i : 현재 위치의 커서 앞에서 움직인다.

a : 커서 다음 위치부터 움직인다.

o: 커서 밑의 줄부터 움직인다.

 

esc : 명령 모드로 돌아간다.

:wq : 저장 후 닫기

 

커멘드 모드

가장 기본이 되는 모드, 복사 붙여넣기, 다른모드로 전환, 커서이동, 삭제 등

(1) 커서 이동 

방향키

 G :  가장 마지막 줄로 이동

gg : 가장 첫번째 줄로 이동

[n]G : n번째 줄로 이동

$ : 커서가 위치한 줄의 맨 끝으로 이동

0 : 커서가 위치한 줄의 맨 앞으로 이동

w: 커서가 한 단어씩 오른쪽으로 이동

b: 커서가 한 단어씩 왼쪽으로 이동

 

esc : 취소 기능

 

삭제 (잘라내기)

x :삭제

dd: 한줄 삭제

d[커서이동] : 커서가 이동하는 만큼 이동

 

수정

r: 커서가 위치한 부분의 문자 하나를 입력하는 문자로 대체

u : 컨트롤 + z 처럼 작업취소

 

복사

yy : 커서가 위치한 한 줄을 복수

y[커서이동] : 커서가 이동하는 만큼 복사

p : 커서 밑이나 커서 다음에 붙여넣기

 

저장 및 종료

:w : 저장

:q: 종료

:wq : 저장종료

:w! : 강제로 저장

:q! :강제로 종료

:wq!: 강제로 저장종료

 

 

':: IT > 리눅스' 카테고리의 다른 글

[리눅스 기초] 리눅스 기초 명령어  (0) 2020.07.19

pwd (print working directory)

현재 작업 중인 디렉토리 정보 출력

ohj@HP-ProBook:~$ pwd

결과값

/home/ohj

cd (change directory)

경로 이동

절대 경로와 상대 경로로 이동 가능하다.

home으로 이동

ohj@HP-ProBook:/$ cd /home

이전 디렉토리로 이동

ohj@HP-ProBook:/home$ cd ..

ohj@HP-ProBook:/$

ls (list)

디렉토리 목록 확인

현재 디렉토리의 목록 확인

ohj@HP-ProBook:/$ ls

bin dev initrd.img lib64 mnt root snap sys var

boot etc initrd.img.old lost+found opt run srv tmp vmlinuz

cdrom home lib media proc sbin swapfile usr

home으로 이동

ohj@HP-ProBook:/$ cd /home

home의 목록 확인

ohj@HP-ProBook:/home$ ls

ohj

cat (concatenate)

cat 명령은 활용 방법이 꽤나 다양하다.

단순히 파일의 내용을 출력할 수도 있고,

파일 여러개를 합쳐서 하나의 파일로 만들 수도 있다.

그리고 기존 한 파일의 내용을 다른 파일에 덧붙일수도 있다.

새로운 파일을 만들때에도 사용된다.

file1, file2, file3 파일에는 각각 간단하게 숫자 1, 2, 3 이 적혀있다.

새로운 파일을 생성합니다.

ohj@HP-ProBook:~/testdir$ cat > testfile1

hello

worldohj@HP-ProBook:~/testdir$

(작성이 완료 되면 ctrl + d로 파일을 저장합니다.)

파일의 내용을 출력합니다.

ohj@HP-ProBook:~/testdir$ cat testfile1

hello

worldohj@HP-ProBook:~/testdir$

새로운 파일 2를 생성합니다.

ohj@HP-ProBook:~/testdir$ cat testfile2

hello

world2ohj@HP-ProBook:~/testdir$

2개의 파일을 합쳐서 새로운 하나의 파일을 만듭니다.

ohj@HP-ProBook:~/testdir$ cat testfile1 testfile2 > testfile1_2

ohj@HP-ProBook:~/testdir$ cat testfile1_2

hello

world

hello

world2ohj@HP-ProBook:~/testdir$

1번 파일의 내용을 2번 파일에 덧붙일 수 있습니다.

ohj@HP-ProBook:~/testdir$ cat testfile1 >> testfile2

ohj@HP-ProBook:~/testdir$ cat testfile2

hello

world2hello

worldohj@HP-ProBook:~/testdir$

mkdir (make directory)

디렉토리 생성

-p 옵션을 주면 하위 디렉토리까지 한 번에 생성 가능

아래 예제중 ls -R 옵션은 디렉토리의 하위목록까지 전부 보여주는 옵션인데,

내 경우 실제로 많이 사용하진 않아서 ls 명령어에서 따로 설명하진 않았다.

mkdir -p 옵션 예제에서 실제로 하위디렉토리가 생성되었다는 것을 보여주기 위해 사용하였다.

testdir 폴더 만들기

ohj@HP-ProBook:~$ mkdir testdir

리스트 보기

ohj@HP-ProBook:~$ ls

Downloads java_error_in_PYCHARM_3774.log testdir 문서 사진

PycharmProjects python-workspace 공개 바탕화면 음악

examples.desktop snap 다운로드 비디오 템플릿

/는 폴더 안의 폴더를 찾아갈 때 사용한다.

ohj@HP-ProBook:~$ cd /testdir

bash: cd: /testdir: 그런 파일이나 디렉터리가 없습니다

ohj@HP-ProBook:~$ cd testdir

~/ <-home이라는 뜻

. <- 현재 폴더를 뜻이다.

.. <- 자신의 상위 폴더 위로 가는 것

./ <- 현재 폴더 안에서 무언 가를 하겠다.

ohj@HP-ProBook:~/testdir$

a라는 폴더 안에 b 폴더를 만들고 안에 c 폴더를 만든다.

mkdir -q a/b/c/

mv (move)

파일 혹은 디렉토리 이동

실제로 원하는 위치로 이동할때도 사용하지만, 이름을 변경하는 용도로도 사용한다.

cp와는 달리 디렉토리를 이동할때도 별다른 옵션이 필요 없다.

1. 파일 이동하기

파일을 이동하기 위해 새로운 디렉토리2를 만들어 줍니다.

ohj@HP-ProBook:~/testdir$ mkdir testdir2

리스트를 확인해 봅니다.

ohj@HP-ProBook:~/testdir$ ls

testdir2 testfile1 testfile1_2 testfile2

테스트1 파일을 디렉토리2 폴더로 이동시킵니다.

ohj@HP-ProBook:~/testdir$ mv testfile1 testdir2

디렉토리2 폴더로 이동하여 폴더 안의 테스트1파일이 이동 된 것을 확인합니다.

ohj@HP-ProBook:~/testdir$ cd testdir2

리스트를 확인합니다.

ohj@HP-ProBook:~/testdir/testdir2$ ls

testfile1

2. 파일의 이름을 수정하기

테스트1 파일의 이름을 수정해줍니다.

ohj@HP-ProBook:~/testdir/testdir2$ mv testfile1 testfile1_mv

바뀐 내용을 확인해봅니다.

ohj@HP-ProBook:~/testdir/testdir2$ ls

testfile1_mv

rm (remove)

파일이나 디렉토리를 삭제

디렉토리를 삭제할때는 r 옵션을 주어야 한다.

-f 옵션을 주면 사용자에게 삭제 여부를 묻지 않고 바로 삭제한다.

디렉토리를 삭제할 때에는 하위 디렉토리까지 모두 삭제되므로 유의하자.

1. 파일 삭제하기

디렉토리2 폴더의 리스트를 확인합니다.

ohj@HP-ProBook:~/testdir/testdir2$ ls

testfile1_mv

수정된 테스트 파일을 삭제해줍니다.

ohj@HP-ProBook:~/testdir/testdir2$ rm -f testfile1_mv

목록을 검색하면 삭제되어 사라진 것을 확인 할 수 있습니다.

ohj@HP-ProBook:~/testdir/testdir2$ ls

2. 폴더 삭제하기

새로운 폴더를 만들어줍니다.

ohj@HP-ProBook:~/testdir/testdir2$ mkdir testdir3

리스트를 확인해 줍니다.

ohj@HP-ProBook:~/testdir/testdir2$ ls

testdir3

폴더는 -f로 삭제 할 수 없습니다.

ohj@HP-ProBook:~/testdir/testdir2$ rm -f testdir3

rm: 'testdir3'를 지울 수 없음: 디렉터리입니다

폴더는 -r을 이용하여 삭제가 가능합니다.

ohj@HP-ProBook:~/testdir/testdir2$ rm -r testdir3

삭제 되었는지 리스트를 확인 해줍니다.

ohj@HP-ProBook:~/testdir/testdir2$ ls

ohj@HP-ProBook:~/testdir/testdir2$

cp (copy)

파일 혹은 디렉토리를 복사

디렉토리를 복사할때는 -r 옵션을 주어야함

1. 파일 복사하기

복사할 새로운 파일을 만들어줍니다.

ohj@HP-ProBook:~/testdir/testdir2$ cat > testfile4

this is testfile

testfile4의 파일 내용을 확인합니다.

ohj@HP-ProBook:~/testdir/testdir2$ cat testfile4

this is testfile

testfile4파일을 복사하여 새로 저장합니다.

ohj@HP-ProBook:~/testdir/testdir2$ cp testfile4 testfile4_copy

목록을 확인해보면 카피 파일이 생겼습니다.

ohj@HP-ProBook:~/testdir/testdir2$ ls

testfile4 testfile4_copy

카피 파일을 내용을 확인합니다.

ohj@HP-ProBook:~/testdir/testdir2$ cat testfile4_copy

this is testfile

tree 명령어

설치합니다.

sudo apt-get install tree

실행합니다.

tree

touch

파일이나 디렉토리의 최근 업데이트 일자를 현재 시간으로 변경한다.

최근 업데이트 일자는 ls -l 명령을 통해 확인할 수 있다.

아래 예제에서 ‘11월 6 22:08’ 이라고 쓰여진 부분이다.

파일이나 디렉토리가 존재하지 않으면 빈 파일을 만든다.

리스트의 상세내용을 보여줍니다.

ohj@HP-ProBook:~/testdir/testdir2$ ls -l

합계 8

-rw-r--r-- 1 ohj ohj 16 7월 17 13:02 testfile4

-rw-r--r-- 1 ohj ohj 16 7월 17 13:03 testfile4_copy

수정일을 현재 시간으로 바꿔줍니다.

ohj@HP-ProBook:~/testdir/testdir2$ touch testfile4

바뀐 내용을 확인 할 수 있습니다.

ohj@HP-ProBook:~/testdir/testdir2$ ls -l

합계 8

-rw-r--r-- 1 ohj ohj 16 7월 17 15:18 testfile4

-rw-r--r-- 1 ohj ohj 16 7월 17 13:03 testfile4_copy

find

특정 파일이나 디렉토리를 검색한다

사용법이 앞의 명령어들에비해 살짝 복잡하므로, 기본 사용법을 언급하자면 다음과 같다.

find [검색경로] -name [파일명]

파일명은 직접 풀 네임을 입력해도 되지만,

다음 예제처럼 특정 조건을 적용해 검색할수도 있다.

나같은 경우 주로 특정 확장자명을 찾기 위해 사용한다.

1. 파일찾기

testdir 폴더안에서 testfile4를 찾습니다.

위치를 반환해줍니다.

ohj@HP-ProBook:~/testdir$ find ./ -name 'testfile4'

./testdir2/testfile4

2. 파일확장자명으로 찾기

ohj@HP-ProBook:~$ find ./ -name "*.png"

find: ‘./.dbus’: 허가 거부

./사진/스크린샷, 2020-07-14 15-56-25.png

./사진/스크린샷, 2020-07-14 16-41-35.png

 

':: IT > 리눅스' 카테고리의 다른 글

[리눅스 기초] vi 편집기  (0) 2020.07.19

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