안경잡이개발자

728x90
반응형

  이번 시간에는 JSP로 강의평가(Lecture Evaluation) 웹 사이트 개발하기의 열 번째 강의입니다. 지난 시간에는 특정한 강의를 검색할 수 있고, 페이징 처리를 하여 페이지를 넘기면서 여러 강의를 볼 수 있도록 기능을 구현하는 시간을 가졌습니다. 이번 시간에는 특정한 강의를 추천하고, 자신이 작성한 글에 한해서 글을 삭제하는 기능을 개발하고자 합니다. 바로 시작해봅시다. 가장 먼저 지난 번에 데이터베이스를 설계하는 시간에 작성했었던 LIKEY 테이블을 조금 바꿔주도록 하겠습니다. 바로 다음과 같이 ALTER 명령어를 이용해서 (회원 아이디, 평가 번호)로 PRIMARY KEY를 줍시다. 왜냐하면 한 명은 특정한 글에 단 한 번만 추천을 누를 수 있어야 하기 때문입니다.


  ▶ ALTER TABLE LIKEY ADD PRIMARY KEY (userID, evaluationID);



  이후에 바로 EvaluationDAO.java 파일을 수정하도록 하겠습니다. 이번 시간에 구현할 기능을 위해 몇 가지 데이터베이스 접근 함수가 필요하기 때문이에요.


public int like(String evaluationID) {

PreparedStatement pstmt = null;

try {

String SQL = "UPDATE EVALUATION SET likeCount = likeCount + 1 WHERE evaluationID = ?";

pstmt = conn.prepareStatement(SQL);

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

return pstmt.executeUpdate();

} catch (Exception e) {

e.printStackTrace();

} finally {

try {

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

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

} catch (Exception e) {

e.printStackTrace();

}

}

return -1;

}

public int delete(String evaluationID) {

PreparedStatement pstmt = null;

try {

String SQL = "DELETE FROM EVALUATION WHERE evaluationID = ?";

pstmt = conn.prepareStatement(SQL);

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

return pstmt.executeUpdate();

} catch (Exception e) {

e.printStackTrace();

} finally {

try {

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

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

} catch (Exception e) {

e.printStackTrace();

}

}

return -1;

}

public String getUserID(String evaluationID) {

PreparedStatement pstmt = null;

try {

String SQL = "SELECT userID FROM EVALUATION WHERE evaluationID = ?";

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;

}


  위와 같이 총 3개의 함수를 추가해줍시다. 차례대로 추천을 눌러서 특정한 글의 추천 갯수가 증가되는 함수, 특정한 강의 평가 글을 지우는 함수, 특정한 강의 평가 글을 작성한 사용자의 아이디를 구하는 함수입니다. 이제 다음과 같이 우리의 프로젝트를 구성합니다. likey 패키지를 생성해서 LikeyDTO.java, LikeyDAO.java를 생성합니다. 그리고 deleteAction.jsp 페이지와 likeAction.jsp 페이지를 생성합니다. 이 두 페이지는 강의 평가 글을 지우는 액션 페이지, 강의 평가에 추천을 누르는 액션 페이지입니다.



  ▶ 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(String userID, int evaluationID, String userIP) {

this.userID = userID;

this.evaluationID = evaluationID;

this.userIP = userIP;

}


}


  ▶ LikeyDAO.java


package likey;


import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.SQLException;


public class LikeyDAO {


private Connection conn;


public LikeyDAO() {

try {

String dbURL = "jdbc:mysql://localhost:3306/LectureEvaluation";

String dbID = "root";

String dbPassword = "root1234";

Class.forName("com.mysql.jdbc.Driver");

conn = DriverManager.getConnection(dbURL, dbID, dbPassword);

} catch (Exception e) {

e.printStackTrace();

}

}

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

String SQL = "INSERT INTO LIKEY VALUES (?, ?, ?)";

try {

PreparedStatement pstmt = conn.prepareStatement(SQL);

pstmt.setString(1, userID);

pstmt.setString(2, evaluationID);

pstmt.setString(3, userIP);

return pstmt.executeUpdate();

} catch (SQLException e) {

e.printStackTrace();

}

return -1; // 추천 중복 오류

}

}


  ▶ 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;

}

%>


  이제 한 번 테스트를 해보도록 합시다.







728x90
반응형