초급의 끄적거림

[프로젝트] 답변형 게시판 (답변 / 새글표시 / 조회수 많은 글 표시) 본문

실습

[프로젝트] 답변형 게시판 (답변 / 새글표시 / 조회수 많은 글 표시)

codingD 2019. 9. 6. 14:30

행 추가 종류


 ⊙ 행추가 : 새글쓰기 (어제까지 한 내용), 답변쓰기

   - 새글쓰기와 답변의 차이

새글쓰기 답변 (bbsReply.jsp)

  grpno    → 최대값 (bbsno)+1

  indent    → 0

  ansunum → 0

   - 새로 시작하면서 0 으로 시작 

  grpno : 그룹번호  → 부모 그룹번호

  indent : 들여쓰기  → 부모 들여쓰기 +1

  ansnum : 글순서   → 부모글 순서 +1 하고 이후 행 추가시, 글순서 조정 (+1)

  - 댓글형 게시판에서는 '들여쓰기'와 '글순서'가 필요 없지만 답변형 게시판에서는 필요

 

 ⊙ 예시

bbsno

subject

grpno (글 그룹번호)

부모 grpno=자식 grpno

indent (들여쓰기)

부모글 indent+1

ansnum (글순서)

1

대한민국

1

0

0

 

▶ 종로구

1

1

1

 

▶▶ 인사동 (답변의 답변)

1

2   (부모 종로구)

2

 

▶▶▶ 쌈지길

1

3   (부모 인사동)

3

 

▶▶▶ 다이나믹 메이즈

1

3   (부모 종로구)

4

 

▶▶▶▶ 201호

1

4   (부모 다이나믹 메이즈)

 

▶▶ 관철동

1

2

4 → 5 → 6

 

▶ 강남구

1

1

5 → 6 → 7

 

▶ 마포구

1

1

6 → 7 → 8

2

베트남

2

0

0

 

▶ 하노이

2

1

1

 

▶ 다낭

2

1

2

3

독일

3

0

0

4

미국

4

0

0

 

 ⊙ 답변을 달 경우, 사용자 보기에는 답변은 대한민국 바로 아래로 들어가게 되지만 원래 insert는 자기 마음대로 들어가고 관리자가 정렬해 주는 것

 ⊙ 대한민국과 종로구 강남구가 같이 나오려면 같은 그룹이라는 것을 알려주기 위한 겹치는 값이 있어야함 → grpno 

 ⊙ 새 글은 그룹번호 (grpno) 가 주어지고 답변은 부모글과 같은 그룹번호가 주어짐

 

 ⊙ 1씩 추가된 관철동, 강남구, 마포구 ansnum 의 update 쿼리문 (아래 표 기준)

update tb_bbs
set ansnum=ansnum+1
where grpno=1 and ansnum>4; (부모의 grpno와 부모의 ansnum 보다 큰 것

답변쓰기


 bbsReply.jsp 

 ⊙ bbsForm.jsp 와 내용이 같기 때문에 form 을 복사해오고 action을 bbsReplyProc.jsp로 변경

 ⊙ input태그를 이용해 bbsno를 히든 타입으로 넣어주기

 ⊙ onsubmit은 return을 만나야지만 실행이 가능, this는 form을 가리킴 → 자바스크립트 function에 해당하기 때문에 myscript.js 에 만들어도 되고 현재 페이지에 만들어도 됨

 ⊙ required 최소 0인 경우 아무것도 넘어가지 않음, length가 0인 경우

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ include file="ssi.jsp" %>
<%@ include file="../header.jsp"%>
<!-- 본문시작 bbsReply.jsp-->
	<h3>* 답변 쓰기 *</h3>
<%
	//부모글 가져오기 (주어진 일련번호 이용)
	int bbsno=Integer.parseInt(request.getParameter("bbsno"));
%>

<form name="bbsfrm" method="post" action="bbsReplyProc.jsp" onsubmit="return bbsCheck(this)"> 
<input type="hidden" name="bbsno" value="<%=bbsno%>">	
	<div class="container">
	<table class="table table-condensed"> <!-- class="table table-striped" -->
	<tr>
	  <th class="active">작성자</th> <!-- class="active" 빼면 칸 색상 사라짐 -->
	  <td><input type="text" name="wname" size="10" maxlength="20" required class="form-control"></td>
      </tr>	
	<tr>
	  <th class="active">제목</th>
      	  <td><input type="text" name="subject" size="30" maxlength="100" required class="form-control"></td> 
	</tr>	
	<tr>
	  <th class="active">내용</th>
	  <td><textarea rows="5" cols="30" name="content" class="form-control"></textarea></td>
	</tr>	
	<tr>
	  <th class="active">비밀번호</th>
	  <td><input type="password" name="passwd" size="10" maxlength="10" required class="form-control"></td> 
	</tr>	
	<tr>
	  <td colspan="2"  align="right">
		<input type="submit" value="쓰기" class="btn btn-default"> <!-- submit을 하게 되면 onsubmit 이라는 액션이 발생 -->
		<input type="reset" value="취소" class="btn btn-default">		
	  </td>
	</tr>
	</table>
	<p><a href="bbsList.jsp"  class="btn btn-default">글목록</a></p>
</div>
	</form>
<!-- 본문끝 -->
<%@ include file="../footer.jsp"%>

 

 

bbsReplyProc.jsp

 ⊙ bbsIns.jsp와 내용을 같게 하고 bbsReply.jsp에서 히든으로 가져온 bbsno를 받아올 수 있게 넣어줌

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>    
<%@ include file="ssi.jsp"%> <!-- 순서가 바뀌어도 상관없지만 공통페이지로 겹칠 때 -->
<%@ include file="../header.jsp"%> 
<!-- 본문시작 bbsReplyProc.jsp-->
<%
	String wname	=request.getParameter("wname").trim();
	String subject  =request.getParameter("subject").trim();
	String content  =request.getParameter("content").trim();
	String passwd   =request.getParameter("passwd").trim();
	String ip	=request.getRemoteAddr();  
	int bbsno	=Integer.parseInt(request.getParameter("bbsno"));
		
	dto.setBbsno(bbsno);
	dto.setWname(wname);
	dto.setSubject(subject);
	dto.setContent(content);
	dto.setPasswd(passwd);
	dto.setIp(ip);
	
	
	int cnt=dao.reply(dto);
	
	//4) 글쓰기 성공 후 bbsList.jsp로 이동하기
	 if(cnt==0){
		 out.println("<p>답변 게시를 실패했습니다</p>");
		 out.println("<p><a href='javascript:history.back()'>[다시시도]</a></p>");  /* history.back() 뒤로 가겠다는 의미 */
	 }else{
		 out.println("<script>");
		 out.println("		alert('답변이 추가되었습니다');");
		 out.println("		location.href='bbsList.jsp';"); 
		 out.println("</script>");			 
	 }//if end
	
%>
<!-- 본문끝 -->
<%@ include file="../footer.jsp"%>

 

BbsDAO.java에 ReplyProc.jsp

 ⊙ 1~3) 단계가 모두 한번에 같이 움직여야함 → 트랜잭션을 해주면 수월

 ⊙ sql 변수를 또 만들지 않고 다시 사용하기 위해서 초기화 하는 것

 변수명(sql).delete(0, 변수명(sql).length());
public int reply(BbsDTO dto){
	int cnt=0;
	try{
		Connection con=DBOpen.getConnection();
		StringBuilder sql=new StringBuilder();
		//1) 부모글 정보 가져오기 (그룹번호, 들여쓰기, 글 순서) - select 문
		int grpno=0, indent=0, ansnum=0;
		sql.append(" SELECT grpno, indent, ansnum ");
		sql.append(" FROM tb_bbs ");
		sql.append(" WHERE bbsno=? ");
		
		PreparedStatement pstmt=con.prepareStatement(sql.toString());
		pstmt.setInt(1, dto.getBbsno());  //부모글번호
		
		ResultSet rs=pstmt.executeQuery();
		if(rs.next()){
			//부모글번호를 가져와서 위의 세 개의 변수에 담기
			grpno=rs.getInt("grpno");				
			indent=rs.getInt("indent");				
			ansnum=rs.getInt("ansnum");				
		}//if end
			
		//2) 글순서 재조정하기 - update문 (sql 변수를 또 만들지 않고 다시 사용할 건데 1번에서 이미 사용 - 1. 초기화를 하거나 2. 수를 또 잡던가)
		//   1)에서 썼던 sql참조변수값을 초기화하고 update 쿼리문을 넣을 것
		sql.delete(0, sql.length());  //sql참조변수값 초기화
		
		sql.append(" UPDATE tb_bbs ");
		sql.append(" SET ansnum=ansnum+1 ");
		sql.append(" WHERE (grpno=? AND ansnum>?) ");
		
		pstmt=con.prepareStatement(sql.toString());
		pstmt.setInt(1, grpno);
		pstmt.setInt(2, ansnum);
		pstmt.executeUpdate();		
		
		//3) 답변글 추가하기 - insert문
		sql.delete(0, sql.length());  //sql참조변수값 초기화
		
		sql.append(" INSERT INTO tb_bbs (bbsno, subject, content, wname, passwd, ip, grpno, indent, ansnum ) ");
		sql.append(" VALUES(	(SELECT nvl(MAX(bbsno),0)+1 FROM tb_bbs) ");
		sql.append("    , ?, ?, ?, ?, ?, ?, ?, ? ) ");
		
		pstmt=con.prepareStatement(sql.toString());
		pstmt.setString(1, dto.getSubject());
		pstmt.setString(2, dto.getContent());
		pstmt.setString(3, dto.getWname());
		pstmt.setString(4, dto.getPasswd());
		pstmt.setString(5, dto.getIp());
		pstmt.setInt(6, grpno);					//부모글 그룹번호
		pstmt.setInt(7, indent+1);				//부모글 들여쓰기 +1
		pstmt.setInt(8, ansnum+1);			//부모글 글순서+1
		
		cnt=pstmt.executeUpdate();
	}catch(Exception e){
		System.out.println("답변 실패 : "+e);
	}//try end
		return cnt;
	}//reply end

 

 

1. 답변이미지 출력

 ⊙ '목록'에서 생겨야하기 때문에 기존에 만든 bbsList.jps '목록'에서 제목 앞에 답변이미지 화살표 출력

 

2. 최고 조회수에 'hot' 붙이기

 ⊙ '제목' 뒤에 붙어야 하는 위치 확인할 것

 ⊙ BbsDTO list에 조회수를 체크할 readcnt가 있는지 확인

 

3. 새글에 new를 붙이기

   시간 설정을 해주어야 함 (PM11:59)에 올렸는데 1분만 new가 붙었다 사라지는 경우가 생길 수도 있기 때문에 방지하기 위함

  ⊙ 일단은 날짜를 기준으로 new를 붙이기로 함

<%@page import="net.utility.Utility"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ include file="ssi.jsp"%>
<%@ include file="../header.jsp"%>

<!-- 본문시작 bbsList.jsp -->
	<h2>BOARD LIST</h2>
<div class="container" style="font-size: 18px">	
	<table class="table table-hover">
	<tr class="active">
		<th>제목</th>
		<th>작성자</th>
		<th>작성일</th>
		<th>조회수</th>
	</tr>
<%
	ArrayList<BbsDTO> list=dao.list();
	if(list==null){	
		out.println("<tr>");
		out.println("	  <td colspan='4'><strong>관련자료 없음 T.T</strong></td>");
		out.println("</tr>");
	}else{
		//오늘 날짜를 "2019-09-06" 문자열
		String today=Utility.getDate();
		
	for(int idx=0; idx<list.size(); idx++){ 
		dto=list.get(idx);
%>
	<tr>
		<td width="300px">
<% 		
	//1. 답변이미지 출력
	for(int n=1; n<=dto.getIndent(); n++){
		out.println("<img src='../images/reply.gif'>");
	}//for end
%>		
	<a href="bbsRead.jsp?bbsno=<%=dto.getBbsno()%>"><%=dto.getSubject() %></a>
<%
	//2. 조회수가 10이상이면 hot 이미지 출력
	if(dto.getReadcnt()>=10){
		out.println("<img src='../images/hot.gif'>");
	}//if end
			
	//3. 오늘 작성한 글제목 뒤에 new를 붙여주기
	//regdt (작성일) 에서 "년월일"만 자르기 → 예)2019-09-04
	String regdt=dto.getRegdt().substring(0, 10);  //날짜 잘라오기
	if(regdt.equals(today)){
		out.println("<img src='../images/new.gif'>");
	}//if end
%>
	</td><!-- 직접 스타일을 넣는 것은 추천하지 않지만 코드에 익숙해지면 위에 넣어 수정하기 -->
	<td width="100px"><%=dto.getWname() %></td>
	<td width="200px"><%=dto.getRegdt().substring(0, 10) %></td>  <!-- 시분초를 없애고 싶으면 substring으로 글자를 년월일만 잘라냄 -->
	<td width="100px"><%=dto.getReadcnt() %></td>
	/tr>
<%
	}//for end
}//if end
%>
</table>
<p><a href="bbsForm.jsp" class="btn btn-default">글쓰기</a></p>
</div>
<!-- 본문끝 -->
<%@ include file="../footer.jsp"%>

 

8. 패키지 net.utility 만들고 전체 복사붙여넣기 → 알아서 클래스 만들어짐

http://pretyimo.cafe24.com/lectureRead.do?lectureno=258

 ⊙ static → 클래스명.변수명

                    클래스명.함수()

 ⊙ project Explorer에서 함수를 찾아서 쓰기 편함 (ABC 순으로 나열)

 ⊙ 모든 페이지에 적용하기 위해서 ssi.jsp 페이지에 import 해주기

Comments