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

 

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

+ Recent posts