본문 바로가기

programming/Gukbi

국비 교육 48일차 - 댓글 수정, 삭제

728x90
반응형

주말에 정처기 공부한다고 복습 블로깅 할 시간도 없었다. 필기는 일단 붙었고 실기가 또 남았는데.. 일단은 바로 다음 회차 신청할 예정이다

 

그러면 복습 블로깅을 다시 시작해보면,

 

저번 시간에는 댓글 수정, 삭제 기능전까지 구현했기 때문에 이번에 그 기능들을 마저 완성해 나갔다. 

 

먼저 그나마 간단한 삭제 메소드부터 시작하겠다

// 5) 댓글 삭제  reply_no  movie_no
   public void replyDelete(int no)
   {
	   try
	   {
		   // 1. 연결
		   getConnection();
		   // SQL
		   String sql="DELETE FROM webReply "
				     +"WHERE no=?";
		   ps=conn.prepareStatement(sql);
		   // 3. ?에값을 채운다
		   ps.setInt(1, no);
		   // 4. 삭제 실행 요청 
		   ps.executeUpdate();
	   }catch(Exception ex)
	   {
		   ex.printStackTrace();
	   }
	   finally
	   {
		   disConnection();
	   }
   }

 여기서는 no를 매개변수로 받아오는데, 영화의 번호가 아니라 댓글의 번호이다. 실제 웹사이트를 만들때는 헷갈리지 않게 reply_no와 같은 형식으로 써주는게 맞다고 한다

 

여튼 sql문장 DELETE를 써서 완성을 해준다. 그리고 DetailServlet으로 이동해서 완성해준다.

 

댓글을 달고 수정, 삭제 할 수 있는건 로그인이 되어 있을때만 가능하다. 이걸 잘 생각해서 맞게 코드를 써주면 된다. 

// 댓글 출력 위치 
		if(count==0) // 댓글이 없는 상태
		{
			out.println("<table class=table>");
			out.println("<tr>");
			out.println("<td class=text-center style=\"color:red\">");
			out.println("<h3>댓글이 없습니다</h3>");
			out.println("</td>");
			out.println("</tr>");
			out.println("</table>");
			
		}
		else // 댓글이 존재하는 상태
		{
			out.println("<table class=table>");
			out.println("<tr>");
			out.println("<td>");
			for(ReplyVO rvo:rList)
			{
				out.println("<table class=table>");
				
				out.println("<tr>");
				out.println("<td class=text-left>");
				out.println("<span style=\"color:blue;font-weight:bold\">"+rvo.getName()+"</span>");
				out.println("("+rvo.getDbday()+")");
				out.println("</td>");
				out.println("<td class=text-right>");
				if(rvo.getId().equals(id))
				{
					out.println("<span value="+rvo.getNo()+" class=\"btn btn-xs btn-success aaa\">수정</span>");
					out.println("<a href=ReplyDeleteServlet?no="+rvo.getNo()+"&mno="+mno+" class=\"btn btn-xs btn-info\">삭제</a>");
				}
				out.println("</td>");
				out.println("</tr>");
				
				out.println("<tr>");
				out.println("<td colspan=2 valign=top class=text-left>");
				out.println("<pre style=\"white-space:pre-wrap;background:white\">");
				out.println(rvo.getMsg()+"</pre>");
				out.println("</td>");
				out.println("</tr>");
				// display:none => tr를 감춘다 
				out.println("<tr class=update id=m"+rvo.getNo()+" style=\"display:none\">");
				out.println("<td colspan=2>");
				out.println("<form method=post action=ReplyUpdateServlet>");
				out.println("<input type=hidden name=mno value="+vo.getMno()+">");// 이동
				out.println("<input type=hidden name=no value="+rvo.getNo()+">");// 수정할 번호
				out.println("<textarea rows=3 cols=90 style=\"float:left\" name=msg>"+rvo.getMsg()+"</textarea>");
				out.println("<input type=submit value=댓글수정 class=\"btn btn-sm btn-primary\" style=\"height:68px;float:left\">");
				out.println("</form>");
				out.println("</td>");
				out.println("</tr>");
				out.println("</table>");
			}
			out.println("</td>");
			out.println("</tr>");
			out.println("</table>");
		}

 forEach 구문을 사용해서 댓글 데이터를 가져와 준다. 이때 작성되어 있는 댓글의 아이디와, 세션에 저장되어 있는 현재 아이디가 일치하는 경우에 댓글 수정, 삭제 권한을 부여해준다. 

 

if(rvo.getId().equals(id))
{
	out.println("<span value="+rvo.getNo()+" class=\"btn btn-xs btn-success aaa\">수정</span>");
	out.println("<a href=ReplyDeleteServlet?no="+rvo.getNo()+"&mno="+mno+" class=\"btn btn-xs btn-info\">삭제</a>");
}

 댓글 삭제 기능은 detailServlet에서 처리해주는게 아니라 RepltDeleteServlet에서 처리해줘야 하기 때문에 a태그로 값을 넘겨줘서 처리를 해야한다. 댓글의 번호와 mno를 같이 넘겨줘서 처리를 한다. 

 

public class ReplyDeleteServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 화면 출력 (X)
		// 1. 사용자 보내준 데이터 받기  ReplyDeleteServlet?no = 1&mno = 2
		String no = request.getParameter("no");
		String mno=request.getParameter("mno");
		// 2. DAO=>오라클로 전송 (삭제)
		MovieDAO dao=new MovieDAO();
		dao.replyDelete(Integer.parseInt(no));
		// 3. 댓글이 있던 위치로 이동 
		response.sendRedirect("MovieDetailServlet?mno="+mno);
	}

}

 댓글을 삭제하고 + 원래 페이지로 돌아가기 위해서 no와 mno값을 둘다 받아왔다. 

no변수는 replyDelete메소드에 넣어주고, mno값을 받아와서 다시 detailServlet쪽으로 접근해주면 완성된다. 

 

댓글 수정 메소드 역시 그렇게 복잡하지는 않았다. 

다만 창에서 직접 수정이 가능하게 만들어야 하기 때문에 그런걸 고려하는게 조금 복잡했다. 

 

// 6) 댓글 수정 
   public void replyUpdate(int no, String msg)
   {
	   try
	   {
		
		   	String sql="UPDATE webReply SET "
		   			+"msg=?"
		   			+"WHERE no=?";
		   	ps=conn.prepareStatement(sql);
		   	ps.setString(1, msg);
		   	ps.setInt(2, no);
	   }
	   catch (Exception ex) {
		
	   }
	   finally
	   {
		   disConnection();
	   }
   }

 수정 메소드는 UPDATE문을 써서 간단하게 만들 수 있었다.  댓글의 번호와 메세지를 알아야 수정이 가능하기 때문에 매개변수로 두개를 받아오고 시작했다. 

 

 수정하면 뜨는 창이다. 수정을 하기 전에 그 전에 써준 댓글의 내용을 먼저 보여주고 여기서 부터 수정할 수 있도록 프론트를 꾸몄다. 

 

if(rvo.getId().equals(id))
				{
					out.println("<span value="+rvo.getNo()+" class=\"btn btn-xs btn-success aaa\">수정</span>");
					out.println("<a href=ReplyDeleteServlet?no="+rvo.getNo()+"&mno="+mno+" class=\"btn btn-xs btn-info\">삭제</a>");
				}
				out.println("</td>");
				out.println("</tr>");
				
				out.println("<tr>");
				out.println("<td colspan=2 valign=top class=text-left>");
				out.println("<pre style=\"white-space:pre-wrap;background:white\">");
				out.println(rvo.getMsg()+"</pre>");
				out.println("</td>");
				out.println("</tr>");
				// display:none => tr를 감춘다 
				out.println("<tr class=update id=m"+rvo.getNo()+" style=\"display:none\">");
				out.println("<td colspan=2>");
				out.println("<form method=post action=ReplyUpdateServlet>");
				out.println("<input type=hidden name=mno value="+vo.getMno()+">");// 이동
				out.println("<input type=hidden name=no value="+rvo.getNo()+">");// 수정할 번호
				out.println("<textarea rows=3 cols=90 style=\"float:left\" name=msg>"+rvo.getMsg()+"</textarea>");
				out.println("<input type=submit value=댓글수정 class=\"btn btn-sm btn-primary\" style=\"height:68px;float:left\">");
				out.println("</form>");
				out.println("</td>");
				out.println("</tr>");
				out.println("</table>");

  댓글 수정에 필요한 정보는 댓글 no, mno, msg이다. 그래서 form태그로 감싸줘서 ReplyUpdateServlet으로 값을 보내준다. 

 

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		try
		{
			/*
			 * 	HTTP:네트워크(TCP) => 서버로 전송 (1byte씩) 한글(byte로 변환후 전송)
			 * 	웹에서는 자동으로 인코딩
			 * 	
			 */
			request.setCharacterEncoding("UTF-8"); // 인코딩 => 디코딩
		}
		catch (Exception ex)
		{
			
		}
		// 1. web => 한글 (브라우저, 자바...)
		String no=request.getParameter("no");
		String mno=request.getParameter("mno");
		String msg=request.getParameter("msg");
		
		// DAO 연결
		MovieDAO dao=new MovieDAO();
		dao.replyUpdate(Integer.parseInt(no), msg);
		
		// 화면 이동
		response.sendRedirect("MovieDetailServlet?mno="+mno);
	}

 받아온 값들을 각각 메소드에 넣어주고, 다시 movieDetailServlet쪽으로 이동을 하면 수정이 완료된다. 

 

 

 

728x90
반응형