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>
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>
<%@ 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>
중간에 글 넣기
글 번호 | 제목 | 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
'KDT > WEB' 카테고리의 다른 글
240307 WEB - 정리 1, 보안 취약점 1 (0) | 2024.03.07 |
---|---|
240227 WEB - Map (0) | 2024.02.27 |
2410220 WEB 메인에서 최신 글 보여주기, 게시판 검색 (0) | 2024.02.20 |
240219 WEB - 파일 업로드2, 갤러리 게시판, AJAX를 이용한 중복확인 (0) | 2024.02.19 |
240215 WEB - 글 수정, 삭제, 파일 업로드 1 (0) | 2024.02.15 |