Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

dearbeany

[JDBC&Web] MVC 모델로 게시판 만들기, CRUD 실습 본문

Web

[JDBC&Web] MVC 모델로 게시판 만들기, CRUD 실습

dearbeany 2022. 9. 26. 01:11

Servlet에서 forward 할 때 쓰는 '/' -> 컨텍스트 루트까지 이미 적혀있음

request.getRequestDispatcher("/board/list.jsp");

- 포워드 시에 쓰는 '/'는 Context root 까지 적혀있다. (C.R이 Back07_JDBC_Web)

- 슬래쉬 이후부터는 WebContent를 기준으로 경로를 찾는다

- 즉, WebContent 하위폴더인 board 내에 list.jsp 로 포워딩한다

 

form action에서 쓰는 '/' -> 컨텍스트루트 빼고 localhost:8080까지만 적혀있다

만약 컨텍스트루트를 '/' (슬래쉬)까지만 지정한다면? (즉, 프로젝트명을 사용하지 않고)

 

 

Java Resources : 서블릿과 관련된 파일

WebContent : JSP와 관련된 파일 

 

지난번 실습으로 Model은 이미 작성했다. 이번엔 VC를 마저 완성하도록 하자!

 

1. Controller 작성하기

@WebServlet("/board")

→ Context path 다음 board라는 요청이 들어오면 다음의 서블릿을 실행하도록 한다.

 

forward : request영역 안에 있음. 요청을 그대로 토스(포워딩) 하려면 포워드 해야 함.

sendRedirect : response 영역 안에 있음

 

@WebServlet("/board")
public class BoardController extends HttpServlet{	
	private BoardDao dao = BoardDaoImpl.getInstace();
	
	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// GET 요청에서는 딱히 안 해도 되지만 POST 요청이 들어왔을 때 
		if(request.getMethod().equals("POST"))
			request.setCharacterEncoding("UTF-8");
		
		// Front-Controller 패턴 
		String act = request.getParameter("act");
		
		switch(act) {
		case "list":
			doList(request, response);
			break;
			
		default:
			break;
		}
	}

	private void doList(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setAttribute("list", dao.selectAll()); // list 라고 하는 이름으로 전체 게시글 리스트를 가져와 request 영역에 저장하겠다 
		request.getRequestDispatcher("/board/list.jsp").forward(request, response); // 포워드 시에 쓰는 '/'는 컨텍스트루트까지 적혀있음/ 그 이후는 WebContent부터 경로를 찾는다 
	}
}

 

- 프로젝트 Run > localhost:8080/Back07_JDBC_Board > indx.jsp가 실행된다

- 만약, 여기서 list.jsp로 이동하고 싶다면? 두 가지 방식이 존재한다. 두 방식의 차이는?

(1) localhost:8080/Back07_JDBC_Board/board/list.jsp 

(2) localhost:8080/Back07_JDBC_Board/board?act=list

 

이는 메인 서블릿을 거치는지 안 거치는지의 차이다.

메인 서블릿을 거칠 경우 Request에 데이터가 들어있다. 따라서 (2)의 방식을 사용하도록 하자.

→ 보통 이를 방지하기 위해 WEB-INF(단순 url에 경로 적는 걸론 접근이 불가능) 하위에 파일을 생성하기도 한다.

 

 

 

 


2. View 작성하기

list.jsp - 게시물들을 보여주는 jsp 파일 
<c:forEach items="${list }" var="board"></c:forEach>

여기서 list는 page > request > session > application 영역 순서로 찾는다.

또한, EL 표현법을 쓰기 때문에 board를 따로 import 하지 않아도 알아서 찾아 쓴다 

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib  prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>게시글 목록</title>
</head>
<body>
	<h2>게시글 목록</h2>
	<hr>
	<div>
		<table>
			<tr>
				<th>번호</th>
				<th>제목</th>
				<th>글쓴이</th>
				<th>조회수</th>
				<th>등록일</th>
			</tr>
			<c:forEach items="${list }" var="board">
				<tr>
					<td>${board.id }</td>
					<td>${board.title }</td>
					<td>${board.writer }</td>
					<td>${board.viewCnt }</td>
					<td>${board.regDate }</td>
				</tr>
			</c:forEach>
		</table>
	</div>
</body>
</html>

- 단, 이 때 board.id .title .writer 들은 필드명이 아니라 getter를 찾아 접근한다.

- 예를 들어, getId()인 경우, I를 소문자로 바꾼 후 id로 접근한다. 따라서 항상 getter를 만들어야 한다.

 

 

- 위와 같이 DB와 잘 연동된 모습을 확인할 수 있다.

- 그러나, 만약 메인서블릿을 거치지 않는다면? 데이터가 뜨지 않는 걸 확인할 수 있다!

- request영역에 실린 데이터가 없기 때문이다.

 

 

 

wrtieForm.jsp - 게시물 등록 jsp
<form action="/board"></form>

- Context root는 버려지고 포트번호부터 출발한다.

<form action="board"></form>

- 상대주소로 마지막에 있는 부분만 버려지면서 바뀐다.

 

 

 

Git 참고

https://github.com/dearbeany/JDBC-Web-board