• 티스토리 홈
  • 프로필사진
    Song hyun
  • 방명록
  • 공지사항
  • 태그
  • 블로그 관리
  • 글 작성
Song hyun
  • 프로필사진
    Song hyun
    • 분류 전체보기 (780)
      • 영어 (2)
        • Diary (0)
        • Toast Masters (2)
      • 메모 (13)
      • 설치 메뉴얼 (30)
      • Java (178)
      • MySQL (60)
      • JSP (67)
      • Springboot (46)
      • HTML,CSS, JS (71)
        • HTML (8)
        • CSS (12)
        • JavaScript (37)
        • HTML&CSS 스터디 (13)
      • C++ (7)
      • Linux (7)
      • JPA (34)
      • Kotlin (2)
      • Flutter (42)
      • Error Note (39)
      • 디자인 패턴 (12)
      • 디지털논리회로 (4)
      • 데이터베이스 시스템 (8)
      • 알고리즘 (7)
      • 운영체제 (3)
      • 이산수학 (3)
      • 인공지능 (1)
      • 자료 구조 (14)
        • 기본 개념 (14)
        • 자료구조 스터디 (0)
      • 💡My project (76)
        • 팩맨 : Java Swing 게임 제작 프로젝트 (6)
        • 네이트톡 : Java 소켓 통신 프로젝트 (4)
        • 포켓옥션 : HikariCP&JDBC CRUD 프.. (3)
        • 이지 부산 : BDIA-Devton 2024 프로.. (20)
        • 그린 유니버시티 : JSP를 사용한 학사관리 프로.. (1)
        • 애드 포커 : 웹 소켓과 Spring을 사용한 카.. (1)
        • 셸위 : 게임 친구 매칭 사이트 (21)
        • 다모아 : 개발자 중개 플랫폼 (20)
      • 📗스터디 (13)
        • CNN : 웹개발 스터디 (10)
        • Node&React로 유튜브 사이트 만들기 (3)
      • 📙독서 및 강연 기록 (36)
        • 강연 (14)
        • 독서 (22)
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
      등록된 댓글이 없습니다.
    • 최근 공지
        등록된 공지가 없습니다.
      # Home
      # 공지사항
      #
      # 태그
      # 검색결과
      # 방명록
      • [JSP] JSP로 CRUD 게시판 만들기 (4) - 게시판 만들기
        2024년 07월 16일
        • Song hyun
        • 작성자
        • 2024.07.16.:31
        728x90
        반응형

        [JSP] JSP로 CRUD 게시판 만들기 (4) - 게시판 만들기

         

        1. BoardController 만들기

        package com.tenco.tboard.controller;
        
        import jakarta.servlet.ServletException;
        import jakarta.servlet.annotation.WebServlet;
        import jakarta.servlet.http.HttpServlet;
        import jakarta.servlet.http.HttpServletRequest;
        import jakarta.servlet.http.HttpServletResponse;
        import jakarta.servlet.http.HttpSession;
        
        import java.io.IOException;
        import java.util.List;
        
        import com.tenco.tboard.model.Board;
        import com.tenco.tboard.model.User;
        import com.tenco.tboard.repository.interfaces.BoardRepository;
        import com.tenco.tboard.repository.interfaces.BoardRepositoryImpl;
        import com.tenco.tboard.repository.interfaces.UserRepository;
        
        @WebServlet("/board/*")
        public class BoardController extends HttpServlet {
        	
        	private static final long serialVersionUID = 1L;
            private BoardRepository boardRepository;
        	
        	@Override
        	public void init() throws ServletException {
        		boardRepository = new BoardRepositoryImpl();
        	}
        	
        	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        		String action = request.getPathInfo();
        		// 세션 - 인증 처리
        		HttpSession session=request.getSession(false);
        		if(session==null || session.getAttribute("principal")==null) {
        			response.sendRedirect(request.getContextPath()+"/user/signin");
        			return;
        		}
        		
        		
        		switch (action) {
        		case "/create":
        			showCreateBoardForm(request,response,session);
        			break;
        		case "/list":
        			handleListBoards(request, response,session);
        			break;
        
        		default:
        			break;
        		}
        		
        	}
        
        	/**
        	 * 게시글 생성 화면 이동
        	 * @param request
        	 * @param response
        	 * @param session
        	 * @throws IOException 
        	 * @throws ServletException 
        	 */
        	private void showCreateBoardForm(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws ServletException, IOException {
        		request.getRequestDispatcher("/WEB-INF/views/board/create.jsp").forward(request, response);
        	}
        
        	/**
        	 * 페이징 처리 하기 
        	 * @param request
        	 * @param response
        	 * @throws IOException 
        	 * @throws ServletException 
        	 */
        	private void handleListBoards(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws ServletException, IOException {
        		// 게시글 목록 조회 기능
        		int page = 1; // 기본 페이지 번호 
        		int pageSize = 3; // 한 페이지당 보여질 게시글에 수  
        		
        		try {
        			 String pageStr = request.getParameter("page");
        			 if(pageStr != null ) {
        				 page = Integer.parseInt(pageStr);
        			 }
        		} catch (Exception e) {
        			// 유효하지 않은 번호를 마음대로 보낼 경우 
        			page = 1; 
        		}
        		// pageSize --> 3이다 
        		// page 1, page 2, page 3 요청 동적으로 시작값을 계산하는 산수 공식 넣기 
        		int offset = (page - 1) * pageSize; // 시작 위치 계산( offset 값 계산)
        
        		// pageSize <-- 한 페이지당 보여줄 게시글 수 (limit 로 바라 볼 수 있다 ) 
         		List<Board> boardList =  boardRepository.getAllBoards(pageSize, offset);
        		// 페이징 처리 1단계 (현재 페이지 번호, pageSize , offset) 
        		////////////////////////////////////////////////////////////////
        		
        		// 전체 게시글 수 조회 
        		int totalBoards = boardRepository.getTotalBoardCount();
        		
        		// 총 페이지 수 계산 -->  [1][2][3][...]
        		int totalPages = (int) Math.ceil(totalBoards / pageSize);
        		
        		request.setAttribute("boardList", boardList);
        		request.setAttribute("totalPages", totalPages);
        		request.setAttribute("currentPage", page);
        		
        		// 현재 로그인한 사용자 ID 설정
        		if(session!=null) {
        			User user=(User)session.getAttribute("principal");
        			if(user!=null) {
        				request.setAttribute("userId", user.getId());
        			}
        		}
        		request.getRequestDispatcher("/WEB-INF/views/board/list.jsp").forward(request, response);
        	}
        
        	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        		String action = request.getPathInfo();
        		// 세션 - 인증 처리
        		HttpSession session=request.getSession(false);
        		if(session==null || session.getAttribute("principal")==null) {
        			response.sendRedirect(request.getContextPath()+"/user/signin");
        			return;
        		}
        		
        		
        		switch (action) {
        		case "/create":
        			handleCreateBoard(request,response,session);
        			break;
        		case "/edit":
        			showCreateBoardForm(request,response,session);
        			break;
        		case "/addComment":
        			showCreateBoardForm(request,response,session);
        			break;
        		default:
        			response.sendError(HttpServletResponse.SC_NOT_FOUND);
        			break;
        		}
        	}
        
        	/**
        	 * 게시글 생성 처리
        	 * @param request
        	 * @param response
        	 * @param session
        	 * @throws IOException 
        	 */
        	private void handleCreateBoard(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {
        		// 유효성 검사 생략
        		String title=request.getParameter("title");
        		String content=request.getParameter("content");
        		User user=(User)session.getAttribute("principal");
        		
        		Board board= Board.builder()
        				.userId(user.getId())
        				.title(title)
        				.content(content)
        				.build();
        		boardRepository.addBoard(board);
        		response.sendRedirect(request.getContextPath()+"/board/list?page=1");
        	}
        
        }

         

         

         

        2. BoardRepository (인터페이스) 만들기

        -BoardRepository.java(인터페이스 형식): BoardDAO의 뼈대를 만들어주는 클래스.

        어떤 변수를 받고, 어떤 자료형의 값을 return 할 것인지를 미리 설계해둔다. -> 추후 implements를 통해 구현!

        package com.tenco.tboard.repository.interfaces;
        
        import java.util.List;
        
        import com.tenco.tboard.model.Board;
        
        public interface BoardRepository {
        	// CRUD
        	void addBoard(Board board);
        	void updateBoard(Board board,int principalId);
        	void deleteBoard(int id);
        	Board selectBoardById(int id);
        	List<Board> getAllBoards(int limit,int offset);
        	int getTotalBoardCount();
        }

         

         

         

        3. Board DTO 만들기

        -Board.java: Board를 인스턴스화 할 때(=객체로 만들때) 필요한, 의미있는 자료형의 집합.

        -SQL 상에서의 데이터 항목(=컬럼)과 동일하게 작성한다.

        package com.tenco.tboard.model;
        
        import java.sql.Timestamp;
        
        import lombok.AllArgsConstructor;
        import lombok.Builder;
        import lombok.Data;
        import lombok.NoArgsConstructor;
        import lombok.ToString;
        
        @Data
        @ToString
        @Builder
        @AllArgsConstructor
        @NoArgsConstructor
        public class Board {
        	private int id;
        	private int userId;
        	private String title;
        	private String content;
        	private Timestamp createdAt;
        }

         

         

         

        4. SQL 쿼리문

        -오류 방지를 위해 MySQL에서 미리 쿼리를 작성, 체크 후에 DAO에 넣는다.

        select * from board order by created_at desc limit ? offset ? ;

         

         

        5. List.JSP

        <%@ page language="java" contentType="text/html; charset=UTF-8"
            pageEncoding="UTF-8"%>
        <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
        <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
           
        <!DOCTYPE html>
        <html>
        <head>
        <meta charset="UTF-8">
        <title>게시글 목록</title>
        <link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/resources/css/common.css">
        <link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/resources/css/list.css">
        </head>
        <body>
        	<h2>게시글 목록</h2>
        	<div class="action">
        		<a class="btn btn-create" href="${pageContext.request.contextPath}/board/create" >새글 작성하기</a>
        		<a class="btn btn-back" href="${pageContext.request.contextPath}/index.jsp" >홈 화면</a>
        	</div>
        	
        	<c:forEach var="board"  items="${boardList}">
        		<div class="board-item">
        			<h3><a href="#">${board.title}</a></h3>
        			<p>${board.content}</p>
        			<p> <fmt:formatDate value="${board.createdAt}" pattern="yyyy-MM-dd HH:mm" /></p>
        			<!-- 게시글에 작성자가 세션 유저와 동일하다면 수정, 삭제 버튼을 보여주자  -->
        			<c:if test="${board.userId==userId }">
        				<a class="btn btn-edit" href="#">수정</a>
        				<a class="btn btn-delete" href="#">삭제</a>
        			</c:if>
        		</div>
        	</c:forEach>
        	
        	<br>
        	<div class="pagination">
        		<!-- index for  -->
        		<c:forEach begin="1" end="${totalPages}"  var="i" >
        			<c:choose>
        				<c:when test="${ i == currentPage }">
        					<span class="current-page" >${i}</span>
        				</c:when>
        				<c:otherwise>
        					<span><a href="${pageContext.request.contextPath}/board/list?page=${i}">${i}</a></span>	
        				</c:otherwise>
        			</c:choose>
        		</c:forEach>
        	</div>
        	
        </body>
        </html>

         

         

        6. CSS

        (1) common.css

        @charset "UTF-8";
        
        body{
        	font-family:Arial,Sans-serif;
        	margin: 0;
        	padding: 0;
        	background-color: #f4f4f4;
        	color: #333;
        	
        }

         

        (2) list.css

        @charset "UTF-8";
        @import url("board.css");
        
        .action{
        	margin-bottom: 20px;
        }
        .action .btn{
        	margin-right:10px;
        }
        
        .board-item{
        	margin-bottom:20px;
        	padding: 15px;
        	border-bottom: 1px solid #ddd;
        }
        .board-item h3{
        	margin: 0;
        }
        
        .board-item P{
        	margin: 5px 0;
        }
        
        .btn-create{
        	background-color: #28a745;
        	color: white;
        	text-align:center;
        }
        
        .btn-create:hover{
        	background-color: #218838;
        }
        
        .btn-edit{
        	background-color: #007bff;
        	color: white;
        	text-align:center;
        }
        
        .btn-edit:hover{
        	background-color: #0056b3;
        }
        .btn-delete{
        	background-color: #dc3545;
        	color: white;
        	text-align:center;
        }
        
        .btn-delete:hover{
        	background-color: #c82333;
        }
        
        .btn-back{
        	background-color: #6c757d;
        	color: white;
        }
        .btn-back:hover{
        	background-color: #5a6268;
        }
        
        
        .pagination{
        	text-align:center;
        	margin-top: 20px;
        	margin-bottom: 40px;
        }
        
        .pagination a{
        	display: inline-block;
        	padding: 5px 10px;
        	margin: 0 5px;
        	border: 1px solid #ddd;
        	text-decoration: none;
        	color: #007bff;
        }
        
        .pagination a:hover{
        	background-color: #007bff;
        	color: white;
        }
        
        .current-page{
        	display: inline-block;
        	padding: 5px 10px;
        	background-color: #007bff;
        	border: 1px solid #007bff;
        	border-radius: 4px;
        	text-decoration: none;
        	color: white;
        }

         

        (3) board.css

        @charset "UTF-8";
        
        h2{
        	text-align: center;
        	color: #007aba;
        }
        
        .btn {
        	display: inline-block;
        	padding: 10px 15px;
        	margin-top: 10px;
        	text-decoration: none;
        	border-radius: 4px;
        	
        }

         

        7. UserController

        package com.tenco.tboard.controller;
        
        import jakarta.servlet.ServletException;
        import jakarta.servlet.annotation.WebServlet;
        import jakarta.servlet.http.HttpServlet;
        import jakarta.servlet.http.HttpServletRequest;
        import jakarta.servlet.http.HttpServletResponse;
        import jakarta.servlet.http.HttpSession;
        
        import java.io.IOException;
        import java.io.PrintWriter;
        
        import com.tenco.tboard.model.User;
        import com.tenco.tboard.repository.UserRepositoryImpl;
        import com.tenco.tboard.repository.interfaces.UserRepository;
        
        
        @WebServlet("/user/*")
        public class UserController extends HttpServlet {
        	private static final long serialVersionUID = 1L;
            
        	private UserRepository userRepository;
        	
        	@Override
        	public void init() throws ServletException {
        		userRepository = new UserRepositoryImpl();
        	}
        
        
        	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        		
        		String action = request.getPathInfo();
        		
        		switch (action) {
        		case "/signup": 
        			request.getRequestDispatcher("/WEB-INF/views/user/signup.jsp").forward(request, response);
        			break;
        		case "/signin":
        			request.getRequestDispatcher("/WEB-INF/views/user/signin.jsp").forward(request, response); 
        			break;
        		case "/logout":
        			handleLogout(request, response);
        			break;
        		default:
        			response.sendError(HttpServletResponse.SC_NOT_FOUND);
        			break;
        		}
        		
        	}
        	
        	/**
        	 * 로그아웃 기능 처리 
        	 * @throws IOException 
        	 * http://localhost:8080/t-board/user/logout
        	 */
        	private void handleLogout(HttpServletRequest request, HttpServletResponse response) throws IOException {
        		HttpSession session = request.getSession();
        		session.invalidate();
        		response.sendRedirect(request.getContextPath() + "/user/signin");
        	}
        
        
        	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        		String action = request.getPathInfo();
        		switch (action) {
        		case "/signup": 
        			handleSignup(request, response);
        			break;
        		case "/signin":
        			 handleSignin(request, response); 
        			break;
        		default:
        			response.sendError(HttpServletResponse.SC_NOT_FOUND);
        			break;
        		}
        		
        	}
        
        
        	private void handleSignin(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        		
        		String username = request.getParameter("username");
        		String password = request.getParameter("password");
        		User principal = userRepository.getUserByUsernameAndPassword(username, password);
        		
        		if(principal != null && principal.getPassword().equals(password)) {
        			HttpSession session = request.getSession();
        			session.setAttribute("principal", principal);
        			response.sendRedirect(request.getContextPath() + "/board/list");
        		} else {
        			request.setAttribute("errorMessage", "잘못된 요청입니다.");
        			request.getRequestDispatcher("/WEB-INF/views/user/signin.jsp").forward(request, response);
        		}
        	}
        
        
        	private void handleSignup(HttpServletRequest request, HttpServletResponse response) throws IOException {
        		// 데이터 추출 
        		String username = request.getParameter("username") ; 
        		String password = request.getParameter("password") ; 
        		String email = request.getParameter("email");
        		
        		// 데이터 유효성 검사 생략 
        		
        		User user = User.builder()
        					.username(username)
        					.password(password)
        					.email(email)
        					.build();
        		// TODO 삭제 예정 
        		System.out.println(user);
        		int result = userRepository.addUser(user);
        		if(result != 0) {
        			response.sendRedirect(request.getContextPath() + "/user/signin");
        		} else {
        			 response.setContentType("text/html; charset=UTF-8");
        			 PrintWriter out = response.getWriter();
        			 out.println("<script> alert('잘못된 요청입니다'); history.back();  </script>");
        		}
        	}
        }
        728x90
        반응형

        'JSP' 카테고리의 다른 글

        [JSP] JSP 파일 업로드하기  (0) 2024.08.01
        [JSP] JSP로 CRUD 게시판 만들기 (5) - 댓글창 만들기  (0) 2024.07.17
        [JSP] JSP로 CRUD 게시판 만들기 (3) - JSP 파일 및 로그인 기능 만들기  (1) 2024.07.15
        [JSP] JSP로 CRUD 게시판 만들기 (2) - DB 접근 기술  (0) 2024.07.15
        [JSP] JSP로 CRUD 게시판 만들기 (1) - 패키지 및 DB 생성  (0) 2024.07.15
        다음글
        다음 글이 없습니다.
        이전글
        이전 글이 없습니다.
        댓글
      조회된 결과가 없습니다.
      스킨 업데이트 안내
      현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
      ("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
      목차
      표시할 목차가 없습니다.
        • 안녕하세요
        • 감사해요
        • 잘있어요

        티스토리툴바