KDT/WEB

240223 WEB 댓글,대댓글

001cloudid 2024. 2. 23. 17:30
728x90

답글 게시판

컬럼 추가 re_ref 답글그룹, re_lev 들여쓰기, re_seq 답글순서

 

DB 테이블 생성

create table reboard(
num int primary key,
name varchar(20),
subject varchar(50),
content varchar(500),
readcount int,
date timestamp,
re_ref int, //그룹
re_lev int,
re_sql int);

 

오름차순 정렬

글 번호 제목 re_ref re_lev re_seq
2 제목2 2 0 0
5 답글2 2 1 1
6 답글21 2 2 2
1 제목1 1 0 0
3 답글1 1 1 1
4 답글11 1 2 2

....

 

left.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<nav id="sub_menu">
<ul>
<li><a href="${pageContext.request.contextPath}/board/list">Notice</a></li>
<!-- <li><a href="#">Public News</a></li> -->
<li><a href="${pageContext.request.contextPath}/board/flist">Driver Download</a></li>
<li><a href="${pageContext.request.contextPath}/reboard/list">1:1문의</a></li>
<!-- <li><a href="#">Service Policy</a></li> -->
</ul>
</nav>

 

ReboardController

package com.itwillbs.controller;

import java.util.List;

import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import com.itwillbs.domain.BoardDTO;
import com.itwillbs.domain.PageDTO;
import com.itwillbs.service.ReBoardService;

@Controller
@RequestMapping("/reboard/*")
public class ReboardController {
	
	@Inject
	private ReBoardService reBoardService;
	
	@GetMapping("/list")
	public String list(HttpServletRequest request, PageDTO pageDTO, Model model) {
		System.out.println("ReboardController list()");
		
		//검색어 가져오기
		String search = request.getParameter("search");
		
		// 한 화면에 보여줄 글의 개수 설정
		int pageSize = 15;
		// pageNum에 파라미터 값을 가져오기
		String pageNum = request.getParameter("pageNum"); //request에서 값을 받아옴
		// pageNum값이 없으면 1로 설정
		if(pageNum == null) {
			pageNum = "1";
		}
		
		//pageNum => 정수형 변경
		int currentPage = Integer.parseInt(pageNum);
		
		//pageDTO에 저장
		pageDTO.setPageSize(pageSize);
		pageDTO.setPageNum(pageNum);
		pageDTO.setCurrentPage(currentPage);
		
		//검색어 추가
		pageDTO.setSearch(search);
		
		List<BoardDTO> boardList = reBoardService.getBoardList(pageDTO);
		
		//페이징 작업
		//전체 글의 개수 구하기 int count = getBoardCount(pageDTO) 검색어 포함
		int count = reBoardService.getBoardCount(pageDTO);
		//한 화면에 보여줄 페이지 개수 설정
		int pageBlock = 10;
		//한 화면에 보여줄 시작 페이지 구하기
		//1~10 => 1, 11~20 => 11,..
		int startPage = (currentPage-1)/pageBlock*pageBlock+1;
		
		//한 화면에 보여줄 끝 페이지 구하기
		int endPage = startPage + pageBlock -1;
		//전체 페이지 개수 구하기
		int pageCount = count / pageSize + (count%pageSize == 0 ? 0 : 1);
		if(endPage > pageCount) {
			endPage = pageCount; //끝 페이지, 전체 페이지 수를 비교해서 => 끝 페이지가 크면 전체 페이지 수로 끝 페이지 변경
		}
		
		
		//pageDTO 저장
		pageDTO.setCount(count); //[전체 글의 개수 ${pageDTO.count }]
		pageDTO.setPageBlock(pageBlock);
		pageDTO.setStartPage(startPage);
		pageDTO.setEndPage(endPage);
		pageDTO.setPageCount(pageCount);
		
		//model 저장
		model.addAttribute("pageDTO", pageDTO);
		
		model.addAttribute("boardList", boardList);
		
		// recenter/notice.jsp 주소변경없이 이동
		return "recenter/notice";
	}
	
	
	
	
}

 

ReBoardService

package com.itwillbs.service;

import java.util.List;

import javax.inject.Inject;

import org.springframework.stereotype.Service;

import com.itwillbs.dao.ReBoardDAO;
import com.itwillbs.domain.BoardDTO;
import com.itwillbs.domain.PageDTO;

@Service
public class ReBoardService {

	@Inject
	private ReBoardDAO reBoardDAO;
	
	public List<BoardDTO> getBoardList(PageDTO pageDTO) {
		System.out.println("ReBoardService getBoardList()");
		
		//시작하는 행 번호 구하기 (currentPage, pageSize를 이용해서)
		int currentPage = pageDTO.getCurrentPage();
		int pageSize = pageDTO.getPageSize();
		int startRow = (currentPage - 1) * pageSize + 1;
		
		//끝나는 행 번호 구하기
		int endRow = startRow + pageSize - 1;
		
		//pageDTO에 저장
		//boardMapper => limit(한계까지 자르기) 시작행 - 1, 개수
		pageDTO.setStartRow(startRow - 1);
		pageDTO.setEndRow(endRow);
		
		return reBoardDAO.getBoardList(pageDTO);
	}
	
	public int getBoardCount(PageDTO pageDTO) {
		System.out.println("ReBoardService getBoardCount()");
		return reBoardDAO.getBoardCount(pageDTO);
	}
	
	
	
}

 

ReBoardDAO

package com.itwillbs.dao;

import java.util.List;

import javax.inject.Inject;

import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Repository;

import com.itwillbs.domain.BoardDTO;
import com.itwillbs.domain.PageDTO;

@Repository
public class ReBoardDAO {

	@Inject
	private SqlSession sqlSession;
	
	private static final String namespace = "com.itwillbs.mappers.reBoardMapper";
	
	
	public List<BoardDTO> getBoardList(PageDTO pageDTO) {
		System.out.println("ReBoardDAO getBoardList()");
		System.out.println(pageDTO);
		return sqlSession.selectList(namespace+".getBoardList", pageDTO);
	}
	
	public int getBoardCount(PageDTO pageDTO) {
		System.out.println("ReBoardDAO getBoardCount()");
		return sqlSession.selectOne(namespace+".getBoardCount",pageDTO);
	}
	
	
}

 

reBoardMapper

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
  
<mapper namespace="com.itwillbs.mappers.reBoardMapper">

	<insert id="insertboard">
		insert into reboard(num, name, subject, content, readcount, date)
		values (#{num},#{name}, #{subject}, #{content}, #{readcount}, #{date}) 
	</insert>
	
	<select id="getMaxNum" resultType="java.lang.Integer">
		select max(num) from reboard
	</select>

	<select id="getBoardList" resultType="com.itwillbs.domain.BoardDTO">
		select * from reboard
		<if test="search !=null">
		where subject like CONCAT('%',#{search},'%')
		</if>
		order by num desc
		limit #{startRow},#{pageSize}
<!-- 		where 시작행 - 1, 개수 db에서 -1을 할 수 없기 때문에 reboardService에서 작업-->
	</select>

	<!-- 검색어 포함 -->
	<select id="getBoardCount" resultType="java.lang.Integer">
		select count(*)
		from reboard
		<if test="search !=null">
		where subject like CONCAT('%',#{search},'%');
		</if>
	</select>
	
	<select id="getboard" resultType="com.itwillbs.domain.BoardDTO">
		select *
		from reboard
		where num = #{num}
	</select>
		
	<update id="updateReadcount">
	update reboard
	set readcount = #{readcount}
	where num = #{num}
	</update>
	
	
	<update id="updateboard">
	update reboard
	set subject = #{subject}, content = #{content}
	where num = #{num}
	</update>
	
	<delete id="deleteboard">
	delete from reboard
	where num = #{num}
	</delete>
	

	
</mapper>

 

BoardDTO

package com.itwillbs.domain;

import java.sql.Timestamp;

public class BoardDTO {

	private int num;
	  private String name;
	  private String subject;
	  private String content;
	  private int readcount;
	  private Timestamp date;
	  //file 추가
	  private String file;
	  //답글 추가
	  private int re_ref;
	  private int re_lev;
	  private int re_seq;
	  
	  public int getRe_ref() {
		return re_ref;
	}


	public void setRe_ref(int re_ref) {
		this.re_ref = re_ref;
	}


	public int getRe_lev() {
		return re_lev;
	}


	public void setRe_lev(int re_lev) {
		this.re_lev = re_lev;
	}


	public int getRe_seq() {
		return re_seq;
	}


	public void setRe_seq(int re_seq) {
		this.re_seq = re_seq;
	}


	@Override
	public String toString() {
		return "BoardDTO [num=" + num + ", name=" + name + ", subject=" + subject + ", content=" + content
				+ ", readcount=" + readcount + ", date=" + date + ", file=" + file + ", re_ref=" + re_ref + ", re_lev="
				+ re_lev + ", re_seq=" + re_seq + "]";
	}
	  

	public int getNum() {
		return num;
	}
	public void setNum(int num) {
		this.num = num;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getSubject() {
		return subject;
	}
	public void setSubject(String subject) {
		this.subject = subject;
	}
	public String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
	}
	public int getReadcount() {
		return readcount;
	}
	public void setReadcount(int readcount) {
		this.readcount = readcount;
	}
	public Timestamp getDate() {
		return date;
	}
	public void setDate(Timestamp date) {
		this.date = date;
	}
	public String getFile() {
		return file;
	}
	public void setFile(String file) {
		this.file = file;
	}
	
	  
	  
}

 

recenter - content, notice, update, write

notice

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <!-- => 날짜 모양 변경 태그 라이브러리 -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>center/notice.jsp</title>
<link href="${pageContext.request.contextPath}/resources/css/default.css" rel="stylesheet" type="text/css">
<link href="${pageContext.request.contextPath}/resources/css/subpage.css" rel="stylesheet" type="text/css">
<!--[if lt IE 9]>
<script src="http://ie7-js.googlecode.com/svn/version/2.1(beta4)/IE9.js" type="text/javascript"></script>
<script src="http://ie7-js.googlecode.com/svn/version/2.1(beta4)/ie7-squish.js" type="text/javascript"></script>
<script src="http://html5shim.googlecode.com/svn/trunk/html5.js" type="text/javascript"></script>
<![endif]-->
<!--[if IE 6]>
 <script src="../script/DD_belatedPNG_0.0.8a.js"></script>
 <script>
   /* EXAMPLE */
   DD_belatedPNG.fix('#wrap');
   DD_belatedPNG.fix('#main_img');   

 </script>
 <![endif]-->
</head>
<body>
<div id="wrap">
<!-- 헤더들어가는 곳 -->
<jsp:include page="../inc/top.jsp" />
<!-- 헤더들어가는 곳 -->

<!-- 본문들어가는 곳 -->
<!-- 메인이미지 -->
<div id="sub_img_center"></div>
<!-- 메인이미지 -->

<!-- 왼쪽메뉴 -->
<jsp:include page="../inc/left.jsp" />
<!-- 왼쪽메뉴 -->

<!-- 게시판 -->
<article>
<h1>답글 Notice [전체 글의 개수 ${pageDTO.count }]</h1>
<table id="notice">
<tr><th class="tno">No.</th>
    <th class="ttitle">Title</th>
    <th class="twrite">Writer</th>
    <th class="tdate">Date</th>
    <th class="tread">Read</th></tr>

<c:forEach var="boardDTO" items="${boardList}">
<tr onclick="location.href='${pageContext.request.contextPath}/reboard/content?num=${boardDTO.num}'">
	<td>${boardDTO.num}</td>
	<td class="left">${boardDTO.subject}</td>
    <td>${boardDTO.name}</td>
    
    <td><fmt:formatDate value="${boardDTO.date}" pattern="yyyy-MM-dd"/></td>
    <td>${boardDTO.readcount}</td></tr>

</c:forEach>

</table>

<!-- 로그인을 하지 않으면 글쓰기 버튼이 보이지 않게 설정 -->
<c:if test="${!empty sessionScope.id }">
<div id="table_search">
<!-- location 자바스크립트 내장 객체 => 웹 브라우저 주소줄을 객체로 정의
     location 내장객체 멤버 변수 => href 변수 : 웹 브라우저 주소줄 내용을 저장하고 있는 변수
						  => href 변수 내용이 변경되어지면 웹 브라우저 주소도 변경 
						  location.href='${pageContext.request.contextPath}/board/write -->
<input type="button" value="글쓰기" class="btn" onclick="location.href='${pageContext.request.contextPath}/reboard/write'">
</div>
</c:if>

<div id="table_search">
<form action="${pageContext.request.contextPath}/reboard/list" method="get">
<input type="text" name="search" class="input_box">
<input type="button" value="search" class="btn">
</form>
</div>

<div class="clear"></div>
<div id="page_control">
<c:if test="${pageDTO.startPage > pageDTO.pageBlock }">
<a href="${pageContext.request.contextPath}/reboard/list?pageNum=${pageDTO.startPage - pageDTO.pageBlock}&search=${pageDTO.search}">Prev</a>
</c:if>

<c:forEach var="i" begin="${pageDTO.startPage }" end="${pageDTO.endPage }" step="1">
<a href="${pageContext.request.contextPath}/reboard/list?pageNum=${i}&search=${pageDTO.search}">${i}</a>
</c:forEach>

<c:if test="${pageDTO.endPage < pageDTO.pageCount}">
<a href="${pageContext.request.contextPath}/reboard/list?pageNum=${pageDTO.startPage + pageDTO.pageBlock}&search=${pageDTO.search}">Next</a>
</c:if>

</div>
</article>
<!-- 게시판 -->
<!-- 본문들어가는 곳 -->
<div class="clear"></div>
<!-- 푸터들어가는 곳 -->
<jsp:include page="../inc/bottom.jsp" />
<!-- 푸터들어가는 곳 -->
</div>
</body>
</html>

 

mapper

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
  
<mapper namespace="com.itwillbs.mappers.reBoardMapper">

	<insert id="insertboard">
		insert into reboard(num, name, subject, content, readcount, date)
		values (#{num},#{name}, #{subject}, #{content}, #{readcount}, #{date}) 
	</insert>
	
	<select id="getMaxNum" resultType="java.lang.Integer">
		select max(num) from reboard
	</select>

	<select id="getBoardList" resultType="com.itwillbs.domain.BoardDTO">
		select * from reboard
		<if test="search !=null">
		where subject like CONCAT('%',#{search},'%')
		</if>
		order by num desc
		limit #{startRow},#{pageSize}
<!-- 		where 시작행 - 1, 개수 db에서 -1을 할 수 없기 때문에 reboardService에서 작업-->
	</select>

	<!-- 검색어 포함 -->
	<select id="getBoardCount" resultType="java.lang.Integer">
		select count(*)
		from reboard
		<if test="search !=null">
		where subject like CONCAT('%',#{search},'%');
		</if>
	</select>
	
	<select id="getboard" resultType="com.itwillbs.domain.BoardDTO">
		select *
		from reboard
		where num = #{num}
	</select>
		
	<update id="updateReadcount">
	update reboard
	set readcount = #{readcount}
	where num = #{num}
	</update>
	
	
	<update id="updateboard">
	update reboard
	set subject = #{subject}, content = #{content}
	where num = #{num}
	</update>
	
	<delete id="deleteboard">
	delete from reboard
	where num = #{num}
	</delete>
	

	
</mapper>

 

write

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link href="${pageContext.request.contextPath}/resources/css/default.css" rel="stylesheet" type="text/css">
<link href="${pageContext.request.contextPath}/resources/css/subpage.css" rel="stylesheet" type="text/css">
<!--[if lt IE 9]>
<script src="http://ie7-js.googlecode.com/svn/version/2.1(beta4)/IE9.js" type="text/javascript"></script>
<script src="http://ie7-js.googlecode.com/svn/version/2.1(beta4)/ie7-squish.js" type="text/javascript"></script>
<script src="http://html5shim.googlecode.com/svn/trunk/html5.js" type="text/javascript"></script>
<![endif]-->
<!--[if IE 6]>
 <script src="../script/DD_belatedPNG_0.0.8a.js"></script>
 <script>
   /* EXAMPLE */
   DD_belatedPNG.fix('#wrap');
   DD_belatedPNG.fix('#main_img');   

 </script>
 <![endif]-->
</head>
<body>
<div id="wrap">
<!-- 헤더들어가는 곳 -->
<jsp:include page="../inc/top.jsp" />
<!-- 헤더들어가는 곳 -->

<!-- 본문들어가는 곳 -->
<!-- 메인이미지 -->
<div id="sub_img_center"></div>
<!-- 메인이미지 -->

<!-- 왼쪽메뉴 -->
<jsp:include page="../inc/left.jsp" />
<!-- 왼쪽메뉴 -->

<!-- 게시판 -->
<article>
<h1>답글 게시판 Write Notice</h1>
<form action="${pageContext.request.contextPath}/reboard/writePro" method="post">
<table id="notice">
<!-- 글쓴이 : 로그인 값 -->
<tr><td>글쓴이</td><td><input type="text" name="name" value="${sessionScope.id}" readonly></td></tr>
<!-- input name, value에 값을 넣어줘야 서버로 넘어감 -->
<tr><td>글제목</td><td><input type="text" name="subject" required></td></tr>
<tr><td>글내용</td><td><textarea name="content" rows="10" cols="20"></textarea></td></tr>


</table>

<div id="table_search">
<!-- location 자바스크립트 내장 객체 => 웹 브라우저 주소줄을 객체로 정의
     location 내장객체 멤버 변수 => href 변수 : 웹 브라우저 주소줄 내용을 저장하고 있는 변수
						  => href 변수 내용이 변경되어지면 웹 브라우저 주소도 변경 
						  location.href='${pageContext.request.contextPath}/board/write -->
<input type="submit" value="글쓰기" class="btn">
<input type="button" value="글목록" class="btn" onclick="location.href='${pageContext.request.contextPath}/reboard/list'">
</div>
</form>

<div class="clear"></div>
</article>
<!-- 게시판 -->
<!-- 본문들어가는 곳 -->
<div class="clear"></div>
<!-- 푸터들어가는 곳 -->
<jsp:include page="../inc/bottom.jsp" />
<!-- 푸터들어가는 곳 -->
</div>
</body>
</html>

 

ReboardController

	@PostMapping("/writePro")
	public String writePro(@RequestParam Map<String, Object> param) {
		System.out.println("ReBoardController writePro()");
		System.out.println(param);
		
		reBoardService.insertBoard(param);
		
		return "redirect:/reboard/list";
	}

 

ReBoardService

	public void insertBoard(Map<String, Object> param) {
		System.out.println("ReBoardService insertBoard");
		
		if(reBoardDAO.getMaxNum() == null) {
			//글 없음
			param.put("num", 1);
			param.put("re_ref", 1);
			
		}else {
			//글 있음
			param.put("num", reBoardDAO.getMaxNum()+1);
			//기본글
			//기준 글 번호 => 그룹 번호 일치
			param.put("re_ref", reBoardDAO.getMaxNum()+1);
		}
		
		param.put("num", reBoardDAO.getMaxNum()+1);
		param.put("readcount", 0);
		param.put("date",new Timestamp(System.currentTimeMillis()));
		
		//들여쓰기 0
		param.put("re_lev", 0);
		//순서 값
		param.put("re_seq", 0);
		
		
		reBoardDAO.insertBoard(param);
	}

 

ReBoardDAO

	public void insertBoard(Map<String, Object> param) {
		System.out.println("ReBoardDAO insertBoard()");
		System.out.println(param);
		sqlSession.insert(namespace+".insertBoard",param);
	}
	
	public Integer getMaxNum() {
		System.out.println("ReBoardDAO getMaxNum()");
		return sqlSession.selectOne(namespace+".getMaxNum");
	}

 

 

reBoardMapper

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
  
<mapper namespace="com.itwillbs.mappers.reBoardMapper">
	
<!-- parameterType="map" -->
	<insert id="insertboard" parameterType="map">
		insert into reboard(num, name, subject, content, readcount, date, re_ref, re_lev, re_seq)
		values (#{num},#{name}, #{subject}, #{content}, #{readcount}, #{date}, #{re_ref}, #{re_lev}, #{re_seq}) 
	</insert>
	
	<select id="getMaxNum" resultType="java.lang.Integer">
		select max(num) from reboard
	</select>

	<select id="getBoardList" resultType="com.itwillbs.domain.BoardDTO">
		select * from reboard
		<if test="search !=null">
		where subject like CONCAT('%',#{search},'%')
		</if>
		order by num desc
		limit #{startRow},#{pageSize}
<!-- 		where 시작행 - 1, 개수 db에서 -1을 할 수 없기 때문에 reboardService에서 작업-->
	</select>

	<!-- 검색어 포함 -->
	<select id="getBoardCount" resultType="java.lang.Integer">
		select count(*)
		from reboard
		<if test="search !=null">
		where subject like CONCAT('%',#{search},'%');
		</if>
	</select>
	
	<select id="getboard" resultType="com.itwillbs.domain.BoardDTO">
		select *
		from reboard
		where num = #{num}
	</select>
		
	<update id="updateReadcount">
	update reboard
	set readcount = #{readcount}
	where num = #{num}
	</update>
	
	
	<update id="updateboard">
	update reboard
	set subject = #{subject}, content = #{content}
	where num = #{num}
	</update>
	
	<delete id="deleteboard">
	delete from reboard
	where num = #{num}
	</delete>
	

	
</mapper>

 

DB만들때 re_sql로 생성했다. re_seq인데 위에는 re_seq로 썼지만 아래는 re_sql로 작성할 예정

 

ReboardController

	@GetMapping("/content")
	public String content(BoardDTO boardDTO, Model model) {
		System.out.println("ReBoardController content()");
		System.out.println(boardDTO);
		//조회수 증가
		reBoardService.updateReadcount(boardDTO);
		boardDTO = reBoardService.getBoard(boardDTO);
		
		
		//model 저장
		model.addAttribute("boardDTO", boardDTO);
		
		System.out.println(boardDTO);
		// board/content.jsp 글 목록으로 주소변경없이 이동
		return "/recenter/content";
	}

 

ReBoardService

	public BoardDTO getBoard(BoardDTO boardDTO) {
		System.out.println("ReBoardService getBoard()");
			
		return reBoardDAO.getBoard(boardDTO);
	}

	public void updateReadcount(BoardDTO boardDTO) {
		System.out.println("ReBoardService updateReadcount()");
		
		int readcount = boardDTO.getReadcount()+1;
		boardDTO.setReadcount(readcount);
		reBoardDAO.updateReadcount(boardDTO);
	}

 

ReBoardDAO

	public BoardDTO getBoard(BoardDTO boardDTO) {
		System.out.println("ReBoardDAO getBoard()");
		return sqlSession.selectOne(namespace+".getBoard", boardDTO);
	}

	public void updateReadcount(BoardDTO boardDTO) {
		System.out.println("ReBoardDAO updateReadcount()");
		sqlSession.update(namespace+".updateReadcount", boardDTO);
		
	}

 

content

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>center/content.jsp</title>
<link href="${pageContext.request.contextPath}/resources/css/default.css" rel="stylesheet" type="text/css">
<link href="${pageContext.request.contextPath}/resources/css/subpage.css" rel="stylesheet" type="text/css">
<!--[if lt IE 9]>
<script src="http://ie7-js.googlecode.com/svn/version/2.1(beta4)/IE9.js" type="text/javascript"></script>
<script src="http://ie7-js.googlecode.com/svn/version/2.1(beta4)/ie7-squish.js" type="text/javascript"></script>
<script src="http://html5shim.googlecode.com/svn/trunk/html5.js" type="text/javascript"></script>
<![endif]-->
<!--[if IE 6]>
 <script src="../script/DD_belatedPNG_0.0.8a.js"></script>
 <script>
   /* EXAMPLE */
   DD_belatedPNG.fix('#wrap');
   DD_belatedPNG.fix('#main_img');   

 </script>
 <![endif]-->
</head>
<body>
<div id="wrap">
<!-- 헤더들어가는 곳 -->
<jsp:include page="../inc/top.jsp" />
<!-- 헤더들어가는 곳 -->

<!-- 본문들어가는 곳 -->
<!-- 메인이미지 -->
<div id="sub_img_center"></div>
<!-- 메인이미지 -->

<!-- 왼쪽메뉴 -->
<jsp:include page="../inc/left.jsp" />
<!-- 왼쪽메뉴 -->

<!-- 게시판 -->
<article>
<h1>답글 게시판 Content Notice</h1>
<table id="notice">
<tr><td>글번호</td><td>${boardDTO.num}</td></tr>
<tr><td>글쓴이</td><td>${boardDTO.name}</td></tr>
<tr><td>조회수</td><td>${boardDTO.readcount}</td></tr>
<tr><td>작성일</td><td>${boardDTO.date}</td></tr>
<tr><td>글제목</td><td>${boardDTO.subject}</td></tr>
<tr><td>글내용</td><td>${boardDTO.content}</td></tr>
</table>

<div id="table_search">
<c:if test="${! empty sessionScope.id }">
		<input type="button" value="답글 쓰기" class="btn" onclick="location.href='${pageContext.request.contextPath}/reboard/rewrite?num=${boardDTO.num}'">
	<c:if test="${sessionScope.id eq boardDTO.name }">
		<input type="button" value="글수정" class="btn" onclick="location.href='${pageContext.request.contextPath}/reboard/update?num=${boardDTO.num}'">
		<input type="button" value="글삭제" class="btn" onclick="location.href='${pageContext.request.contextPath}/reboard/delete?num=${boardDTO.num}'">
	</c:if>
</c:if>

<input type="button" value="글목록" class="btn" onclick="location.href='${pageContext.request.contextPath}/reboard/list'">

</div>

<div class="clear"></div>
</article>
<!-- 게시판 -->
<!-- 본문들어가는 곳 -->
<div class="clear"></div>
<!-- 푸터들어가는 곳 -->
<jsp:include page="../inc/bottom.jsp" />
<!-- 푸터들어가는 곳 -->
</div>
</body>
</html>

ReboardController

	// /reboard/rewrite?num=
	@GetMapping("/rewrite")
	public String rewrite(BoardDTO boardDTO, Model model) {
		System.out.println("BoardController rewrite()");
		
		boardDTO = reBoardService.getBoard(boardDTO);
		
		model.addAttribute("boardDTO", boardDTO);
		return "recenter/rewrite";
	}

 

write를 복사해서 rewirte 만들고

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link href="${pageContext.request.contextPath}/resources/css/default.css" rel="stylesheet" type="text/css">
<link href="${pageContext.request.contextPath}/resources/css/subpage.css" rel="stylesheet" type="text/css">
<!--[if lt IE 9]>
<script src="http://ie7-js.googlecode.com/svn/version/2.1(beta4)/IE9.js" type="text/javascript"></script>
<script src="http://ie7-js.googlecode.com/svn/version/2.1(beta4)/ie7-squish.js" type="text/javascript"></script>
<script src="http://html5shim.googlecode.com/svn/trunk/html5.js" type="text/javascript"></script>
<![endif]-->
<!--[if IE 6]>
 <script src="../script/DD_belatedPNG_0.0.8a.js"></script>
 <script>
   /* EXAMPLE */
   DD_belatedPNG.fix('#wrap');
   DD_belatedPNG.fix('#main_img');   

 </script>
 <![endif]-->
</head>
<body>
<div id="wrap">
<!-- 헤더들어가는 곳 -->
<jsp:include page="../inc/top.jsp" />
<!-- 헤더들어가는 곳 -->

<!-- 본문들어가는 곳 -->
<!-- 메인이미지 -->
<div id="sub_img_center"></div>
<!-- 메인이미지 -->

<!-- 왼쪽메뉴 -->
<jsp:include page="../inc/left.jsp" />
<!-- 왼쪽메뉴 -->

<!-- 게시판 -->
<article>
<h1>답글 게시판 Rewrite Notice</h1>
<form action="${pageContext.request.contextPath}/reboard/rewritePro" method="post">
<input type="hidden" name="re_ref" value="${boardDTO.re_ref}">
<input type="hidden" name="re_lev" value="${boardDTO.re_lev}">
<input type="hidden" name="re_sql" value="${boardDTO.re_sql}">
<table id="notice">
<!-- 글쓴이 : 로그인 값 -->
<tr><td>글쓴이</td><td><input type="text" name="name" value="${sessionScope.id}" readonly></td></tr>
<!-- input name, value에 값을 넣어줘야 서버로 넘어감 -->
<tr><td>글제목</td><td><input type="text" name="subject" value="[답글]" required></td></tr>
<tr><td>글내용</td><td><textarea name="content" rows="10" cols="20"></textarea></td></tr>
</table>

<div id="table_search">
<!-- location 자바스크립트 내장 객체 => 웹 브라우저 주소줄을 객체로 정의
     location 내장객체 멤버 변수 => href 변수 : 웹 브라우저 주소줄 내용을 저장하고 있는 변수
						  => href 변수 내용이 변경되어지면 웹 브라우저 주소도 변경 
						  location.href='${pageContext.request.contextPath}/board/write -->
<input type="submit" value="답글 쓰기" class="btn">
<input type="button" value="글목록" class="btn" onclick="location.href='${pageContext.request.contextPath}/reboard/list'">
</div>
</form>

<div class="clear"></div>
</article>
<!-- 게시판 -->
<!-- 본문들어가는 곳 -->
<div class="clear"></div>
<!-- 푸터들어가는 곳 -->
<jsp:include page="../inc/bottom.jsp" />
<!-- 푸터들어가는 곳 -->
</div>
</body>
</html>

 

ReboardController

	@PostMapping("/rewritePro")
	public String rewritePro(@RequestParam Map<String, Object> param) {
		System.out.println("BoardController rewritePro()");
		System.out.println(param);
		
		reBoardService.reInsertBoard(param);
		
		return "redirect:/reboard/list";
	}

 

ReBoardService

	public void reInsertBoard(Map<String, Object> param) {
		System.out.println("ReBoardService reInsertBoard()");
		//param => name, subject, content, re_ref, re_lev, re_sql
		//num, readcount, date 처리 => param 저장
		
		if(reBoardDAO.getMaxNum() == null) {
			//글 없음
			param.put("num", 1);
			
		}else {
			//글 있음
			param.put("num", reBoardDAO.getMaxNum()+1);
		}
		
		param.put("readcount", 0);
		param.put("date",new Timestamp(System.currentTimeMillis()));
		
		//답글
		//답글 그룹 번호 그대로 사용
		
		//들여쓰기 기존값 + 1
		param.put("re_lev", Integer.parseInt(param.get("re_lev").toString())+1);
		//순서 값 기존값 + 1
		param.put("re_sql", Integer.parseInt(param.get("re_sql").toString())+1);
		
		reBoardDAO.insertBoard(param);
	}

 

정렬

reBoardMapper

	<select id="getBoardList" resultType="com.itwillbs.domain.BoardDTO">
		select * from reboard
		<if test="search !=null">
		where subject like CONCAT('%',#{search},'%')
		</if>
		order by re_ref desc, re_sql asc
		limit #{startRow},#{pageSize}
<!-- 		where 시작행 - 1, 개수 db에서 -1을 할 수 없기 때문에 reboardService에서 작업-->
	</select>

그림 1.

notice

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <!-- => 날짜 모양 변경 태그 라이브러리 -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>center/notice.jsp</title>
<link href="${pageContext.request.contextPath}/resources/css/default.css" rel="stylesheet" type="text/css">
<link href="${pageContext.request.contextPath}/resources/css/subpage.css" rel="stylesheet" type="text/css">
<!--[if lt IE 9]>
<script src="http://ie7-js.googlecode.com/svn/version/2.1(beta4)/IE9.js" type="text/javascript"></script>
<script src="http://ie7-js.googlecode.com/svn/version/2.1(beta4)/ie7-squish.js" type="text/javascript"></script>
<script src="http://html5shim.googlecode.com/svn/trunk/html5.js" type="text/javascript"></script>
<![endif]-->
<!--[if IE 6]>
 <script src="../script/DD_belatedPNG_0.0.8a.js"></script>
 <script>
   /* EXAMPLE */
   DD_belatedPNG.fix('#wrap');
   DD_belatedPNG.fix('#main_img');   

 </script>
 <![endif]-->
</head>
<body>
<div id="wrap">
<!-- 헤더들어가는 곳 -->
<jsp:include page="../inc/top.jsp" />
<!-- 헤더들어가는 곳 -->

<!-- 본문들어가는 곳 -->
<!-- 메인이미지 -->
<div id="sub_img_center"></div>
<!-- 메인이미지 -->

<!-- 왼쪽메뉴 -->
<jsp:include page="../inc/left.jsp" />
<!-- 왼쪽메뉴 -->

<!-- 게시판 -->
<article>
<h1>답글 Notice [전체 글의 개수 ${pageDTO.count }]</h1>
<table id="notice">
<tr><th class="tno">No.</th>
    <th class="ttitle">Title</th>
    <th class="twrite">Writer</th>
    <th class="tdate">Date</th>
    <th class="tread">Read</th></tr>

<c:forEach var="boardDTO" items="${boardList}">
<tr onclick="location.href='${pageContext.request.contextPath}/reboard/content?num=${boardDTO.num}'">
	<td>${boardDTO.num}</td>
	<td class="left">
	<c:if test="${boardDTO.re_lev >0}">
		<img src="${pageContext.request.contextPath}/resources/images/recenter/level.gif">
		<img src="${pageContext.request.contextPath}/resources/images/recenter/re.gif">
	</c:if>
	${boardDTO.subject}</td>
    <td>${boardDTO.name}</td>
    
    <td><fmt:formatDate value="${boardDTO.date}" pattern="yyyy-MM-dd"/></td>
    <td>${boardDTO.readcount}</td></tr>

</c:forEach>

</table>

<!-- 로그인을 하지 않으면 글쓰기 버튼이 보이지 않게 설정 -->
<c:if test="${!empty sessionScope.id }">
<div id="table_search">
<!-- location 자바스크립트 내장 객체 => 웹 브라우저 주소줄을 객체로 정의
     location 내장객체 멤버 변수 => href 변수 : 웹 브라우저 주소줄 내용을 저장하고 있는 변수
						  => href 변수 내용이 변경되어지면 웹 브라우저 주소도 변경 
						  location.href='${pageContext.request.contextPath}/board/write -->
<input type="button" value="글쓰기" class="btn" onclick="location.href='${pageContext.request.contextPath}/reboard/write'">
</div>
</c:if>

<div id="table_search">
<form action="${pageContext.request.contextPath}/reboard/list" method="get">
<input type="text" name="search" class="input_box">
<input type="button" value="search" class="btn">
</form>
</div>

<div class="clear"></div>
<div id="page_control">
<c:if test="${pageDTO.startPage > pageDTO.pageBlock }">
<a href="${pageContext.request.contextPath}/reboard/list?pageNum=${pageDTO.startPage - pageDTO.pageBlock}&search=${pageDTO.search}">Prev</a>
</c:if>

<c:forEach var="i" begin="${pageDTO.startPage }" end="${pageDTO.endPage }" step="1">
<a href="${pageContext.request.contextPath}/reboard/list?pageNum=${i}&search=${pageDTO.search}">${i}</a>
</c:forEach>

<c:if test="${pageDTO.endPage < pageDTO.pageCount}">
<a href="${pageContext.request.contextPath}/reboard/list?pageNum=${pageDTO.startPage + pageDTO.pageBlock}&search=${pageDTO.search}">Next</a>
</c:if>

</div>
</article>
<!-- 게시판 -->
<!-- 본문들어가는 곳 -->
<div class="clear"></div>
<!-- 푸터들어가는 곳 -->
<jsp:include page="../inc/bottom.jsp" />
<!-- 푸터들어가는 곳 -->
</div>
</body>
</html>

 

그림 2.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <!-- => 날짜 모양 변경 태그 라이브러리 -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>center/notice.jsp</title>
<link href="${pageContext.request.contextPath}/resources/css/default.css" rel="stylesheet" type="text/css">
<link href="${pageContext.request.contextPath}/resources/css/subpage.css" rel="stylesheet" type="text/css">
<!--[if lt IE 9]>
<script src="http://ie7-js.googlecode.com/svn/version/2.1(beta4)/IE9.js" type="text/javascript"></script>
<script src="http://ie7-js.googlecode.com/svn/version/2.1(beta4)/ie7-squish.js" type="text/javascript"></script>
<script src="http://html5shim.googlecode.com/svn/trunk/html5.js" type="text/javascript"></script>
<![endif]-->
<!--[if IE 6]>
 <script src="../script/DD_belatedPNG_0.0.8a.js"></script>
 <script>
   /* EXAMPLE */
   DD_belatedPNG.fix('#wrap');
   DD_belatedPNG.fix('#main_img');   

 </script>
 <![endif]-->
</head>
<body>
<div id="wrap">
<!-- 헤더들어가는 곳 -->
<jsp:include page="../inc/top.jsp" />
<!-- 헤더들어가는 곳 -->

<!-- 본문들어가는 곳 -->
<!-- 메인이미지 -->
<div id="sub_img_center"></div>
<!-- 메인이미지 -->

<!-- 왼쪽메뉴 -->
<jsp:include page="../inc/left.jsp" />
<!-- 왼쪽메뉴 -->

<!-- 게시판 -->
<article>
<h1>답글 Notice [전체 글의 개수 ${pageDTO.count }]</h1>
<table id="notice">
<tr><th class="tno">No.</th>
    <th class="ttitle">Title</th>
    <th class="twrite">Writer</th>
    <th class="tdate">Date</th>
    <th class="tread">Read</th></tr>

<c:forEach var="boardDTO" items="${boardList}">
<tr onclick="location.href='${pageContext.request.contextPath}/reboard/content?num=${boardDTO.num}'">
	<td>${boardDTO.num}</td>
	<td class="left">
	<c:if test="${boardDTO.re_lev >0}">
		<img src="${pageContext.request.contextPath}/resources/images/recenter/level.gif" width="${boardDTO.re_lev * 10 }">
		<img src="${pageContext.request.contextPath}/resources/images/recenter/re.gif">
	</c:if>
	${boardDTO.subject}</td>
    <td>${boardDTO.name}</td>
    
    <td><fmt:formatDate value="${boardDTO.date}" pattern="yyyy-MM-dd"/></td>
    <td>${boardDTO.readcount}</td></tr>

</c:forEach>

</table>

<!-- 로그인을 하지 않으면 글쓰기 버튼이 보이지 않게 설정 -->
<c:if test="${!empty sessionScope.id }">
<div id="table_search">
<!-- location 자바스크립트 내장 객체 => 웹 브라우저 주소줄을 객체로 정의
     location 내장객체 멤버 변수 => href 변수 : 웹 브라우저 주소줄 내용을 저장하고 있는 변수
						  => href 변수 내용이 변경되어지면 웹 브라우저 주소도 변경 
						  location.href='${pageContext.request.contextPath}/board/write -->
<input type="button" value="글쓰기" class="btn" onclick="location.href='${pageContext.request.contextPath}/reboard/write'">
</div>
</c:if>

<div id="table_search">
<form action="${pageContext.request.contextPath}/reboard/list" method="get">
<input type="text" name="search" class="input_box">
<input type="button" value="search" class="btn">
</form>
</div>

<div class="clear"></div>
<div id="page_control">
<c:if test="${pageDTO.startPage > pageDTO.pageBlock }">
<a href="${pageContext.request.contextPath}/reboard/list?pageNum=${pageDTO.startPage - pageDTO.pageBlock}&search=${pageDTO.search}">Prev</a>
</c:if>

<c:forEach var="i" begin="${pageDTO.startPage }" end="${pageDTO.endPage }" step="1">
<a href="${pageContext.request.contextPath}/reboard/list?pageNum=${i}&search=${pageDTO.search}">${i}</a>
</c:forEach>

<c:if test="${pageDTO.endPage < pageDTO.pageCount}">
<a href="${pageContext.request.contextPath}/reboard/list?pageNum=${pageDTO.startPage + pageDTO.pageBlock}&search=${pageDTO.search}">Next</a>
</c:if>

</div>
</article>
<!-- 게시판 -->
<!-- 본문들어가는 곳 -->
<div class="clear"></div>
<!-- 푸터들어가는 곳 -->
<jsp:include page="../inc/bottom.jsp" />
<!-- 푸터들어가는 곳 -->
</div>
</body>
</html>

 

그림 3.

 

중간에 글 넣기

글 번호 제목 re_ref re_lev re_seq
2 제목2 2 0 0
7 답글1 2 1 1
5 답글2 2 1 1+1 => 2
6 답글21 2 2 2+1 => 3
1 제목1 1 0 0
3 답글1 1 1 1
4 답글11 1 2 2

 

insert하기전 순서값 재배치

 

ReBoardService

	public void reInsertBoard(Map<String, Object> param) {
		System.out.println("ReBoardService reInsertBoard()");
		//param => name, subject, content, re_ref, re_lev, re_sql
		//num, readcount, date 처리 => param 저장
		
		if(reBoardDAO.getMaxNum() == null) {
			//글 없음
			param.put("num", 1);
			
		}else {
			//글 있음
			param.put("num", reBoardDAO.getMaxNum()+1);
		}
		
		param.put("readcount", 0);
		param.put("date",new Timestamp(System.currentTimeMillis()));
		
		//기존 답글의 순서를 재배치
		reBoardDAO.updateResql(param);
		
		
		//답글
		//답글 그룹 번호 그대로 사용
		
		//들여쓰기 기존값 + 1
		param.put("re_lev", Integer.parseInt(param.get("re_lev").toString())+1);
		//순서 값 기존값 + 1
		param.put("re_sql", Integer.parseInt(param.get("re_sql").toString())+1);
		
		reBoardDAO.insertBoard(param);
	}

 

ReBoardDAO

	public void updateResql(Map<String, Object> param) {
		System.out.println("ReBoardDAO updateResql()");
		
		sqlSession.update(namespace+".updateResql",param);
	}

 

reBoardMapper

<!-- 답글 순서 재배치 => 같은 그룹이면서 답글이 있으면(답글의 순서값이 큰 값이 있으면) => 답글의 순서를 1칸 아래로 재배치 -->
	<update id="updateResql">
	update reboard
	set re_sql = re_sql + 1
	where re_ref = #{re_ref} and re_sql > #{re_sql}
	</update>

 

 

728x90