본문 바로가기

JSP

[JSP] FrontController, MVC 패턴 활용 게시판 사이트 만들기

728x90
반응형
< 게시판 사이트 기능 >
1. 댓글관련기능,좋아요...등 페이징 유지

2. - 최근 회원가입한 3명의 이름을 화면에 가로로 출력
    - 특정 회원이 작성한 글 모아보기

3. 본인이 작성한 글 모아보기

4. 더보기 비활성화

5. 탈퇴 기능 추가 글,댓글을 작성한 바 있으면 탈퇴안됨

 

1. 댓글관련기능,좋아요...등 페이징 유지

1-1) 페이지를 유지할 기능에 cnt 값을 같이 보내주면 해당 페이지가 변경되지 않고 그대로 유지 됨. 

 

댓글 삭제 태그 

- 기존 "deleteR.do?&rid=${rid}" 에서 경로 &cnt=${cnt}추가 

<%@ tag language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

<%@ attribute name="midCheck" %>
<%@ attribute name="rid" %>

<c:if test="${uid==midCheck}">
<a href="deleteR.do?&rid=${rid}&cnt=${cnt}">[삭제]</a>

</c:if>

게시글 삭제, 좋아요 기능 태그 

- 기존 "deleteB.do?&bid=${bid}" 에서 경로 &cnt=${cnt}추가 

- 기존 "fav.do?&bid=${bid}" 에서 경로 &cnt=${cnt}추가 

<%@ tag language="java" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<%@ attribute name="midCheck" %>
<%@ attribute name="bid" %>

<c:if test="${uid==midCheck}">
<a href="deleteB.do?&bid=${bid}&cnt=${cnt}">[삭제]</a>

</c:if>
<c:if test="${uid!=null}">
<a href="fav.do?&bid=${bid}&cnt=${cnt}">&nbsp;♥</a>
</c:if>

게시글, 댓글 작성 태그 

- 기존 action="insertB.do" 에서 경로 &cnt=${cnt}추가 

- 기존 action="insertR.do" 에서 경로 &cnt=${cnt}추가 

<%@ tag language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

<%@ attribute name="type"%>
<%@ attribute name="bid" %>
<c:if test= "${uid !=null}">

		
<c:choose>
		<c:when test="${type=='msg'}">
		<form action="insertB.do?cnt=${cnt}" method="post">
		<input type="hidden" name="mid" value="${uid}"> 
		<input type="text" name="msg">
		<input type="submit" value="글 등록">
		</form>
		</c:when>
		
		<c:when test="${type=='rmsg'}">
			<form action="insertR.do?cnt=${cnt}" method="post">
			<input type="hidden" name="mid" value="${uid}">
			<input type="hidden" name="bid" value="${bid}">
			댓글 : <input type="text" name="rmsg">
			<input type="submit" value="댓글 등록">
			</form>
		</c:when>
</c:choose>

</c:if>

<c:if test="${uid==null}">
	<c:choose>
		<c:when test="${type=='msg'}">
			<input type="text" disabled value="등록하려면 로그인하세요!">
			<input type="submit" disabled value="글 등록">
		</c:when>
		
		<c:when test="${type=='rmsg'}">
			댓글 : <input type="text" disabled value="등록하려면 로그인하세요!">
			<input type="submit" disabled value="댓글 등록">
		</c:when>
	</c:choose>
</c:if>

 

2. - 최근 회원가입한 3명의 이름을 화면에 가로로 출력
    - 특정 회원이 작성한 글 모아보기

 

2-1) 회원 테이블에서 3명의 데이터를 가지고 오는 SQL문을 MemberDAO에 작성 

ROWNUM과 RNUM을 사용, 내림차순으로 3명의 최신 회원순으로 정렬 

//회원가입한 3명의 이름 출력 
	final String sql_selectAll="SELECT * FROM (SELECT A.*,ROWNUM AS RNUM FROM (SELECT * FROM MEMBER ORDER BY ROWNUM DESC) A WHERE ROWNUM<=3) WHERE RNUM>=1";

2-2) MainAction 부분에서 최근 가입한 회원들을 저장할 객체 생성 

//search.tag에서 최근 가입한 member
ArrayList<MemberVO> member = mdao.selectAll(mvo);
request.setAttribute("member", member);

package ctrl;

import java.util.ArrayList;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import board.BoardDAO;
import board.BoardSet;
import board.BoardVO;
import member.MemberDAO;
import member.MemberVO;

public class MainAction implements Action{

	@Override
	public ActionForward execute(HttpServletRequest request, HttpServletResponse response) throws Exception {
	//	request.setCharacterEncoding("UTF-8");//인코딩 필터가 없으면 이작업을 해야함 
	//	response.setCharacterEncoding("UTF-8"); //인코딩 필터가 없으면 이작업을 해야함 
		
		BoardDAO dao = new BoardDAO();
		BoardVO vo = new BoardVO();
		MemberVO mvo = new MemberVO();
		MemberDAO mdao = new MemberDAO();

		String paramCnt = request.getParameter("cnt");
		if(paramCnt == null || paramCnt.equals("")){
			vo.setCnt(2); // 향후 초기화 매개변수 등으로 설정가능
		}
		else {
			vo.setCnt(Integer.parseInt(paramCnt));
		}
		
		//search.tag에서 최근 가입한 member
		ArrayList<MemberVO> member = mdao.selectAll(mvo);
		request.setAttribute("member", member);
		
		String showContent = request.getParameter("showContent");
		System.out.println("showContent : [" + showContent + "]");
		
		
		HttpSession session = request.getSession(); // 출력할 게시글의 작성자를 세션에 저장 
		if(showContent != null) { // 메인으로 가기 / 내가 쓴 글 보기 / 최근 가입 회원이 쓴 글에 접속
			if(showContent.equals("main")) { // 메인으로 가기
				session.removeAttribute("moreContent"); // 세션 삭제 --> 전체 글 보기
			}
			else { // 내가 쓴 글 / 최근 회원이 쓴 글
				session.setAttribute("moreContent", showContent); // 작성자 세션 저장
				System.out.println("moreContent : " + session.getAttribute("moreContent"));
				vo.setMid(showContent); // 해당 작성자의 모든 게시글 출력하기 위한 mid set
			}
		}
		else { // 작성, 삭제, 좋아요 등 게시글 조작 --> showContent를 전달하지 않는다.
			// 그래서 세션에 있는 작성자 정보 이용
			// ex) 내가 쓴 글 보기(나의 mid 세션에 저장) --> 좋아요, 댓글 등 기능 수행(showContent 전달 X) 
			vo.setMid((String)session.getAttribute("moreContent")); // 바로 직전에 세션에 저장된 작성자의 글을 출력(전체 게시글 포함)
		}			

		//mian.jsp에서 게시물 출력용 datas
		ArrayList<BoardSet> datas = dao.selectAll(vo);
		System.out.println("mainaction" + datas);
		request.setAttribute("datas", datas);
		request.setAttribute("cnt", vo.getCnt());
		
		
		// 모든 게시글 보면 더보기 버튼 비활성화
		BoardVO nextBvo = vo;
		//nextBvo에 다음에 보여질 게시물 미리 계산
		nextBvo.setCnt(vo.getCnt() + 2); 
		// 다음에 보여줄 게시글
		ArrayList<BoardSet> nextDatas = dao.selectAll(nextBvo);
		// cnt와 '다음에 보여줄 게시글 개수' 차이가 2보다 크거나 같으면
		// 더보기 버튼 비활성화
		request.setAttribute("noMoreContent", nextBvo.getCnt() - nextDatas.size() >= 2 ? true : false);
		System.out.println("noMoreContent : " + request.getAttribute("noMoreContent"));

		ActionForward forward = new ActionForward();
		forward.setPath("/main.jsp");
		forward.setRedirect(false);
		return forward;
	}
}

2-3) 커스텀태그를 사용하여 최근 가입한 회원 출력

MainAction에서 member을 불러와 m.mid 해당 회원의 아이디가 없으면(비로그인) "최근에 가입한 회원이 없습니다" 출력

로그인한 상태에 는  최근 가입한 회원들 이름을 누르면 해당 회원이 작성한 글이 나도록 링크 작성  

showContent에 mid를 전달하게되면 MainAction 부분에 작성된 코드를 통해서 

moreContent라는 명칭으로 세션에 저장하여 해당 mid의 게시글들이 출력되도록 작성됨

<%@ tag language="java" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<c:forEach var="m" items="${member}">
<c:if test="${m.mid == null}">
	최근에 가입한 회원이 없습니다.
</c:if>
<c:if test="${m.mid != null}">
	<tr>
		<th><a href="main.do?mid=${m.mid}&cnt=2&showContent=${m.mid}">[${m.mname}]&nbsp;</a></th>
	</tr>
</c:if>
</c:forEach>

 

3. 본인이 작성한 글 모아보기

3-1) MainAction 부분 showContent 객체 생성 ( 상단 MainAction 코드 참조) 

String showContent = request.getParameter("showContent");
System.out.println("showContent : [" + showContent + "]");

 

3-2) showContent 에서 보낸 값이 세션에 저장된 로그인한 아이디일 경우 자신이 작성한 글 출력 

<!-- 만약 로그인 했다면 -->
			<c:if test="${uid !=null}">
				<h3>
					<!-- 세션에 있는 uid를 main.do를 보냄  -->
					<a href="main.do?mid=${uid}&showContent=${uid}">내가 쓴 글</a>
				</h3>
			</c:if>

3-3) showContent 에서 보낸 값이 mian 일 경우에는 전체 글 출력 (MainAction코드 일부) 

String showContent = request.getParameter("showContent");
		System.out.println("showContent : [" + showContent + "]");
		
		
		HttpSession session = request.getSession(); // 출력할 게시글의 작성자를 세션에 저장 
		if(showContent != null) { // 메인으로 가기 / 내가 쓴 글 보기 / 최근 가입 회원이 쓴 글에 접속
			if(showContent.equals("main")) { // 메인으로 가기
				session.removeAttribute("moreContent"); // 세션 삭제 --> 전체 글 보기
			}
			else { // 내가 쓴 글 / 최근 회원이 쓴 글
				session.setAttribute("moreContent", showContent); // 작성자 세션 저장
				System.out.println("moreContent : " + session.getAttribute("moreContent"));
				vo.setMid(showContent); // 해당 작성자의 모든 게시글 출력하기 위한 mid set
			}
		}
		else { // 작성, 삭제, 좋아요 등 게시글 조작 --> showContent를 전달하지 않는다.
			// 그래서 세션에 있는 작성자 정보 이용
			// ex) 내가 쓴 글 보기(나의 mid 세션에 저장) --> 좋아요, 댓글 등 기능 수행(showContent 전달 X) 
			vo.setMid((String)session.getAttribute("moreContent")); // 바로 직전에 세션에 저장된 작성자의 글을 출력(전체 게시글 포함)
		}			

		//mian.jsp에서 게시물 출력용 datas
		ArrayList<BoardSet> datas = dao.selectAll(vo);
		System.out.println("mainaction" + datas);
		request.setAttribute("datas", datas);
		request.setAttribute("cnt", vo.getCnt());

3-4) MainAction에서 만든 리스트 datas를 사용하여 main.jsp에서 해당 id(uid)의 게시글만 출력할 수 있도록 함

//mian.jsp에서 게시물 출력용 datas
ArrayList<BoardSet> datas = dao.selectAll(vo);
System.out.println("mainaction" + datas);
request.setAttribute("datas", datas);
request.setAttribute("cnt", vo.getCnt());

<!-- datas에 v.boardVO를 넣어준다 -->
			<c:forEach var="v" items="${datas}">
				<c:set var="b" value="${v.boardVO}" />
				<h3>[${b.mid}] ${b.msg} [ 좋아요 ${b.favcnt} | 댓글 ${b.rcnt} ] <kim:board midCheck="${b.mid}" bid="${b.bid}" /></h3>

				<div class="reply">
					<ul>
						<!-- replyVO가 들어가는 rList에 v처리하여 이것도 datas에 넣어준다 -->
						<c:forEach var="r" items="${v.rList}">
							<li>[${r.mid}] ${r.rmsg} <kim:reply midCheck="${r.mid}" rid="${r.rid}" /></li>
						</c:forEach>
					</ul>
				</div>

 

4. 더보기 비활성화 - 게시판 모든 목록 출력 후 더보기 비활성화 

4-1) BoardVO에 메인 페이지에서 보여줄 글의 개수를 나타낼 변수(cnt) 생성 

public class BoardVO {
	private int bid;
	private String mid;
	private String msg;
	private int favcnt;
	private int rcnt;
	private int cnt; // 메인 페이지에 보여줄 글의 개수 [JAVA] ★★★★★

4-2) BoardSet에 게시글 1개 + 댓글 N개를 담아줄 VO 생성 

package board;

import java.util.ArrayList;

public class BoardSet {
	//★★★★★
	//글 1개 + 댓글 N개
	//JAVA에서 사용할 VO를 자체제작 
	private BoardVO boardVO;
	private ArrayList<ReplyVO> rList = new ArrayList<ReplyVO>();
	public BoardVO getBoardVO() {
		return boardVO;
	}
	public void setBoardVO(BoardVO boardVO) {
		this.boardVO = boardVO;
	}
	public ArrayList<ReplyVO> getrList() {
		return rList;
	}
	public void setrList(ArrayList<ReplyVO> rList) {
		this.rList = rList;
	}
}

 

4-3) MainAction - 한 페이지에 게시글을 2개씩 출력하기 위한 부분 

cnt 파라미터를 paramCnt에 저장 후 cnt 값을 2로 설정 ( 게시글이 2개씩 보임!) 

값이 있는 경우 ( 더보기 버튼을 클릭하여 cnt값이 늘어남) 정수로 변환하여 cnt 에 set 해줌

String paramCnt = request.getParameter("cnt");
		if(paramCnt == null || paramCnt.equals("")){
			vo.setCnt(2); // 향후 초기화 매개변수 등으로 설정가능
		}
		else {
			vo.setCnt(Integer.parseInt(paramCnt));
		}

4-4 ) MainAction - 더보기 버튼을 눌렀을 때 cnt +2 , 더보기 비활성화 부분 

추가될 cnt를 미리 계산하기 위해서 더보기 버튼을 눌렀을 때 2씩 더해질 수 있도록 cnt를 불러와서 set 해줌

'noMoreContent'에 추가 예정인 cnt값과 현재 게시판 테이블에 존재하는 게시글 수의 차이가 2 이상인 경우 true 미만인 경우 false

// 모든 게시글 보면 더보기 버튼 비활성화
		BoardVO nextBvo = vo;
		//nextBvo에 다음에 보여질 게시물 미리 계산
		nextBvo.setCnt(vo.getCnt() + 2); 
		// 다음에 보여줄 게시글
		ArrayList<BoardSet> nextDatas = dao.selectAll(nextBvo);
		// cnt와 '다음에 보여줄 게시글 개수' 차이가 2보다 크거나 같으면
		// 더보기 버튼 비활성화
		// noMoreContent가 true면 더보기버튼 안보이게! false면 보이게! 
		request.setAttribute("noMoreContent", nextBvo.getCnt() - nextDatas.size() >= 2 ? true : false);
		//System.out.println("noMoreContent : " + request.getAttribute("noMoreContent"));

 

5. 탈퇴 기능 추가 글,댓글을 작성한 바 있으면 탈퇴안됨

5-1) main.jsp에 회원 탈퇴 커스텀 태그를 사용 

<%@ tag language="java" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<form action="deleteM.do" method="post">
                     <input type="hidden" name="action" value="deleteM">
                     <input type="hidden" name = "mid" value = "${uid}">
                     
                     비밀번호 : <input type="password" name="mpw" placeholder = "비밀번호 확인">
                     <input type="submit" value="회원탈퇴">
                  </form>

 

5-2) 회원 탈퇴 Action 

member의 pk인 mid가  board, reply 테이블에  외래키로 존재하기 때문에 해당 테이블에 mid의 존재 여부에 따라서 

게시글, 댓글 유무를 판단하여 회원 탈퇴를 진행 

package ctrl;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import board.BoardDAO;
import board.BoardVO;
import board.ReplyVO;
import member.MemberDAO;
import member.MemberVO;

public class DeleteMAction implements Action {

	@Override
	public ActionForward execute(HttpServletRequest request, HttpServletResponse response) throws Exception {

		ActionForward forward = null;
		MemberDAO mdao = new MemberDAO();
		BoardDAO dao = new BoardDAO();
		MemberVO mvo = new MemberVO();
		BoardVO bvo = new BoardVO();
		ReplyVO rvo = new ReplyVO();

		mvo.setMid(request.getParameter("mid"));
		bvo.setMid(request.getParameter("mid"));
		rvo.setMid(request.getParameter("mid"));
		System.out.println("로그 : mpw"+ request.getParameter("mpw"));


		mvo.setMpw(request.getParameter("mpw"));
		if(dao.selectOneB(bvo)==null && dao.selectOneR(rvo)==null ) {
			if(mdao.delete(mvo)) {
				HttpSession session = request.getSession();
				session.invalidate();
				forward = new ActionForward();
				forward.setPath("main.do");
				forward.setRedirect(true);
			}
		}
		else {
			System.out.println("로그 : 탈퇴실패");
			throw new Exception("탈퇴 실패");
		}

		return forward;
	}
}

 

	//회원탈퇴용 - 작성 게시글 
	final String sql_selectOneB = "SELECT * FROM BOARD WHERE MID=?";
	//회원탈퇴용 - 작성 댓글 
	final String sql_selectOneR = "SELECT * FROM REPLY WHERE MID=?";

 

 

< 전체코드 >  

 

GitHub - SuYounKim/MVC_Board-Practice: MVC 패턴 활용 게시판 만들기

MVC 패턴 활용 게시판 만들기 . Contribute to SuYounKim/MVC_Board-Practice development by creating an account on GitHub.

github.com

 

728x90
반응형

'JSP' 카테고리의 다른 글

[JSP] AJAX 활용 아이디 중복 검사  (0) 2022.08.26
[JSP] 초기화 매개변수, 리스너, 필터  (0) 2022.08.25
[JSP] FrontController 개념  (0) 2022.08.24
[JSP] 트랜잭션 commit(), rollback()  (0) 2022.08.18
[JSP] 리스너 클래스, JSTL  (0) 2022.08.18