Domain - QnaBoard
@Data
public class QnaBoard {
private Integer qnaBoardNum;
private Integer memberNum;
private String memberName;
private String qnaBoardTitle;
private String qnaBoardContent;
private Date qnaBoardDate;
private Integer count;
private String cmtContent;
private Date cmtDate;
private String keyword;
public QnaBoard(Integer qnaBoardNum, Integer memberNum, String qnaBoardTitle, String qnaBoardContent, Date qnaBoardDate) {
this.qnaBoardNum = qnaBoardNum;
this.memberNum = memberNum;
this.qnaBoardTitle = qnaBoardTitle;
this.qnaBoardContent = qnaBoardContent;
this.qnaBoardDate = qnaBoardDate;
}
public QnaBoard(){}
}
Domain - QnaBoardWrite
@Data
public class QnaBoardWrite {
private String title;
private String content;
private Integer mno;
private Integer cno;
private Integer bno;
}
Service - QnaBoardService
@Service
@RequiredArgsConstructor
public class QnaBoardService {
@Autowired
QnaBoardMapper qnaBoardMapper;
@Transactional
public List<QnaBoard> selectAllList() { //리스트로 출력시
List<QnaBoard> list = qnaBoardMapper.selectAllList();
return list;
}
@Transactional
public List<QnaBoard> selectViewByNum(Integer memberNum) { //리스트로 출력시
List<QnaBoard> list = qnaBoardMapper.selectViewByNum(memberNum);
return list;
}
@Transactional
public QnaBoard selectView(Integer qnaBoardNum) {
QnaBoard view = qnaBoardMapper.selectView(qnaBoardNum);
return view;
}
@Transactional
public void boardWrite(QnaBoardWrite br) {
QnaBoard newboard = new QnaBoard(0, br.getMno(), br.getTitle(), br.getContent(), null);
qnaBoardMapper.insertBoard(newboard);
}
@Transactional
public void boardDelete(Integer qnaBoardNum) {
qnaBoardMapper.deleteBoard(qnaBoardNum);
}
@Transactional
public void boardEdit(QnaBoardWrite br) {
QnaBoard board = qnaBoardMapper.selectView(br.getBno());
board.setQnaBoardTitle(br.getTitle());
board.setQnaBoardContent(br.getContent());
qnaBoardMapper.updateBoard(board);
}
@Transactional
public List<Comment> cmtList(Integer qnaBoardNum) {
List<Comment> cmt = qnaBoardMapper.selectByNum(qnaBoardNum);
return cmt;
}
@Transactional
public void cmtWrite(CommentWrite cmtWrite) {
Comment cmt = new Comment(0, cmtWrite.getContent(),null,cmtWrite.getBno());
qnaBoardMapper.insertCmt(cmt);
}
@Transactional
public void cmtDelete(Integer cmtNum) { qnaBoardMapper.deleteCmt(cmtNum); }
@Transactional
public Integer pagingCount() {
Integer count = qnaBoardMapper.pagingCount();
return count;
}
@Transactional
public Integer pagingCountSearch(Paging paging) {
Integer count = qnaBoardMapper.pagingCountSearch(paging);
return count;
}
@Transactional
public List<QnaBoard> selectBoardPaging(Paging paging) { //리스트로 출력시
List<QnaBoard> list = qnaBoardMapper.selectBoardPaging(paging);
return list;
}
@Transactional
public String totalCntJudge(int totalCnt) {
String judge = "";
if(totalCnt > 100) judge = "101";
if(totalCnt == 100) judge = "100";
if(totalCnt < 100) judge = "99";
return judge;
}
@Transactional
public List<QnaBoard> selectSearchPaging(Paging paging) {
List<QnaBoard> list = qnaBoardMapper.selectSearchPaging(paging);
return list;
}
}
Controller - QnaBoardController
@RequiredArgsConstructor
@Controller
public class QnaBoardController {
private final QnaBoardService qnaBoardService;
@GetMapping("/qnaBoard")
public String qnaBoardList(@ModelAttribute("QnaBoard") QnaBoard qnaBoard, Model model,
@RequestParam(value = "section", defaultValue = "1") int section,
@RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
@RequestParam(value = "keyword", required = false) String keyword) {
if (keyword==null){
Paging paging = new Paging(section, pageNum);
int totalCnt = qnaBoardService.pagingCount();
List<QnaBoard> list = qnaBoardService.selectBoardPaging(paging);
String totalCntJudge = qnaBoardService.totalCntJudge(totalCnt);
model.addAttribute("totalCntJudge", totalCntJudge);
model.addAttribute("totalCnt", totalCnt);
model.addAttribute("section", section);
model.addAttribute("pageNum", pageNum);
model.addAttribute("boardList", list);
System.out.println("키워드 없음 실행");
} else if(keyword!=null){
Paging paging = new Paging(keyword,section, pageNum);
int totalCnt = qnaBoardService.pagingCountSearch(paging);
List<QnaBoard> list = qnaBoardService.selectBoardPaging(paging);
String totalCntJudge = qnaBoardService.totalCntJudge(totalCnt);
model.addAttribute("totalCntJudge", totalCntJudge);
model.addAttribute("totalCnt", totalCnt);
model.addAttribute("section", section);
model.addAttribute("pageNum", pageNum);
model.addAttribute("boardList", list);
System.out.println("키워드 있음 실행");
}
return "qnaBoard/list";
}
@GetMapping("/qnaBoard/view/{qnaBoardNum}") //회원만 접근 가능
public String qnaBoardView(@PathVariable("qnaBoardNum") int qnaBoardNum,
@ModelAttribute("QnaBoard") QnaBoard qnaBoard, Model model, HttpSession session) {
AuthInfo ai = (AuthInfo) session.getAttribute("authInfo");
if (ai == null) { //로그인 안했으면 게시글 읽기 불가
return "accessFail";
}
QnaBoard view = qnaBoardService.selectView(qnaBoardNum);
model.addAttribute("view", view);
List<Comment> cmt = qnaBoardService.cmtList(qnaBoardNum);
model.addAttribute("cmt", cmt);
return "qnaBoard/view";
}
@GetMapping("/qnaBoard/write")
public String qnaBoardWriteForm(Model model, HttpServletRequest request, HttpSession session,
@RequestParam(value = "section", defaultValue = "1") int section,
@RequestParam(value = "pageNum", defaultValue = "1") int pageNum) {
AuthInfo ai = (AuthInfo) session.getAttribute("authInfo");
if (ai == null) { //로그인 안했으면 게시글 쓰기 불가
return "accessFail";
}
model.addAttribute("formWrite", new QnaBoardWrite());
int totalCnt = qnaBoardService.pagingCount();
Paging paging = new Paging(section, pageNum);
List<QnaBoard> list = qnaBoardService.selectBoardPaging(paging);
String totalCntJudge = qnaBoardService.totalCntJudge(totalCnt);
model.addAttribute("totalCntJudge", totalCntJudge);
model.addAttribute("totalCnt", totalCnt);
model.addAttribute("section", section);
model.addAttribute("pageNum", pageNum);
model.addAttribute("boardList", list);
return "qnaBoard/write";
}
@RequestMapping(value = "/qnaBoard/formwrite", method = RequestMethod.GET) //글쓰기
public String qnaBoardWrite(QnaBoardWrite qnaBoardWrite, Model model, HttpSession session,
@RequestParam(value = "section", defaultValue = "1") int section,
@RequestParam(value = "pageNum", defaultValue = "1") int pageNum) {
AuthInfo ai = (AuthInfo) session.getAttribute("authInfo");
qnaBoardWrite.setMno(ai.getNo());
model.addAttribute("formWrite");
qnaBoardService.boardWrite(qnaBoardWrite);
int totalCnt = qnaBoardService.pagingCount();
Paging paging = new Paging(section, pageNum);
List<QnaBoard> list = qnaBoardService.selectBoardPaging(paging);
String totalCntJudge = qnaBoardService.totalCntJudge(totalCnt);
model.addAttribute("totalCntJudge", totalCntJudge);
model.addAttribute("totalCnt", totalCnt);
model.addAttribute("section", section);
model.addAttribute("pageNum", pageNum);
model.addAttribute("boardList", list);
return "qnaBoard/list";
}
@GetMapping(value="/qnaBoard/edit/{qnaBoardNum}") //수정 버튼 누르면 글쓴이와 대조
public String qnaBoardEdit(@PathVariable("qnaBoardNum") int qnaBoardNum,Model model,HttpSession session,
HttpServletResponse response) throws IOException {
model.addAttribute("formEdit", new QnaBoardWrite());
AuthInfo ai = (AuthInfo) session.getAttribute("authInfo");
QnaBoard view = qnaBoardService.selectView(qnaBoardNum);
if (ai.getNo() == view.getMemberNum()) {
model.addAttribute("view", view);
return "qnaBoard/edit";
} else if (ai.getNo() != view.getMemberNum()) {
response.setContentType("text/html; charset=euc-kr");
PrintWriter out = response.getWriter();
out.println("<script>alert('작성자 본인만 게시글을 수정할 수 있습니다. 게시판 리스트로 돌아갑니다.'); </script>");
out.println("<script>location.href='/qnaBoard' </script>");
out.flush();
}
return "qnaBoard/list";
}
@PostMapping(value="/qnaBoard/edit")
public String qnaBoardEditForm(@ModelAttribute QnaBoardWrite qnaBoardWrite, Model model){
qnaBoardService.boardEdit(qnaBoardWrite);
return "redirect:/qnaBoard/view/" + qnaBoardWrite.getBno();
}
@RequestMapping(value="/qnaBoard/delete/{qnaBoardNum}") //게시글 삭제
public String delete(@PathVariable("qnaBoardNum") int qnaBoardNum, Model model,
@RequestParam(value = "section", defaultValue="1") int section,
@RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
HttpSession session, HttpServletResponse response) throws IOException {
AuthInfo ai = (AuthInfo)session.getAttribute("authInfo");
QnaBoard view = qnaBoardService.selectView(qnaBoardNum);
if (ai.getNo() == view.getMemberNum()) {
qnaBoardService.boardDelete(qnaBoardNum);
int totalCnt = qnaBoardService.pagingCount();
Paging paging = new Paging(section,pageNum);
List<QnaBoard> list = qnaBoardService.selectBoardPaging(paging);
String totalCntJudge = qnaBoardService.totalCntJudge(totalCnt);
model.addAttribute("totalCntJudge", totalCntJudge);
model.addAttribute("totalCnt", totalCnt);
model.addAttribute("section", section);
model.addAttribute("pageNum", pageNum);
model.addAttribute("boardList", list);
return "qnaBoard/list";
}else if(ai.getNo() != view.getMemberNum()){
response.setContentType("text/html; charset=euc-kr");
PrintWriter out = response.getWriter();
out.println("<script>alert('작성자 본인만 게시글을 삭제할 수 있습니다. 게시판 리스트로 돌아갑니다.'); </script>");
out.println("<script>location.href='/qnaBoard'</script>");
out.flush();
}
int totalCnt = qnaBoardService.pagingCount();
Paging paging = new Paging(section,pageNum);
List<QnaBoard> list = qnaBoardService.selectBoardPaging(paging);
String totalCntJudge = qnaBoardService.totalCntJudge(totalCnt);
model.addAttribute("totalCntJudge", totalCntJudge);
model.addAttribute("totalCnt", totalCnt);
model.addAttribute("section", section);
model.addAttribute("pageNum", pageNum);
model.addAttribute("boardList", list);
return "qnaBoard/list";
}
////////////////////////////////////////////////////////////////////////////////////코멘트
@GetMapping("/qnaBoard/cmtWrite/{qnaBoardNum}") //답변은 관리자만 작성 가능
public String cmtWriteForm(@PathVariable("qnaBoardNum") int qnaBoardNum,Model model, HttpSession session){
QnaBoard view = qnaBoardService.selectView(qnaBoardNum);
model.addAttribute("view", view);
model.addAttribute("cmtWrite",new QnaBoardWrite());
return "qnaBoard/cmtWrite";
}
@RequestMapping(value="/qnaBoard/cmtWrite/cmtWrite", method= RequestMethod.POST) //답변쓰기
public String cmtWrite(CommentWrite cmtWrite, Model model, HttpSession session) {
qnaBoardService.cmtWrite(cmtWrite);
List<QnaBoard> list = qnaBoardService.selectAllList();
model.addAttribute("boardList",list);
return "redirect:/qnaBoard/view/" + cmtWrite.getBno();
}
@RequestMapping(value="/qnaBoard/cmtDelete/{cmtNum}")
public String cmtDelete(@PathVariable("cmtNum") int cmtNum, Model model,
@RequestParam(value = "section", defaultValue="1") int section,
@RequestParam(value = "pageNum", defaultValue = "1") int pageNum) {
qnaBoardService.cmtDelete(cmtNum);
int totalCnt = qnaBoardService.pagingCount();
Paging paging = new Paging(section,pageNum);
List<QnaBoard> list = qnaBoardService.selectBoardPaging(paging);
String totalCntJudge = qnaBoardService.totalCntJudge(totalCnt);
model.addAttribute("totalCntJudge", totalCntJudge);
model.addAttribute("totalCnt", totalCnt);
model.addAttribute("section", section);
model.addAttribute("pageNum", pageNum);
model.addAttribute("boardList", list);
return "qnaBoard/list";
}
///////////////////////////////////////////////////////////////////////////////////////////////게시글 검색기능
@RequestMapping(value="/qnaBoard/search")
public String qnaBoardSearch(@RequestParam(value="keyword", required = false) String keyword, Model model,
@RequestParam(value = "section", defaultValue = "1") int section,
@RequestParam(value = "pageNum", defaultValue = "1") int pageNum) {
Paging paging = new Paging(keyword, section, pageNum);
int totalCnt = qnaBoardService.pagingCountSearch(paging);
List<QnaBoard> list = qnaBoardService.selectSearchPaging(paging);
String totalCntJudge = qnaBoardService.totalCntJudge(totalCnt);
model.addAttribute("totalCntJudge", totalCntJudge);
model.addAttribute("totalCnt", totalCnt);
model.addAttribute("section", section);
model.addAttribute("pageNum", pageNum);
model.addAttribute("boardList", list);
model.addAttribute("keyword", keyword);
return "qnaBoard/list";
}
}
Resources - qnaBoardMapper
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="team.kyp.kypcoffee.mapper.QnaBoardMapper">
<sql id="selectAll">
SELECT * FROM qna_board
</sql>
<select id="selectAllList" resultType="team.kyp.kypcoffee.domain.QnaBoard">
SELECT qnaBoardNum, b.memberNum, m.memberName, qnaBoardTitle, qnaBoardDate, qnaBoardContent
FROM qna_board b left outer join member m on b.memberNum = m.memberNum
ORDER BY qnaBoardNum DESC
</select>
<select id="selectViewByNum" resultType="team.kyp.kypcoffee.domain.QnaBoard">
SELECT b.qnaBoardNum, b.memberNum, qnaBoardTitle, qnaBoardContent, qnaBoardDate, c.cmtDate, c.cmtContent
FROM qna_board b left outer join cmt c on b.qnaBoardNum = c.qnaBoardNum
WHERE b.memberNum=#{memberNum}
</select>
<select id="selectView" resultType="team.kyp.kypcoffee.domain.QnaBoard">
SELECT qnaBoardNum, b.memberNum, m.memberName, qnaBoardTitle, qnaBoardDate, qnaBoardContent
FROM qna_board b left outer join member m on b.memberNum = m.memberNum
WHERE qnaBoardNum=#{qnaBoardNum}
</select>
<select id="selectById" parameterType="String">
<include refid="selectAll" />
WHERE memberId=#{memberId}
</select>
<update id="updateBoard" parameterType="team.kyp.kypcoffee.domain.QnaBoard">
UPDATE qna_board
SET qnaBoardTitle=#{qnaBoardTitle}, qnaBoardContent=#{qnaBoardContent}
WHERE qnaBoardNum=#{qnaBoardNum}
</update>
<insert id="insertBoard" parameterType="team.kyp.kypcoffee.domain.QnaBoard">
INSERT INTO qna_board
VALUES(qna_board_seq.nextval,#{memberNum},#{qnaBoardTitle},#{qnaBoardContent},SYSDATE)
</insert>
<delete id="deleteBoard" parameterType="Integer">
DELETE qna_board WHERE qnaBoardNum=#{qnaBoardNum}
</delete>
<!--_________________________________________________________________-->
<select id="selectByNum" resultType="team.kyp.kypcoffee.domain.Comment">
SELECT * FROM cmt
WHERE qnaBoardNum=#{qnaBoardNum}
</select>
<insert id="insertCmt" parameterType="team.kyp.kypcoffee.domain.Comment">
INSERT INTO cmt
VALUES(comments_seq.nextval,#{cmtContent},SYSDATE,#{qnaBoardNum})
</insert>
<delete id="deleteCmt" parameterType="Integer">
DELETE cmt WHERE cmtNum=#{cmtNum}
</delete>
<!--_________________________________________________________________-->
<select id="pagingCount" resultType="int">
SELECT COUNT(*) FROM qna_board
</select>
<select id="pagingCountSearch" resultType="int">
SELECT COUNT(*) FROM qna_board b1 join member m on b1.memberNum=m.memberNum where REGEXP_LIKE(memberName||qnaBoardTitle||qnaBoardContent,#{keyword})
</select>
<select id="selectBoardPaging" resultType="team.kyp.kypcoffee.domain.QnaBoard">
SELECT RN ,qnaBoardNum, memberName, qnaBoardTitle,qnaBoardDate,qnaBoardContent,
(select count(*) from cmt c join qna_board b on b.qnaBoardNum = c.qnaBoardNum where b2.qnaBoardNum=b.qnaBoardNum) as count
FROM
(SELECT ROWNUM as RN ,qnaBoardNum, memberName, qnaBoardTitle,qnaBoardDate,qnaBoardContent
FROM (SELECT * FROM qna_board b1 join member m on b1.memberNum=m.memberNum
ORDER BY qnaBoardNum DESC)) b2
WHERE RN BETWEEN (#{section}-1)*100+(#{pageNum}-1)*10+1 AND (#{section}-1)*100+(#{pageNum})*10
</select>
<select id="selectSearchPaging" resultType="team.kyp.kypcoffee.domain.QnaBoard">
SELECT RN ,qnaBoardNum, memberName, qnaBoardTitle,qnaBoardDate,qnaBoardContent,
(select count(*) from cmt c join qna_board b on b.qnaBoardNum = c.qnaBoardNum where b2.qnaBoardNum=b.qnaBoardNum) as count
FROM
(SELECT ROWNUM as RN ,qnaBoardNum, memberName, qnaBoardTitle,qnaBoardDate,qnaBoardContent
FROM (SELECT * FROM qna_board b1 join member m on b1.memberNum=m.memberNum
ORDER BY qnaBoardNum DESC) where REGEXP_LIKE(memberName||qnaBoardTitle||qnaBoardContent,#{keyword}) )b2
WHERE RN BETWEEN (#{section}-1)*100+(#{pageNum}-1)*10+1 AND (#{section}-1)*100+(#{pageNum})*10
</select>
</mapper>
qnaBoard - list.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"
xmlns:layout="http://www.ultraq.net.nz/web/thymeleaf/layout">
<head>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.1/js/bootstrap.min.js"></script>
<!-- Bootstrap CSS -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css">
<meta charset="UTF-8">
<title>고윤박커피 / QNA</title>
<th:block th:replace="headerFooter.html :: configFragment"></th:block>
</head>
<body>
<div th:replace="headerFooter.html :: top-bar"></div>
<div th:replace="headerFooter.html :: main-header"></div>
<section class="breadcrumbs">
<div class="container">
<div class="d-flex justify-content-between align-items-center">
<h2>Qna Board</h2>
<ol>
<li><a href="/">메인으로</a></li>
<li>질문 게시판</li>
</ol>
</div>
</div>
</section>
<br><br><br>
<div class="cotainer">
<div class="row justify-content-center">
<div class="col-md-6 table-responsive">
<table class="table text-center" >
<thead class="table-dark">
<tr>
<th style="width: 10%">번호</th>
<th style="width: 60%">제목</th>
<th style="width: 15%">작성자</th>
<th style="width: 15%">작성일</th>
</tr>
</thead>
<tbody>
<tr th:each="list :${boardList}">
<td th:text="${list.qnaBoardNum}" style="width: 10%"></td>
<td style="text-align: left"><a th:href="@{/qnaBoard/view/{qnaBoardNum}(qnaBoardNum=${list.qnaBoardNum})}" th:text="${list.qnaBoardTitle}+' ['+${list.count}+']'" style="width: 60%"></a></td>
<td th:text="${list.memberName}" style="width: 15%"></td>
<td th:text="${#dates.format(list.qnaBoardDate,'yyyy-MM-dd')}" style="width: 15%"></td>
</tr>
</tbody>
</table><br>
<form action="/qnaBoard/search" method="GET">
<div style="text-align: left">
<input name="keyword" type="text" placeholder="작성자,제목,내용 검색"> <button type="submit" class="btn btn-primary btn-sm" style="background-color: #865439; border: 0;"><i class="fas fa-search"></i></button>
</div>
</form>
<div style="text-align: right">
<input type="button" value="목록" onclick="location.href='/qnaBoard'" class="btn btn-primary btn-sm" style="background-color: #865439; border: 0;">
<input type="button" value="글쓰기" onclick="location.href='/qnaBoard/write'" class="btn btn-primary btn-sm" style="background-color: #865439; border: 0;">
</div>
<div th:if="${keyword==null}" style="text-align: center"> <!-- 페이징 처리 -->
<th:block th:switch="${totalCntJudge}">
<th:block th:case="101">
<th:block th:if="${(section)*100<totalCnt}">
<th:block th:each="page : ${#numbers.sequence(1,10,1)}">
<th:block th:if="${section >1 && page==1}">
<a th:href="@{/qnaBoard(section=${section}-1, pageNum=10)}"> << </a>
</th:block>
<a th:href="@{/qnaBoard(section=${section}, pageNum=${page})}"><span th:text="${((section)-1)*10+page}"></span></a>
<th:block th:if="${page==10}">
<a th:href="@{/qnaBoard(section=${section+1}, pageNum=1)}"> >> </a>
</th:block>
</th:block>
</th:block>
<th:block th:if="${(section)*100>totalCnt}">
<th:block th:each="page : ${#numbers.sequence(1, (((totalCnt+9)-((section)-1)*100)/10) ,1)}">
<th:block th:if="${section >1 && page==1}">
<a th:href="@{/qnaBoard(section=${(section)-1}, pageNum=10)}"> << </a>
</th:block>
<a th:href="@{/qnaBoard(section=${section}, pageNum=${page})}"><span th:text="${((section)-1)*10+page}"></span></a>
</th:block>
</th:block>
<th:block th:if="${(section)*100==totalCnt}">
<th:block th:each="page : ${#numbers.sequence(1, 10 ,1)}">
<th:block th:if="${section >1 && page==1}">
<a th:href="@{/qnaBoard(section=${(section)-1}, pageNum=10)}"> << </a>
</th:block>
<a th:href="@{/qnaBoard(section=${section}, pageNum=${page})}"><span th:text="${((section)-1)*10+page}"></span></a>
</th:block>
</th:block>
</th:block>
<th:block th:case="100">
<th:block th:each="page : ${#numbers.sequence(1,10,1)}">
<a th:href="@{/qnaBoard(section=${section}, pageNum=${page})}"><span th:text="${page}"></span></a>
</th:block>
</th:block>
<th:block th:case="99">
<th:block th:each="page : ${#numbers.sequence(1,((totalCnt+9)/10),1)}">
<a th:href="@{/qnaBoard(section=${section}, pageNum=${page})}"><span th:text="${page}"></span></a>
</th:block>
</th:block>
</th:block>
</div>
<div th:if="${keyword!=null}" style="text-align: center"> <!-- 검색 페이징 처리 -->
<th:block th:switch="${totalCntJudge}">
<th:block th:case="101">
<th:block th:if="${(section)*100<totalCnt}">
<th:block th:each="page : ${#numbers.sequence(1,10,1)}">
<th:block th:if="${section >1 && page==1}">
<a th:href="@{/qnaBoard/search(section=${section}-1, pageNum=10, keyword=${keyword})}"> << </a>
</th:block>
<a th:href="@{/qnaBoard/search(section=${section}, pageNum=${page}, keyword=${keyword})}"><span th:text="${((section)-1)*10+page}"></span></a>
<th:block th:if="${page==10}">
<a th:href="@{/qnaBoard/search(section=${section+1}, pageNum=1, keyword=${keyword})}"> >> </a>
</th:block>
</th:block>
</th:block>
<th:block th:if="${(section)*100>totalCnt}">
<th:block th:each="page : ${#numbers.sequence(1, (((totalCnt+9)-((section)-1)*100)/10) ,1)}">
<th:block th:if="${section >1 && page==1}">
<a th:href="@{/qnaBoard/search(section=${(section)-1}, pageNum=10, keyword=${keyword})}"> << </a>
</th:block>
<a th:href="@{/qnaBoard/search(section=${section}, pageNum=${page}, keyword=${keyword})}"><span th:text="${((section)-1)*10+page}"></span></a>
</th:block>
</th:block>
<th:block th:if="${(section)*100==totalCnt}">
<th:block th:each="page : ${#numbers.sequence(1, 10 ,1)}">
<th:block th:if="${section >1 && page==1}">
<a th:href="@{/qnaBoard/search(section=${(section)-1}, pageNum=10, keyword=${keyword})}"> << </a>
</th:block>
<a th:href="@{/qnaBoard/search(section=${section}, pageNum=${page}, keyword=${keyword})}"><span th:text="${((section)-1)*10+page}"></span></a>
</th:block>
</th:block>
</th:block>
<th:block th:case="100">
<th:block th:each="page : ${#numbers.sequence(1,10,1)}">
<a th:href="@{/qnaBoard/search(section=${section}, pageNum=${page}, keyword=${keyword})}"><span th:text="${page}"></span></a>
</th:block>
</th:block>
<th:block th:case="99">
<th:block th:each="page : ${#numbers.sequence(1,((totalCnt+9)/10),1)}">
<a th:href="@{/qnaBoard/search(section=${section}, pageNum=${page}, keyword=${keyword})}"><span th:text="${page}"></span></a>
</th:block>
</th:block>
</th:block>
</div>
</div>
</div>
</div>
<br><br><br>
<div th:replace="headerFooter.html :: footer"></div>
<th:block th:replace="headerFooter.html :: script"></th:block>
</body>
</html>
728x90
'Portfolio' 카테고리의 다른 글
카카오 API (SNS연동 회원가입/로그인 구현) (0) | 2022.05.24 |
---|