일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 부트스트랩
- tomcat
- 성적프로그램
- HTML
- Bootstrap
- JavaScript
- 답변형 게시판
- git
- 한글 인코딩
- 모조칼럼
- alias
- JSP
- SQL
- github
- group by
- 과정평가형
- Oracle DB
- HTTP Status 404
- rownum
- sql developer
- distinct
- CRUD
- ||
- 제약조건
- Java
- Oracle SQL
- jQuery
- oracle
- 이클립스
- HTTP Status 500
초급의 끄적거림
[프로젝트] 답변형 게시판 (답변 / 새글표시 / 조회수 많은 글 표시) 본문
행 추가 종류
⊙ 행추가 : 새글쓰기 (어제까지 한 내용), 답변쓰기
- 새글쓰기와 답변의 차이
새글쓰기 | 답변 (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 (부모 다이나믹 메이즈) |
5 |
|
▶▶ 관철동 |
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 해주기
'실습' 카테고리의 다른 글
[프로젝트] 글 개수 / 한 페이지에 글 개수 / 페이징 (0) | 2019.09.10 |
---|---|
[프로젝트] 데이터베이스 복습 (답글 개수, 페이징 쿼리문) / 검색 폼 만들기 / 검색 목록으로 돌아가기 (0) | 2019.09.09 |
[프로젝트] 상세보기 (조회 수 삽입, 특수문자 삽입)/삭제/수정 (0) | 2019.09.05 |
[프로젝트] 경로 / 답변형 게시판 만들기 (폼, 쓰기, 글 목록) (0) | 2019.09.04 |
[프로젝트] 환경설정 / 부트스트랩을 이용해 개인사이트 프로젝트 만들기 (0) | 2019.09.03 |