본문 바로가기

programming/Gukbi

국비 교육 45일차 - 오라클 연동 (게시판 마무리), CSS

728x90
반응형

오전에는 CURD 프로그램을 마저 다 완성했고, 오후 시간에는 CSS 기본 문법을 배웠다. 

CSS는 이미 혼자 독학하면서 깨우쳤던 내용이라 수업을 따라가는데 어렵지 않았다. 

 

저번 시간에 새글 등록하는 INSERT 프로그램까지 완성해서 오늘은 게시글을 삭제하고, 수정하는 기능까지 완성해줬다. 

아직 검색어를 활용해서 게시물을 검색해주는 기능은 완성하진 않았다. 

 

먼저는 게시글 삭제 기능부터 만들어줬다. 

아래는 DAO 파일이다

 

// 3-4. 삭제 => DELETE => 비밀번호 확인 
   public boolean boardDelete(int no,String pwd)
   {
	   boolean bCheck=false;
	   try
	   {
		   //1.연결
		   getConnection();
		   //2.SQL문장 
		   String sql="SELECT pwd FROM webBoard "
				     +"WHERE no=?";
		   ps=conn.prepareStatement(sql);
		   ps.setInt(1, no);
		   ResultSet rs=ps.executeQuery();
		   rs.next();
		   String db_pwd=rs.getString(1);
		   rs.close();
		   
		   if(db_pwd.equals(pwd))
		   {
			   bCheck=true;
			   // 실제 데이터 삭제
			   sql="DELETE FROM webBoard "
				  +"WHERE no=?";
			   ps=conn.prepareStatement(sql);
			   ps.setInt(1, no);
			   ps.executeUpdate();
		   }
	   }catch(Exception ex)
	   {
		   System.out.println(ex.getMessage());
	   }
	   finally
	   {
		   disConnection();
	   }
	   return bCheck;
   }

 글을 삭제하기 위해서는 게시글을 쓴 사람이 맞는지 먼저 확인을 해줘야 한다. 본인 확인 방법은 비밀번호이다. 

글을 작성했을때 넘겨주었던 비밀번호와 입력한 비밀번호가 맞는지 먼저 확인해주는 코드를 짜야한다. 

 

사용자로부터 넘겨받은 글번호와 비밀번호가 일치한다면, 글을 지우라는 명령을 DELETE문을 통해서 내린다. 

 

package com.sist.board;

import java.io.*;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.sist.dao.BoardDAO;

@WebServlet("/BoardDeleteServlet")
public class BoardDeleteServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 화면 출력
		response.setContentType("text/html;charset=EUC-KR");
		PrintWriter out=response.getWriter();
		// 데이터 받기
		// http://localhost/HTMLBoardProject/BoardDeleteServlet?no=12
		String no=request.getParameter("no");
		
		/*
		 *    InputStream , OutputStream  => 1byte
		 *    Reader , Writer  => 2byte
		 */
		out.println("<html>");
		out.println("<head>");
		out.println("<style type=text/css>");
		out.println("td,th{font-family:맑은 고딕;font-size:9pt;height:35px}");
		out.println(".table_main{border-collapse:collapse;");
		out.println("border-top-width: 2px;"
				+ "border-bottom-width: 1px;"
				+ "border-top-style: solid;"
				+ "border-bottom-style: solid;"
				+ "border-top-color: #333;"
				+ "border-bottom-color: #333;}");
		out.println(".table_main th{");
		out.println("background-color: #999;"
				+ "color: #fff;"
				+ "border-bottom-width: 1px;"
				+ "border-bottom-color: #333;}");
		out.println(".table_main td{");
		out.println("border-bottom-width: 1px;"
				+ "border-bottom-color: #666;"
				+ "border-bottom-style: dotted;}");
		out.println("a{color:black;text-decoration:none}");
		out.println("a:hover{color:green;text-decoration:underline}");
		out.println(".dataTr:HOVER {"
				+ "background-color: #FC6;"
				+ "cursor: pointer;"
				+ "cursor: hand;"
				+ "}");
		out.println("</style>");
		out.println("</head>");
		out.println("<body>");
		out.println("<center>");
		out.println("<h1>삭제하기</h1>");
		out.println("<form method=post action=BoardDeleteServlet>");//a.doGet()
		// 톰캣이 호출 => 서블릿,JSP => 톰캣이 호출한다 
		out.println("<table class=table_main width=350>");
		out.println("<tr>");
		out.println("<th width=30% align=right>비밀번호</th>");
		out.println("<td width=70%>");
		// ?pwd=1234&no=12 => 감춘다 (POST)
		out.println("<input type=password name=pwd size=15>");
		out.println("<input type=hidden name=no value="+no+">");
		out.println("</td>");
		out.println("</tr>");
		out.println("<tr>");
		out.println("<td colspan=2 align=center>");
		out.println("<input type=submit value=삭제>");
		out.println("<input type=button value=취소>");
		out.println("</td>");
		out.println("</tr>");
		out.println("</table>");
		out.println("</form>");
		out.println("</center>");
		out.println("</body>");
		out.println("</html>");
		
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 유저에게 보내는 HTML이 존재한다 
		response.setContentType("text/html;charset=EUC-KR");
		PrintWriter out=response.getWriter();
		// 삭제 처리 
		String no=request.getParameter("no");
		String pwd=request.getParameter("pwd");
		System.out.println("번호:"+no);
		System.out.println("비밀번호:"+pwd);
		// DAO연결 
		BoardDAO dao=new BoardDAO();
		boolean bCheck=dao.boardDelete(Integer.parseInt(no), pwd);
		System.out.println("bCheck:"+bCheck);
		// 화면 이동 
		if(bCheck==true)
		{
		    response.sendRedirect("BoardListServlet");
		}
		else
		{
			out.println("<script type=text/javascript>");
			out.println("alert(\"비밀번호가 틀립니다 다시 입력하세요\");");
			out.println("history.back();");
			out.println("</script>");
		}
		
	}
}

 글 번호를 서버 URL주소로 부터 넘겨받아서 매개변수로 저장해줘야 하기 때문에

 

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

 위와 같이 데이터를 먼저 받아오고 시작을 해준다. 

 

out.println("<h1>삭제하기</h1>");
		out.println("<form method=post action=BoardDeleteServlet>");//a.doGet()
		// 톰캣이 호출 => 서블릿,JSP => 톰캣이 호출한다 
		out.println("<table class=table_main width=350>");
		out.println("<tr>");
		out.println("<th width=30% align=right>비밀번호</th>");
		out.println("<td width=70%>");
		// ?pwd=1234&no=12 => 감춘다 (POST)
		out.println("<input type=password name=pwd size=15>");
		out.println("<input type=hidden name=no value="+no+">");
		out.println("</td>");
		out.println("</tr>");
		out.println("<tr>");
		out.println("<td colspan=2 align=center>");
		out.println("<input type=submit value=삭제>");
		out.println("<input type=button value=취소>");
		out.println("</td>");
		out.println("</tr>");
		out.println("</table>");
		out.println("</form>");

 삭제를 해주기 위해서는 doGet으로 값을 보내줘야 하기 때문에 form 태그를 통해서 method를 작성해준다.

그리고 테이블 태그를 이용해서 비밀번호를 받아올 수 있는 화면을 출력해준다. 

코드를 실행시키면 위와 같은 화면이 출력된다. 

이제 값을 받을 준비를 해뒀으니 DAO를 연결해서 오라클에 보내주면 된다. 

 

그 코드를 실행해주는게 doPost아래 코드이다. 

 

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 유저에게 보내는 HTML이 존재한다 
		response.setContentType("text/html;charset=EUC-KR");
		PrintWriter out=response.getWriter();
		// 삭제 처리 
		String no=request.getParameter("no");
		String pwd=request.getParameter("pwd");
		System.out.println("번호:"+no);
		System.out.println("비밀번호:"+pwd);
		// DAO연결 
		BoardDAO dao=new BoardDAO();
		boolean bCheck=dao.boardDelete(Integer.parseInt(no), pwd);
		System.out.println("bCheck:"+bCheck);
		// 화면 이동 
		if(bCheck==true)
		{
		    response.sendRedirect("BoardListServlet");
		}
		else
		{
			out.println("<script type=text/javascript>");
			out.println("alert(\"비밀번호가 틀립니다 다시 입력하세요\");");
			out.println("history.back();");
			out.println("</script>");
		}
		
	}

 이미 위에서 url값으로 no, pwd를 보내줬기 때문에 doPost에서 새롭게 변수로 받아 올 수 있다. 

그렇게 저장을 먼저 해주고, dao에 연결을 해서 미리 만들어 놓은 boardDelete 메소드에 매개변수를 채워준다. 

 

bCheck를 통해서 저장된 비번과 비교를 해주고 같으면 게시물 삭제를 완료하고 BoardListServlet으로 돌아간다. 

비밀번호가 같지 않으면 alert창을 띄워서 비밀번호가 같지 않으니 다시 값을 입력해달라고 요청을 한다. 

 

 

 

 

다음은 게시글 수정 기능이다. 

 

// 3-3. 수정 => UPDATE => SQL (2개) 1.비밀번호 확인 , 2. 수정 => 어디로 갈까? 흐름
   // 3-3-1 데이터 읽기
   // web 화면 ==> DAO ==> web화면에 데이터 출력 
   public BoardVO boardUpdateData(int no)
   {
	   BoardVO vo=new BoardVO();
	   try
	   {
		   // 1. 연결
		   getConnection();
		   // 2. SQL문장 
		   String sql="SELECT name,subject,content "
				     +"FROM webBoard "
				     +"WHERE no=?";
		   ps=conn.prepareStatement(sql);
		   ps.setInt(1, no);
		   // 3. 실행요청
		   ResultSet rs=ps.executeQuery();
		   rs.next();
		   // 4. 결과값을 VO에 채운다
		   vo.setName(rs.getString(1));
		   vo.setSubject(rs.getString(2));
		   vo.setContent(rs.getString(3));
		   
		   rs.close();
	   }catch(Exception ex)
	   {
		   System.out.println(ex.getMessage());
	   }
	   finally
	   {
		   disConnection();
	   }
	   return vo;
   }
   // 3-3-2 실제 수정 
   public boolean boardUpdate(BoardVO vo)
   {
	   boolean bCheck=false;
	   try
	   {
		   // 1. 연결
		   getConnection();
		   // 2. SQL문장
		   String sql="SELECT pwd FROM webBoard "
				     +"WHERE no=?";
		   ps=conn.prepareStatement(sql);
		   ps.setInt(1, vo.getNo());
		   ResultSet rs=ps.executeQuery();
		   rs.next();
		   String db_pwd=rs.getString(1);
		   rs.close();
		   
		   if(db_pwd.equals(vo.getPwd()))
		   {
			   bCheck=true;
			   // 실제 수정 
			   sql="UPDATE webBoard SET "
				  +"name=?,subject=?,content=? "
				  +"WHERE no=?";
			   ps=conn.prepareStatement(sql);
			   // ?에 값을 채운다 
			   ps.setString(1, vo.getName());
			   ps.setString(2, vo.getSubject());
			   ps.setString(3, vo.getContent());
			   ps.setInt(4, vo.getNo());
			   
			   // 실행
			   ps.executeUpdate();
		   }
		   
	   }catch(Exception ex)
	   {
		   System.out.println(ex.getMessage());
	   }
	   finally
	   {
		   disConnection();
	   }
	   
	   return bCheck;
   }

 일단 게시글을 수정해주기 위해서는 원래 써있던 내용을 가져와 준 뒤, 그 내용에 다른 내용을 추가하거나 지우면서 내용을 변경해줄 수 있다. 

 

일단 수정을 위해서도 본인 확인 절차가 필요하기 때문에, 비밀번호가 맞는지 먼저 확인해주는 코드를 짠다. 

 

String sql="SELECT pwd FROM webBoard "
				     +"WHERE no=?";
		   ps=conn.prepareStatement(sql);
		   ps.setInt(1, vo.getNo());
		   ResultSet rs=ps.executeQuery();
		   rs.next();
		   String db_pwd=rs.getString(1);
		   rs.close();

 여기서 받아서 저장해준 db_pwd의 값이, 불러온 vo.getPwd()의 값과 같다면, 수정할 수 있도록 코드를 아래와 같이 짜줄 수 있다. 

 

 

if(db_pwd.equals(vo.getPwd()))
		   {
			   bCheck=true;
			   // 실제 수정 
			   sql="UPDATE webBoard SET "
				  +"name=?,subject=?,content=? "
				  +"WHERE no=?";
			   ps=conn.prepareStatement(sql);
			   // ?에 값을 채운다 
			   ps.setString(1, vo.getName());
			   ps.setString(2, vo.getSubject());
			   ps.setString(3, vo.getContent());
			   ps.setInt(4, vo.getNo());
			   
			   // 실행
			   ps.executeUpdate();

 SQL문 UPDATE를 활용해서 오라클에 연결된 테이블에 값을 변경해서 채워넣어 준다. 

 

 

// 사용자가 보내준 게시물 번호를 받는다.
		String no=request.getParameter("no");
		// DAO를 연결해서 no에 해당하는 데이터값을 받아 온다 
		BoardDAO dao=new BoardDAO();
		BoardVO vo=dao.boardUpdateData(Integer.parseInt(no));
		// doGet , doPost => Thread

 그러면 이제 일단 BoardUpdateServlet 파일에서 사용자가 보내준 게시물의 번호를 받아온다. 

또 받아온 no값을 정수형으로 변경해준 뒤 해당하는 게시글의 정보를 BoardVO에 다시 저장을 해주면서 시작한다. 

 

 

out.println("<h1>수정하기</h1>");
		// 입력된 모든 데이터를 doPost로 전송 => <form>
		out.println("<form method=post action=BoardUpdateServlet autocomplete=off>");
		// 입력창을 이용해서 => 글쓰기가 가능하게 만들어 준다 
		out.println("<table class=table_main width=600>");
		// 이름입력
		out.println("<tr>");
		out.println("<th width=20% align=right>이름</th>");
		out.println("<td width=80%>");
		out.println("<input type=text name=name size=15 value="+vo.getName()+">");
		out.println("<input type=hidden name=no value="+no+">");
		out.println("</td>");
		out.println("</tr>");
		// 제목입력
		out.println("<tr>");
		out.println("<th width=20% align=right>제목</th>");
		out.println("<td width=80%>");
		out.println("<input type=text name=subject size=50 value=\""+vo.getSubject()+"\">");
		out.println("</td>");
		out.println("</tr>");
		// 내용입력
		out.println("<tr>");
		out.println("<th width=20% align=right>내용</th>");
		out.println("<td width=80%>");
		out.println("<textarea rows=10 cols=55 name=content>"+vo.getContent()+"</textarea>");
		out.println("</td>");
		out.println("</tr>");
		
		// 비밀번호
		out.println("<tr>");
		out.println("<th width=20% align=right>비밀번호</th>");
		out.println("<td width=80%>");
		out.println("<input type=password name=pwd size=15>");
		out.println("</td>");
		out.println("</tr>");
		
		out.println("<tr>");
		out.println("<td colspan=2 align=center>");
		out.println("<input type=submit value=수정>");
		out.println("<input type=button value=취소 onclick=\"javascript:history.back()\">");
		// HTML / CSS / JavaScript
		out.println("</td>");
		out.println("</tr>");
		
		out.println("</table>");
		out.println("</form>");
		out.println("</center>");
		out.println("</body>");
		out.println("</html>");

  수정으로 입력받을 값을 doPost로 넘겨주기 위해 form태그를 작성한다. 그리고 다시 입력창을 이용해서 글쓰기 (수정)이 가능하게 만들어 준다. 

 

원래 있던 내용은 그대로 가져와야하기 때문에, 입력창에 기존 글의 내용을 먼저 채워주고 시작한다. 

단, 비밀번호 알려주면 안되기 때문에 원래 있던 값을 채워주지 않고 사용자가 입력하게끔 빈 칸으로 남겨둬야 한다. 

 

먼저 값을 받아와서 출력해 줬으면 doPost에서는 DAO에 연결해서 사용자가 수정한 내용을 업데이트 해주면 된다. 

 

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	    // doPost => 사용자 입력값을 받아서 DAO연결
		response.setContentType("text/html;charset=EUC-KR");
		PrintWriter out=response.getWriter();
		// 사용자가 보낸 데이터 받기 
		try
		{
			request.setCharacterEncoding("EUC-KR");// 디코딩 
		}catch(Exception ex) {}
		
		String name=request.getParameter("name");
		String subject=request.getParameter("subject");
		String content=request.getParameter("content");
		String pwd=request.getParameter("pwd");
		String no=request.getParameter("no");
		
		System.out.println("이름:"+name);
		System.out.println("제목:"+subject);
		System.out.println("내용:"+content);
		System.out.println("비밀번호:"+pwd);
		// DAO로 전송 
		BoardDAO dao=new BoardDAO();
		BoardVO vo=new BoardVO();
		vo.setName(name);
		vo.setSubject(subject);
		vo.setContent(content);
		vo.setPwd(pwd);
		vo.setNo(Integer.parseInt(no));
		
		boolean bCheck=dao.boardUpdate(vo);
		
		// 목록으로 이동 
		if(bCheck==true)
		{
			response.sendRedirect("BoardDetailServlet?no="+no);
		}
		else
		{
			out.println("<script type=text/javascript>");
			out.println("alert(\"비밀번호가 틀립니다 다시 입력하세요\");");
			out.println("history.back();");
			out.println("</script>");
		}
		
		
	}

 doPost에서는 doGet에서 사용자가 입력해준 이름, 제목, 내용, 비밀번호, 글 번호를 받아와 준다. 

그리고 DAO로 전송해서 오라클에 저장되어 있는 비밀번호와 입력한 비밀번호가 맞는지 먼저 체크를 해준다. 

 

맞으면 boardUpdate()의 결과값으로 true가 입력되면서 오라클에 자동적으로 데이터가 업데이트 된다. 

그리고 자동으로 메인페이지인 BoardDetailServlet으로 이동을 시켜준다. 

 

만약 비밀번호가 맞지 않으면 사용자로부터 값을 다시 요청해야한다. 

패스워드를 다시 입력하라는 알림창을 띄우고 재입력을 받도록 이전 페이지로 돌아가게 해주면 된다. 

 

 

이렇게 까지 하면 입력, 수정, 삭제가 가능한 게시판 프로그램 하나를 완성할 수 있다. 

 

 

 

 

728x90
반응형