본문 바로가기
세미프로젝트

세미프로젝트 [어디어디] 공지사항 상단 조회

by juneMiller 2021. 11. 28.

서블릿과 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