dearbeany
[JDBC&Web] MVC 모델로 게시판 만들기, CRUD 실습 본문
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 참고
'Web' 카테고리의 다른 글
[JDBC] 게시판 만들기 (3. DBUtil 클래스 생성 ~ 4. CRUD 완성 및 테스트) (1) | 2022.09.25 |
---|---|
[JDBC] JDBC의 작업순서 | 게시판 만들기 실습 (1.board 테이블 설계 ~ 2.Java 프로젝트 생성) (0) | 2022.09.25 |
[MySQL] 집계함수의 결과를 group by 없이 출력하기 (OVER) (0) | 2022.09.15 |
[Bootstrap] ToDoList 스타일 꾸며보기 (0) | 2022.08.30 |
[ToDoList] 추가, 삭제 기능 구현 및 로컬스토리지 이용 (0) | 2022.08.30 |