[Servlet] FrontController 글 목록 조회

2024. 10. 20. 09:04·Java
반응형

 
index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Front Controller</title>
</head>
<body>
	<h2>프론트컨트롤러 프로젝트 연습하기</h2><hr>
	<a href="<%= request.getContextPath() %>/sample/main.do">sample 메인페이지로 이동</a>
	<br>
	<a href="<%= request.getContextPath() %>/sample/board1List.do">
		sample 게시판1 페이지로 이동
	</a><br>
	<a href="<%= request.getContextPath() %>/sample/board2List.do">
		sample 게시판2 페이지로 이동
	</a><br>
	<!--  
		sample 게시판1 페이지로 이동 클릭시 WEB-INF/sample/list1.jsp를 출력
		sample 게시판2 페이지로 이동 클릭시 WEB-INF/sample/list2.jsp를 출력
	-->
	<br>
	<a href="<%= request.getContextPath() %>/board/main.do">board 메인페이지로 이동</a>
</body>
</html>

 
 
FrontController

package frontControllerPJT.controller;
/*
frontcontroller의 역할!

모든 가상경로를 제일 처음 맞이하여 역할에 맞는 컨트롤러로 기능 처리를 넘기는 중간 매개체 역할을 한다

효과 : 가상경로마다 servlet을 선언하지 않고 역할에 맞춰서 servlet을 선언하기 때문에
servlet이 무한증식하지 않고 비교적 깔끔하게 프로젝트 구조를 구성할 수 있다

해야 할 일 : 요청 uri를 분석하여 어떤 컨트롤러로 기능을 요청해야하는지 분석 후 처리


*/
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("*.do")
public class FrontController extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    public FrontController() {}

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		/*
		URL : 도메인을 포함한 경로
		URI : 도메인을 제외한 경로
		*/
		System.out.println("frontcontroller 실행 url:"+request.getRequestURI());
		
		//1. 요청 uri 정보를 가지고 온다
		String uri = request.getRequestURI();
		
		//2. 프로젝트 경로를 가지고 온다.
		String contextPath = request.getContextPath();
		//3. 요청 uri에서 필요없는 프로젝트 경로를 제외한 uri를 가지고 온다
		String comment = uri.substring(contextPath.length()+1);
		/*
		/frontControllerPJT/sample/main.do에서
		/frontControllerPJT/ 부분이 잘림
		 */
		System.out.println(comment);
		
		//4. 3번에서 찾은 요청 경로에서 /를 기준으로 문자열을 자른다.
		String[] comments = comment.split("/");
		System.out.println("comments[0] : "+comments[0]);
		
		//5. 만들어진 문자열 배열의 첫번째 문자열이 어떤 컨트롤러로 기능을 요청해야할지 결정한다.
		if(comments[0].equals("sample")) {
			//SampleController 에게 처리 전달
			SampleController sample = new SampleController(request,response,comments);
		}else if(comments[0].equals("board")) {
			BoardController board = new BoardController(request,response,comments);
		}
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}

 
 
BoardController

package frontControllerPJT.controller;

import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import frontControllerPJT.util.DBConn;
import frontControllerPJT.vo.NoticeBoardVO;


public class BoardController {
	public BoardController(HttpServletRequest request
			, HttpServletResponse response
			, String[] comments) throws ServletException, IOException {
		
		if(comments[comments.length-1].equals("main.do")) {
			//comments의 마지막 인덱스 값이 main.do이면 main메소드 호출
			main(request,response);
		}
	}
	
	public void main(HttpServletRequest request
			, HttpServletResponse response) throws ServletException, IOException {
		
		
		Connection conn = null;			//DB 연결
		PreparedStatement psmt = null;	//SQL 등록 및 실행. 보안이 더 좋음!
		ResultSet rs = null;			//조회 결과를 담음
		
		List<NoticeBoardVO> boardList = new ArrayList<>();

		//try 영역
		try{
			conn = DBConn.conn();
			
			String sql = "select nno,title,uid,n.uno,content,filename, " 
					+ "date_format(n.rdate,'%Y-%m-%d') as rdate,n.state,hit,top_yn "
					+ "from notice_board n "
					+ "inner join user u " 
					+ "on n.uno = u.uno ";
			sql += " where n.state='E' ";
			sql	+= "order by top_yn desc, nno desc ";
			psmt = conn.prepareStatement(sql);
			
			rs = psmt.executeQuery();
			
			while(rs.next()){
				NoticeBoardVO board = new NoticeBoardVO(
						rs.getString("nno"),
						rs.getString("uno"),
						rs.getString("title"),
						rs.getString("content"),
						rs.getString("rdate"),
						rs.getString("hit"),
						rs.getString("state"),
						rs.getString("top_yn"),
						rs.getString("filename"),
						rs.getString("uid")
						);
				boardList.add(board);
			}
			request.setAttribute("boardList", boardList);
			request.getRequestDispatcher("/WEB-INF/notice/list.jsp").forward(request, response);
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			try {
				DBConn.close(rs, psmt, conn);
			}catch(Exception e) {
				e.printStackTrace();
			}
		}
	}
}

 
 
list.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.util.*" %>
<%@ page import="frontControllerPJT.vo.*" %>
<%
List<NoticeBoardVO> boardList = (List<NoticeBoardVO>)request.getAttribute("boardList");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Front Controller</title>
</head>
<style>
	td{
		text-align:center;
	}
</style>
<body>
	<h2>공지사항 목록 페이지</h2><hr>
	<table>
		<thead>
			<tr>
				<th>글번호</th>
				<th>제목</th>
				<th width="80px">작성자</th>
				<th>작성일</th>
				<th>조회수</th>
			</tr>
		</thead>
		<tbody>
			<!-- /board/main.do 요청시 데이터베이스 notice_board  
				테이블의 전체 데이터를 해당 영역에 출력하세요
			-->
			<%
			int num = boardList.size();
			for(NoticeBoardVO n : boardList){
				%>
				<tr>
					<td width="60px;" style="color:<%= n.getTop_yn().equals("Y") ? "red" : "black" %>";>
					<%
					if(n.getTop_yn().equals("Y")){
						%>★<%
						num--;
					}else{
						%>
						<%= num-- %>
						<%
					}
					%>
					</td>
					<td>
					<a href="view.do?nno=<%= n.getNno() %>" style="color:<%= n.getTop_yn().equals("Y") ? "red" : "black" %>";>
					<%= n.getTitle() %>
					</a>
					</td>
					<td>
					<%= n.getUid() %>
					</td>
					<td>
					<%= n.getRdate() %>
					</td>
					<td width="60px;">
					<%= n.getHit() %>
					</td>
				</tr>
				<%
			}
			%>
		</tbody>
	</table>
</body>
</html>
반응형

'Java' 카테고리의 다른 글

[Servlet] FrontController 게시글 수정하기 삭제하기  (0) 2024.10.25
[Servlet] FrontController 게시글 상세 조회  (0) 2024.10.24
[Servlet] Front Controller  (0) 2024.10.19
[Servlet] 게시글 삭제  (0) 2024.10.14
[Servlet] 게시글 수정  (0) 2024.10.13
'Java' 카테고리의 다른 글
  • [Servlet] FrontController 게시글 수정하기 삭제하기
  • [Servlet] FrontController 게시글 상세 조회
  • [Servlet] Front Controller
  • [Servlet] 게시글 삭제
초보개발자J
초보개발자J
J의 코딩 노트초보개발자J 님의 블로그입니다.
초보개발자J
J의 코딩 노트
초보개발자J
전체
오늘
어제
  • 분류 전체보기 (126)
    • Java (49)
    • MySQL (10)
    • HTML, CSS (8)
    • JavaScript, jQuery, Ajax (12)
    • Spring (15)
    • Python (0)
    • Baekjoon [Java] (27)
    • Git (1)
    • Spring Boot (3)
    • Visual Studio Code (1)
    • 일상 (0)
    • 영어 (0)
반응형

블로그 메뉴

  • 홈
  • 태그
  • 방명록

인기 글

hELLO· Designed By정상우.v4.5.3
초보개발자J
[Servlet] FrontController 글 목록 조회

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.