서블릿과 JSP 를 이용하여 목적별 데이트 코스를 추천해 주는 웹을 개발하였다.
제가 맡은 기능은 사용자 간의 커뮤니티인 게시판을 만는 것이었습니다.
Servlet, JSP 로 CRUD 게시판 구현, Ajax 를 통해 비동기식 댓글 CRUD 및
사이드 인기 게시글, 검색 부분을 구현하였습니다.
부가기능으로 관리자가 공지한 글이 커뮤니티 상단에 노출 시켜, 드롭다운 방식으로 게시글을 조회 할 수 있습니다.
01. 관리자가 작성한 공지 사항 상단에 노출
폴라로이드 애니메이션 - Scattered Polaroids Gallery
표현식을 이용하여 객체를 화면 단으로 넘겨 받습니다.
BoradListController
package semiProject.com.kh.board.controller;
import java.io.IOException;
import java.util.ArrayList;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import semiProject.com.kh.board.model.service.BoardService;
import semiProject.com.kh.board.model.vo.Board;
import semiProject.com.kh.board.model.vo.PageInfo;
import semiProject.com.kh.notice.model.vo.Notice;
/**
* Servlet implementation class BoardListServlet
*/
@WebServlet("/list.bo")
public class BoardListServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public BoardListServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// ---------------- 페이징 처리 -----------------
int listCount; // 총 게시글 갯수
int currentPage; // 현재 페이지 (즉, 요청한 페이지)
int startPage; // 현재 페이지에 하단에 보여지는 페이징 바의 시작 수
int endPage; // 현재 페이지에 하단에 보여지는 페이징 바의 끝 수
int maxPage; // 전체 페이지에서의 가장 마지막 페이지
int pageLimit; // 한 페이지 하단에 보여질 페이지 최대 갯수
int boardLimit; // 한 페이지에 보여질 게시글 최대 갯수
// * listCount : 총 게시글 갯수
listCount = new BoardService().getListCount();
// * currentPage : 현재 페이지 (요청한 페이지)
currentPage = 1;
// 페이지 전환시 전달받은 페이지가 있을 경우 전달받은 페이지를 currentPage로!
if(request.getParameter("currentPage") != null) {
currentPage = Integer.parseInt(request.getParameter("currentPage"));
}
// * pageLimit : 한 페이지 하단에 보여질 페이지 최대 갯수
pageLimit = 6;
// * boardLimit : 한 페이지에 보여질 게시글 최대 갯수
boardLimit = 6;
// * maxPage : 총 페이지 수
/*
* ex) boardLimit : 10 이라는 가정 하에
*
* 총갯수 / boardLimit
* 100.0 / 10 = 10.0 = 10.0 => 10페이지
* 101.0 / 10 = 10.1 = 11.0 => 11페이지
* 105.0 / 10 = 10.5 = 11.0 => 11페이지
* 109.0 / 10 = 10.9 = 11.0 => 11페이지
*
* 총게시글갯수(실수)/boardLimit의 값을 올림한 값!
*/
maxPage = (int)Math.ceil((double)listCount/boardLimit);
// * startPage : 현재 페이지에 보여지는 페이징 바의 시작 수
/*
* ex) pageLimit : 10
* 1, 11, 21, 31, ... => n * 10 + 1
*
* currentPage = 1 => 0 * 10 + 1
* currentPage = 5 => 0 * 10 + 1
* currentPage = 10 => 0 * 10 + 1
*
* currentPage = 11 => 1 * 10 + 1
* currentPage = 12 => 1 * 10 + 1
* currentPage = 20 => 1 * 10 + 1
*
* currentPage = 1~10 => n=0
* currentPage = 11~20 => n=1
*
* n = (currentPage - 1) / pageLimit
*/
startPage = (currentPage - 1) / pageLimit * pageLimit + 1;
// * endPage : 현재 페이지에 보여지는 페이징 바의 끝 수
// startPage : 1 => endPage : 10
// startPage : 11 => endPage : 20
endPage = startPage + pageLimit - 1;
// 단, maxPage가 고작 13까지 밖에 안되면? endPage를 13으로 해줘야됨!
if(maxPage < endPage) {
endPage = maxPage;
}
//생성자 순서대로 인자 넣어서 담아줬다.
PageInfo pi = new PageInfo(listCount,currentPage,startPage,endPage,maxPage, pageLimit, boardLimit);
Board b = new Board();
//게시판 리스트 넘겨주기 (페이지와 함께_)
ArrayList<Board> list = new BoardService().selectThList(pi);
//공지사항도 넘겨줘야 하니깐
ArrayList<Notice> nlist = new BoardService().selectNList();
//VIEW 단으로 넘겨주는 객체들
request.setAttribute("nlist", nlist);
//보드 정보와 페이지 정보
request.setAttribute("list", list);
request.setAttribute("pi", pi);
request.getRequestDispatcher("views/board/boardListView.jsp").forward(request, response);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
BoardList Service
//커뮤니티에 올라갈 공지사항
public ArrayList<Notice> selectNList() {
Connection conn = getConnection();
ArrayList<Notice> nlist = new BoardDao().selectNList(conn);
close(conn);
return nlist;
}
서비스에서 커넥션 객체를 연결시켜서 인자로 담아 Dao 로 넘깁니다.
BoardList Dao
//커뮤니에 오를 공지사항
public ArrayList<Notice> selectNList(Connection conn) {
ArrayList<Notice> nlist = new ArrayList<>();
PreparedStatement pstmt = null;
ResultSet rset = null;
String sql = prop.getProperty("selectNList");
try {
pstmt = conn.prepareStatement(sql);
rset = pstmt.executeQuery(); // 쿼리문 실행
// 목록을 가져와서 객체로 생성함
while (rset.next()) {
nlist.add(new Notice(rset.getString("NOTICE_TITLE"), rset.getString("NOTICE_CONTENT")
));
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
close(rset);
close(pstmt);
}
return nlist;
}
selectNList 쿼리문
getProperty 에 선언된 쿼리 키 값과 연결 되어 쿼리가 질의를 실행합니다.
selectNList=SELECT NOTICE_TITLE, NOTICE_CONTENT FROM NOTICE WHERE STATUS='Y'
BoardList.jsp
<section class="faq bg-color">
<div class="container">
<div class="faq-title">
<h2>공지사항</h2>
<p>어디어디 공지사항입니다!</p>
</div>
<% if(nlist.isEmpty()){ %>
<% System.out.print(nlist); %>
<div><p>공지사항이 없습니다.</p></div>
<% }else{ %>
<% for(int i =0; i<nlist.size(); i++){ %>
<ul class="faq-list">
<li data-aos="fade-up" data-aos-delay="100" class="aos-init aos-animate noticeView">
<a data-toggle="collapse" class="collapse multi-collapse" href="#faq<%=i %>" aria-expanded="true" id="title" onchange="myFunction()" >
<%= nlist.get(i).getNoticeTitle() %> <i class="fas fa-arrow-up"></i></a>
<div id="faq<%=i %>" class="collapse" data-parent=".faq-list" >
<p>
<%= nlist.get(i).getNoticeContent() %>
</p>
</div>
</li>
</ul>
<% } %>
<% } %>
</div>
</section>
상단에 임포트 된 객체를 바탕으로 <% %> 표현식 안에 받아온 객체를 for 문을 돌려가며
각 제목과, 내용을 태그 안에 값으로 넣습니다.
'세미프로젝트' 카테고리의 다른 글
세미 프로젝트[어디어디] (0) | 2021.11.29 |
---|---|
세미 프로젝트[어디어디] (0) | 2021.11.29 |
세미프로젝트 [어디어디] (0) | 2021.11.29 |