반응형
오늘은 게시판 별 카테고리(type)을 주어 다중 게시판을 만들어 보고자 한다.
1. Sql 테이블 생성
다중게시판을 위해 Board_type으로 게시판을 나눈다.
2. VO객체 생성
public class BoardVO {
private int board_no;
private String board_title;
private String board_writer;
private String board_content;
private int board_hit;
private int board_like;
private int board_hate;
private String board_img;
private String board_img_path;
private int board_type;
private Timestamp board_regdate;
}
vo 객체 생성 뒤 페이징 및 검색을 위한 객체 생성
@Getter
@Setter
public class PageVO {
//사용자가 선택한 페이지 정보를 담을 변수.
private int pageNum;
private int countPerPage;
//검색에 필요한 데이터를 변수로 선언.
private String keyword;
private String condition;
public PageVO() {
this.pageNum = 1;
this.countPerPage = 5;
}
}
페이징을 위한 다음 이전 등 버튼 개수를 위한 클래스 제작
@Setter
@Getter
@ToString
public class PageCreator {
private PageVO paging;
private int articleTotalCount;
private int endPage;
private int beginPage;
private boolean prev;
private boolean next;
private final int buttonNum = 5;
private void calcDataOfPage() {
endPage = (int) (Math.ceil(paging.getPageNum() / (double) buttonNum) * buttonNum);
beginPage = (endPage - buttonNum) + 1;
prev = (beginPage == 1) ? false : true;
next = articleTotalCount <= (endPage * paging.getCountPerPage()) ? false : true;
if(!next) {
endPage = (int) Math.ceil(articleTotalCount / (double) paging.getCountPerPage());
}
}
//컨트롤러가 총 게시물의 개수를 PageCreator에게 전달한 직후에
//바로 페이징 버튼 알고리즘이 돌아갈 수 있도록 setter를 커스텀.
public void setArticleTotalCount(int articleTotalCount) {
this.articleTotalCount = articleTotalCount;
calcDataOfPage();
}
}
jsp (view) 제작
<body>
<header id="header">
<%@ include file="../include/header.jsp"%>
</header>
<section>
<div class="body-box">
<div class="row">
<div class="titlebox">
<c:choose>
<c:when test="${type == 1}">
<h2>사기업게시판</h2>
</c:when>
<c:when test="${type == 2}">
<h2>공기업게시판</h2>
</c:when>
<c:when test="${type == 3}">
<h2>아시아게시판</h2>
</c:when>
<c:when test="${type == 4}">
<h2>유럽게시판</h2>
</c:when>
<c:when test="${type == 5}">
<h2>남미게시판</h2>
</c:when>
<c:when test="${type == 6}">
<h2>북미게시판</h2>
</c:when>
<c:when test="${type == 7}">
<h2>아프리카게시판</h2>
</c:when>
<c:when test="${type == 8}">
<h2>국가자격증게시판</h2>
</c:when>
<c:when test="${type == 9}">
<h2>민간자격증게시판</h2>
</c:when>
<c:when test="${type == 10}">
<h2>어학게시판</h2>
</c:when>
<c:when test="${type == 11}">
<h2>자유게시판</h2>
</c:when>
<c:when test="${type == 12}">
<h2>취뽀게시판</h2>
</c:when>
<c:when test="${type == 13}">
<h2>취업게시판</h2>
</c:when>
<c:when test="${type == 14}">
<h2>자격증게시판</h2>
</c:when>
<c:when test="${type == 15}">
<h2>자소서게시판</h2>
</c:when>
</c:choose>
</div>
<hr>
<div class="search-wrap">
<div id="search_box">
<form action=<c:url value="/board/JBoardList"/>>
<input type="hidden" name="board_type" value="${type}" />
<div class="search-wrap clearfix">
<select class="form-control search-select" name="condition">
<option value="board_title"
${pc.paging.condition == 'board_title' ? 'selected' : ''}>제목</option>
<option value="board_content"
${pc.paging.condition == 'board_content' ? 'selected' : ''}>내용</option>
<option value="board_writer"
${pc.paging.condition == 'board_writer' ? 'selected' : ''}>작성자</option>
</select> <input type="text" name="keyword"
class="form-control search-input" value="${pc.paging.keyword}">
<button type="submit" class="btn btn-info search-btn">검색</button>
</div>
</form>
</div>
</div>
<table>
<colgroup>
<col class="no">
<col class="title">
<col class="writer">
<col class="date">
<col class="count">
<col class="like">
</colgroup>
<thead>
<tr>
<th>번호</th>
<th>제목</th>
<th>작성자</th>
<th>작성일</th>
<th>조회</th>
<th>추천</th>
</tr>
</thead>
<tbody>
<c:forEach var="vo" items="${boardList}">
<tr>
<td>${vo.board_no}</td>
<td><a href="<c:url value ='/board/JBoardDetail?board_no=${vo.board_no}&board_type=${type}'/>">${vo.board_title} (${count})</a></td>
<td><a href="#" id="modal-writer1">${vo.board_writer}</a></td>
<td>${vo.board_regdate}</td>
<td>${vo.board_hit}</td>
<td>${vo.board_like}</td>
</tr>
</c:forEach>
</tbody>
</table>
<a href=<c:url value="/board/JBoardWrite?board_type=${type}"/> class="myButton">글쓰기</a>
<form action=<c:url value="/board/JBoardList?board_type=${type}"/>
name="pageForm">
<div class="text-center clearfix">
<hr>
<ul class="pagination" id="pagination">
<c:if test="${pc.prev}">
<li><a href="#" data-pageNum="${pc.beginPage-1}">이전</a></li>
</c:if>
<c:forEach var="num" begin="${pc.beginPage}" end="${pc.endPage}">
<li class="${pc.paging.pageNum == num ? 'active' : ''}"><a
href="#" data-pageNum="${num}">${num}</a></li>
</c:forEach>
<c:if test="${pc.next}">
<li><a href="#" data-pageNum="${pc.endPage+1}">다음</a></li>
</c:if>
</ul>
<!-- 페이지 관련 버튼을 클릭 시 같이 숨겨서 보낼 값 -->
<input type="hidden" name="board_type" value="${type}">
<input type="hidden" name="pageNum" value="${pc.paging.pageNum}">
<input type="hidden" name="countPerPage"value="${pc.paging.countPerPage}">
<input type="hidden" name="keyword" value="${pc.paging.keyword}">
<input type="hidden" name="condition" value="${pc.paging.condition}">
</div>
</form>
</div>
</div>
</div>
<!--쪽지모달-->
<div class="modal_wrap">
<div class="modal-contnet">
<div class="mini-title">작성자님에게 보내는 쪽지</div>
<textarea class="modal-txtcontent" rows="4" cols=25"></textarea>
<button class="send-modalBtn">
<a href="#">보내기</a>
</button>
<button class="close-modalBtn">
<a href="#">닫기</a>
</button>
</div>
</div>
</section>
<footer id="footer">
<%@ include file="../include/footer.jsp"%>
</footer>
</body>
tittle_box에서 jstl로 게시판을 구분해준다.
이건 헤더에서도 마찬가지로 구분해준다.
sql문을 만들자!
<sql id="search">
<if test="paging.condition == 'board_title'">
and board_title LIKE '%'||#{paging.keyword}||'%'
</if>
<if test="paging.condition == 'board_content'">
and board_content LIKE '%'||#{paging.keyword}||'%'
</if>
<if test="paging.condition == 'board_writer'">
and board_writer LIKE '%'||#{paging.keyword}||'%'
</if>
</sql>
<select id="getJBoard" resultType="com.community.shy.board.command.BoardVO" >
select * from
(
select rownum as rn , tbl. * from
(
SELECT * FROM job_board
where board_type = #{board_type}
<include refid="search" />
ORDER BY Board_no DESC
)tbl
)
<![CDATA[
WHERE rn > (#{paging.pageNum ,jdbcType=VARCHAR} - 1) * #{paging.countPerPage,jdbcType=VARCHAR}
AND rn <= #{paging.pageNum,jdbcType=VARCHAR} * #{paging.countPerPage,jdbcType=VARCHAR}
]]>
</select>
search라는 이름으로 검색을 할수 있게 해주었다.
where절에 board_type으로 구분해준다.
view에서 파라미터 값으로 type을 전달해 줄것이다.
이떄 sql문 board_type으로 구분을 해준다.
그 뒤 페이징을 통해 처음에 구성해준 countparpage를 통해 몇개의 열이 화면에 보여줄지를 결정하게 된다.
컨트롤러 구성
@Controller
@RequestMapping("/board")
public class BoardController {
@Autowired
private IBoardService service;
@GetMapping("/JBoardList")
public String BoardList(int board_type , PageVO paging ,Model model) {
System.out.println("리스트 페이지 입니다. ");
System.out.println("검색어: " + paging.getKeyword());
System.out.println("검색 조건: " + paging.getCondition());
PageCreator pc = new PageCreator();
System.out.println(paging);
pc.setPaging(paging);
pc.setArticleTotalCount(service.getJTotal(paging, board_type));
model.addAttribute("boardList", service.getJBoard(board_type, paging));
model.addAttribute("type", board_type);
model.addAttribute("pc", pc);
System.out.println(pc);
return "/board/JBoardList";
}
컨트롤러에서는 board_type과 page에 대한 정보를 받고 model객체로 감싸 view에 뿌려준다.
@Service
public class BoardService implements IBoardService {
@Autowired
private IBoardMapper mapper;
@Override
public List<BoardVO> getJBoard(int board_type, PageVO paging) {
List<BoardVO> list = new ArrayList<BoardVO>();
Map<String, Object> data = new HashMap<>();
data.put("board_type", board_type);
data.put("paging", paging);
return mapper.getJBoard(data);
}
서비스 구분 2개의 파라미터를 전달을 해주기위해 map으로 포장해준다.
인터페이스 메퍼에서는 map 타입으로 전달 받는다.
public interface IBoardMapper {
// 게시판 구분
List<BoardVO> getJBoard(Map<String, Object> data)
그 후
이렇게 더미데이터를 몇개 넣어주면
페이징을 통한 여러 게시판이 완성이 된다!
https://github.com/MoonSeokHyun/JobJob_community
반응형
'Spring > 잡잡커뮤니티' 카테고리의 다른 글
스프링 관리자페이지 만들기(3) 회원 관리 (0) | 2022.04.23 |
---|---|
잡잡커뮤니티 관리자(Admin)페이지 만들기 회원관리(2) (데이터테이블, ajax, 서브쿼리) (0) | 2022.04.21 |
잡잡커뮤니티 관리자(Admin)페이지 만들기 회원관리(1) (0) | 2022.04.05 |
스프링 댓글 구현하기 feat ajax (1) | 2022.04.04 |
스프링 프로젝트 잡잡커뮤니티 만들기(1) (0) | 2022.03.21 |