< 게시판 사이트 기능 >
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}"> ♥</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}] </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
'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 |