고래씌

[JSP] 6-4. 아이디 중복체크 기능, 댓글 기능 본문

Server/JSP과 Servlet

[JSP] 6-4. 아이디 중복체크 기능, 댓글 기능

고래씌 2023. 12. 15. 09:51

1. 아이디 중복체크 기능

- 유효성 검사를 배제하고 아이디 중복 체크만 만들어보겠다!

 

▶ memberEnrollForm.jsp

맨아래에 script 추가

	<script>
		const idCheck = () => {
			// 입력한 아이디값 얻어오기
			// jQuery 함수는 앞에 $를 붙이는것이 관례임
			const $userId = $("#enroll-form input[name=userId]");
				// menubar.jsp의 아이디 name값이 userId임.
				// enroll-form 아이디값의 후손인 input태그
				// name이 userId인 요소가 menubar.jsp에도 존재하기 때문에 확실하게 속한 userId인지 잘 적어줘야한다.
			
			$.ajax({
				url : "idCheck.me",
				data : {checkId : $userId.val()},
				success : function(result){
					if(result === "NNNNN"){   // 사용불가 코드
						// 각각의 회원탈퇴 등 여러 이유로 사용이 불가능하게 된 아이디이기 때문에 각 고유의 코드를 이용해 조건 검사함
						
						alert("이미 존재하거나 탈퇴한 회원입니다.");
						$userId.focus();
					}else if (result === "NNNE"){ // 사용불가 코드
						alert("사용이 불가능한 아이디");
						$userId.focus();
					}else { // 사용가능한 아이디
						if(confirm("사용가능한 아이디입니다. 사용하시겠습니까..?")){ // 확인=>true, 취소=>false반환
							$userId.attr("readonly",true);   //	확인버튼 누르면 다시 입력을 못하게 readonly 설정
						}else{
							$userId.focus();
						}
					}
				}
			})
		}
	</script>

 

 

▶ AjaxidCheckController.java

package com.kh.member.controller;

import java.io.IOException;

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.kh.member.model.service.MemberService;

/**
 * Servlet implementation class AjaxidCheckController
 */
@WebServlet("/idCheck.me")
public class AjaxidCheckController extends HttpServlet {
	private static final long serialVersionUID = 1L;
       

    public AjaxidCheckController() {
        super();
    }


	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}


	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String checkId = request.getParameter("checkId");  // .ajax 아래에 data가 checkId이므로 그대로 넣어줌
		
		int count = new MemberService().idCheck(checkId);
		
		if(count > 0) {  // 아이디가 존재함
			response.getWriter().print("NNNNN");
		}else {
			response.getWriter().print("NNNNY");
		}
	}

}

 

 

▶ MemberSerivce.java

 

 

▶ MemberDao.java

 

 

▶ member-mapper.xml

 

 

 

 


2. 게시판 댓글 추가 기능

 

▶ com.kh.board.mode.vo 아래에 Reply.java   클래스 생성

package com.kh.board.model.vo;

import java.sql.Date;

public class Reply {

	private int replyNo;
	private String replyContent;
	private int refBoardNo;
	private int replyWriter;
	private Date createDate;
	private String status;
	private String userId;
	
	public Reply() {
		
	}

	public Reply(int replyNo, String replyContent, int refBoardNo, int replyWriter, Date createDate, String status,
			String userId) {
		super();
		this.replyNo = replyNo;
		this.replyContent = replyContent;
		this.refBoardNo = refBoardNo;
		this.replyWriter = replyWriter;
		this.createDate = createDate;
		this.status = status;
		this.userId = userId;
	}

	public int getReplyNo() {
		return replyNo;
	}

	public void setReplyNo(int replyNo) {
		this.replyNo = replyNo;
	}

	public String getReplyContent() {
		return replyContent;
	}

	public void setReplyContent(String replyContent) {
		this.replyContent = replyContent;
	}

	public int getRefBoardNo() {
		return refBoardNo;
	}

	public void setRefBoardNo(int refBoardNo) {
		this.refBoardNo = refBoardNo;
	}

	public int getReplyWriter() {
		return replyWriter;
	}

	public void setReplyWriter(int replyWriter) {
		this.replyWriter = replyWriter;
	}

	public Date getCreateDate() {
		return createDate;
	}

	public void setCreateDate(Date createDate) {
		this.createDate = createDate;
	}

	public String getStatus() {
		return status;
	}

	public void setStatus(String status) {
		this.status = status;
	}

	public String getUserId() {
		return userId;
	}

	public void setUserId(String userId) {
		this.userId = userId;
	}

	@Override
	public String toString() {
		return "Reply [replyNo=" + replyNo + ", replyContent=" + replyContent + ", refBoardNo=" + refBoardNo
				+ ", replyWriter=" + replyWriter + ", createDate=" + createDate + ", status=" + status + ", userId="
				+ userId + "]";
	}
}

 

 

▶ WebContent - views - board - boardDetailView.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" isELIgnored="true" import="com.kh.board.model.vo.*"%>
<%
	Board b = (Board)request.getAttribute("b");

	Attachment at = (Attachment) request.getAttribute("at");
%>    

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%@include file="../common/menubar.jsp" %>
	<div class="outer">
		
		<br><h2 align="center">일반게시판 상세보기</h2><br>
		
		<table id="detail-area" align="center" border="1">
			<tr>
				<th width="70">카테고리</th>
				<td width="70"><%= b.getCategoryName() %></td>
				<th width="70">제목</th>
				<td width="350"><%= b.getBoardTitle() %></td>
			</tr>
			<tr>
				<th>작성자</th>
				<td><%= b.getBoardWriter() %></td>
				<th>작성일</th>
				<td><%= b.getCreateDate() %></td>
			</tr>
			<tr>
				<th>내용</th>
				<td colspan="3">  <!--열병합3칸-->
					<p style="height:200px;">
						<%= b.getBoardContent() %>
					</p>
				</td>
			</tr>
			<tr>
				<th>첨부파일</th>
				<td colspan="3">
					<% if(at == null) { %>
						첨부파일이 없습니다.
					<% } else { %>
						<!-- 첨부파일이 있을경우 해당파일 다운로드 -->
						<a download="<%= at.getOriginName() %>" 
						href="<%= contextPath %>/<%= at.getFilePath()+at.getChangeName()%>">
						<!-- 다운로드 파일을 받을 경로 -->
						<%= at.getOriginName() %>
						</a>
						<!--  at.getFilePath()+at.getChangName() => +를 이용해 하나로 표현해줌 -->
					<% } %>
				</td>
			</tr>
		</table>
		
		<br>
		
		<div align="center">
			<a href="<%=contextPath%>/list.bo?currentPage=1" class="btn btn-secondary btn-sm">목록</a>
			
			<!-- 로그인한 사용자와 현재 게시글을 작성한 작성자가 맞는지 검사 -->
			<% if(loginUser != null && loginUser.getUserId().equals(b.getBoardWriter())) { %>
				<!-- 로그인한 사용자만 게시글 수정/삭제버튼이 보여야함 -->
				<a href="<%=contextPath %>/update.bo?bno=<%=b.getBoardNo() %>" 
				class="btn btn-warning btn-sm">수정</a>
				<!-- b.getBoardNo() => 내가 작성했던 게시글 내용이 보이게 하기 위해서 현재 게시글 번호를 같이 보내야한다! -->
				
				<a href="<%=contextPath %>/delete.bo?bno=<%=b.getBoardNo() %>"
				 class="btn btn-danger btn-sm">삭제</a>
			<% } %>
		</div>
			
	
	
		<br>
		<div id="reply-area">
			<table border="1" align="center">
				<thead>
					<% if(loginUser == null) { %>
					<tr>
						<th>댓글작성</th>
						<td>
							<textarea rows="3" cols="50" style="resize:none" readonly>로그인후 이용가능한 서비스입니다</textarea>
						</td>
						<td><button id="reply-btn">댓글등록</button></td>
					</tr>
					<% } else { %>
					<tr>
						<th>댓글작성</th>
						<td>
							<textarea id="replyContent" rows="3" cols="50" style="resize:none"></textarea>
						</td>
						<td><button id="reply-btn">댓글등록</button></td>
					</tr>
					<% } %>
				</thead>
				<tbody>
				</tbody>
			</table>
		</div>
	</div>
	
	<script>
		// 댓글 등록 기능
		$(function(){
			$("#reply-btn").click(function(){
				$.ajax({
					url : "insert.re",
					data : {content : $("#replyContent").val(),
						    bno : <%= b.getBoardNo() %>},
					type : 'post',
					success : function(result) {
						if(result > 0) { // 댓글등록 성공
							$("#replyContent").val("");   // 댓글등록 클릭하면 빈칸으로 되도록 설정
							selectReplyList();    // 쓴 댓글이 화면에 출력하는 함수 호출
						}
					},
					error : function(){
						console.log('비동기 통신 실패');
					}
				})
			})
		})
		
		function selectReplyList(){
			$.ajax({
				url : 'list.re',
				data : {bno : <%= b.getBoardNo() %>},
				success : function(list){
					
					// 얻어온 데이터를 바탕으로 게시글 작성자, 게시글 내용, 작성일자 순서대로
					// 화면에 출력
					
					let str = "";
					for(let reply of list){
						str += `<tr>
									<td>${reply.userId}</td>
									<td>${reply.replyContent}</td>
									<td>${reply.createDate}</td>
								<tr>`;
					}
					
					$("#reply-area tbody").html(str);
				}
			})
		}
		
		selectReplyList();   // 두번 호출
	</script>
</body>
</html>

 

 

 

 

=> REPLY 테이블에 댓글이 추가되면 추가되도록 SQL 쿼리문 작성하겠다.

 

 

▶ board-mapper.xml

 

 

=> 우리는 이미 댓글을 추가하면 자동으로 증가하는 시퀀스를 만들었었다!(SEQ_RNO)

 

 

 

▶ AjaxBoardReplyInsertController.java 

package com.kh.board.controller;

import java.io.IOException;

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.kh.board.model.service.BoardService;
import com.kh.board.model.vo.Reply;
import com.kh.member.model.vo.Member;

/**
 * Servlet implementation class BoardReplyController
 */
@WebServlet("/insert.re")
public class AjaxReplyInsertController extends HttpServlet {
	private static final long serialVersionUID = 1L;
       

    public AjaxReplyInsertController() {
        super();
    }


	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}


	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String content = request.getParameter("content");
		int bno = Integer.parseInt(request.getParameter("bno"));
	    
	    // 이런방법으로도 가져올 수 있다! (userNo)
		int userNo = ((Member)request.getSession().getAttribute("loginUser")).getUserNo();
		
		System.out.println(content);
		System.out.println(bno);
		System.out.println(userNo);
		
		Reply r = new Reply();
		r.setReplyContent(content);
		r.setRefBoardNo(bno);
		r.setReplyWriter(userNo);
		
		int result = new BoardService().insertReply(r);

		
		response.getWriter().print(result);
	}

}

 

 

▶ BoardService.java

 

 

 

▶ BoardDao.java

 

 

=> 데이터 베이스에 데이터 추가된 것 확인

 


3. 비동기식 처리 댓글 불러오기 기능

▶ boardDetailView.jsp

 

※ GSON을 이용하여 화면에 출력할 경우 isELIgnored="true" 를 꼭 추가하여야함!!

 

 

 

▶ Board-mapper.xml

 

 

 

▶ AjaxReplyListController.java

package com.kh.board.controller;

import java.io.IOException;
import java.util.ArrayList;

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 org.json.simple.JSONObject;

import com.google.gson.Gson;
import com.kh.board.model.service.BoardService;
import com.kh.board.model.vo.Reply;

/**
 * Servlet implementation class AjaxReplyListController
 */
@WebServlet("/list.re")
public class AjaxReplyListController extends HttpServlet {
	private static final long serialVersionUID = 1L;
       

    public AjaxReplyListController() {
        super();
    }


	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		int bno = Integer.parseInt(request.getParameter("bno"));
		
		ArrayList<Reply> list = new BoardService().selectReplyList(bno);
		
		
		// response.getWriter().print(list);   => toString() 으로 호출되기 때문에 print(list.toString());
		
		response.setContentType("application/json; charset=UTF-8");
		
		new Gson().toJson(list, response.getWriter());

	}


	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

 

 

▶ BoardService.java

 

 

▶ BoardDao.java