지난 시간,
프론트 컨트롤러 (jsp)
DispatcherServlet를 만들었다.
▼ DispatcherServlet
package com.springbook.view.controller;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
// @WebServlet("*.do") 라고 쓰는 매핑정보가 web.xml에 들어 있다.
// 프론트 컨트롤러의 역할
public class DispatcherServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
process(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
process(request, response);
}
private void process(HttpServletRequest request, HttpServletResponse response) {
// request, response를 받아서 필요한 작업 처리
// getRequestURI() 포트번호를 제외하고 뒤의 값을 반환
String uri = request.getRequestURI();
String path = uri.substring(uri.lastIndexOf("/")); // /login.do <- 이렇게 '/' 뒤의 주소를 가지고 온다
System.out.println(path);
// .do 뒤에 뭐가 오냐에 따라 판단
if (path.equals("/login.do")) {
System.out.println("로그인 처리");
} else if (path.equals("/logout.do")) {
System.out.println("로그아웃 처리");
} else if (path.equals("/insertBoard.do")) {
System.out.println("글 등록 처리");
} else if (path.equals("/updataBoard.do")) {
System.out.println("글 수정 처리");
} else if (path.equals("/deleteBoard.do")) {
System.out.println("글 삭제 처리");
} else if (path.equals("/getBoard.do")) {
System.out.println("글 상세 조회 처리");
} else if (path.equals("/getBoardList.do")) {
System.out.println("글 목록 검색 처리");
}
}
}
요청하는 주소값을 잘 처리하고 있다. 이걸 시작으로 model2방식의 게시판을 만들 수 있다.
로그인 처리가 된 주소를
http://localhost:9999/BoardWeb/login.do 이렇게 바꿔줘야 한다.
login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<center>
<form action="login.do" method="post">
<table border="1" callpadding="0" cellspacing="0">
<tr>
<td bgcolor="orange">아이디</td>
<td>
<input type="text" name="id">
</td>
</tr>
<tr>
<td bgcolor="orange">비밀번호</td>
<td>
<input type="password" name="password">
</td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="submit" value="로그인"></td>
</tr>
</table>
</form>
</center>
</body>
</html>
<form action="login.do" method="post"> 를 DispatcherServlet에 써 놓은 주소로 바꿔준다.
DispatcherServlet 에는 login.do로 페이지를 이동하면 어느 화면을 보여줄지 판단하기 위해 모델1방식에서 작성했던 login_proc 의 코드를 옮겨 넣어준다.
모델 1방식에서는 프론트컨트롤러 없이 login_proc가 바로 화면 이동을 할 수 있게 해줬다.
→ 글 목록 보기
http://localhost:9999/BoardWeb/getBoardList.jsp 이 주소로 직접 실행하면 안되고
http://localhost:9999/BoardWeb/getBoardList.do 로 직접 접근해야한다.
이렇게 접근해도 주소는 .jsp로 바뀌는데 리다이렉트 방식이기 때문
DispatcherServlet
package com.springbook.view.controller;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.springbook.biz.board.BoardVO;
import com.springbook.biz.board.impl.BoardDAO;
import com.springbook.biz.user.UserVO;
import com.springbook.biz.user.impl.UserDAO;
// @WebServlet("*.do") 라고 쓰는 매핑정보가 web.xml에 들어 있다.
// 프론트 컨트롤러의 역할
public class DispatcherServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
process(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
process(request, response);
}
private void process(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// request, response를 받아서 필요한 작업 처리
// getRequestURI() 포트번호를 제외하고 뒤의 값을 반환
String uri = request.getRequestURI();
String path = uri.substring(uri.lastIndexOf("/")); // /login.do <- 이렇게 '/' 뒤의 주소를 가지고 온다
System.out.println(path);
// .do 뒤에 뭐가 오냐에 따라 판단
if (path.equals("/login.do")) {
System.out.println("로그인 처리");
// login_proc 의 코드. 모델 2에서는 프론트컨트롤러가 proc의 역할을 수행한다.
String id = request.getParameter("id");
String password = request.getParameter("password");
UserVO vo = new UserVO();
vo.setId(id);
vo.setPassword(password);
UserDAO dao = new UserDAO();
UserVO user = dao.getUser(vo);
if(user != null) {
HttpSession session = request.getSession();
session.setAttribute("id", vo.getId());
response.sendRedirect("getBoardList.do");
}else{
response.sendRedirect("login.jsp");
}
} else if (path.equals("/logout.do")) {
System.out.println("로그아웃 처리");
HttpSession session = request.getSession();
session.invalidate();
response.sendRedirect("login.jsp");
} else if (path.equals("/insertBoard.do")) {
System.out.println("글 등록 처리");
request.setCharacterEncoding("UTF-8");
String title = request.getParameter("title");
String writer = request.getParameter("writer");
String content = request.getParameter("content");
BoardVO vo = new BoardVO();
BoardDAO dao = new BoardDAO();
vo.setTitle(title);
vo.setWriter(writer);
vo.setContent(content);
dao.insertBoard(vo);
response.sendRedirect("getBoardList.do");
} else if (path.equals("/updataBoard.do")) {
System.out.println("글 수정 처리");
request.setCharacterEncoding("UTF-8");
String seq = request.getParameter("seq");
String title = request.getParameter("title");
String content = request.getParameter("content");
BoardVO vo = new BoardVO();
BoardDAO dao = new BoardDAO();
vo.setSeq(Integer.parseInt(seq));
vo.setTitle(title);
vo.setContent(content);
dao.updateBoard(vo);
response.sendRedirect("getBoardList.do");
} else if (path.equals("/deleteBoard.do")) {
System.out.println("글 삭제 처리");
request.setCharacterEncoding("UTF-8");
String seq = request.getParameter("seq");
BoardVO vo = new BoardVO();
BoardDAO dao = new BoardDAO();
vo.setSeq(Integer.parseInt(seq));
dao.deleteBoard(vo);
response.sendRedirect("getBoardList.do");
} else if (path.equals("/getBoard.do")) {
System.out.println("글 상세 조회 처리");
String seq = request.getParameter("seq");
BoardVO vo = new BoardVO();
BoardDAO dao = new BoardDAO();
vo.setSeq(Integer.parseInt(seq));
BoardVO board = dao.getBoard(vo);
// 데이터를 session에 담아 최종적으로 "getBoard.jsp"로 페이지 이동
HttpSession session = request.getSession();
session.setAttribute("board", board);
response.sendRedirect("getBoard.jsp");
} else if (path.equals("/getBoardList.do")) {
System.out.println("글 목록 검색 처리");
BoardVO vo = new BoardVO();
BoardDAO dao = new BoardDAO();
List<BoardVO> boardList = dao.getBoardList(vo);
// 목록을 session에 담아 최종적으로 "getBoardList.jsp"로 페이지 이동
HttpSession session = request.getSession();
session.setAttribute("boardList", boardList);
// 실제 화면에 뿌려줄때는 jsp로 가야한다.
response.sendRedirect("getBoardList.jsp");
}
}
}
하지만 이렇게 프론트컨트롤러에 모든 정보를 담아두는 것은 좋은 방법이 아니다.
핸들러의 역할만 하는 것이 적절.
getBoard
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@page import="com.springbook.biz.board.*"%>
<%@page import="com.springbook.biz.board.impl.*"%>
<%
//String seq = request.getParameter("seq");
//BoardVO vo = new BoardVO();
//BoardDAO dao = new BoardDAO();
//vo.setSeq(Integer.parseInt(seq));
//BoardVO board = dao.getBoard(vo);
// 모델 2방식에서는 위 코드 사용 X
BoardVO board = (BoardVO)session.getAttribute("board");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<center>
<h1>글 상세</h1>
<a href="logout.do">Log-out</a>
<hr>
<form action="updateBoard.do" method="post">
<input name="seq" type="hidden" value="<%=board.getSeq() %>">
<table border="1" cellpadding="0" cellspacing="0">
<tr>
<td bgcolor="orange" width="70">제목</td>
<td align="left">
<input name="title" type="text" value="<%=board.getTitle() %> ">
</td>
</tr>
<tr>
<td bgcolor="orange" width="70">작성자</td>
<td align="left">
<%=board.getWriter() %>
</td>
</tr>
<tr>
<td bgcolor="orange" width="70">내용</td>
<td align="left">
<textarea name="content" cols="40" rows="10" ><%=board.getContent() %></textarea>
</td>
</tr>
<tr>
<td bgcolor="orange" width="70">등록일</td>
<td align="left">
<%=board.getRegDate() %>
</td>
</tr>
<tr>
<td bgcolor="orange" width="70">조회수</td>
<td align="left">
<%=board.getCnt() %>
</td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="submit" value="글 수정"/>
</td>
</tr>
</table>
</form>
<hr>
<a href="insertBoard.jsp">글 등록</a> <!-- 글 등록은 .jsp -->
<a href="deleteBoard.do?seq=<%=board.getSeq() %>">글 삭제</a>
<a href="getBoardList.do">글 목록</a>
</center>
</body>
</html>
getBoardList
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@page import="com.springbook.biz.board.*"%>
<%@page import="com.springbook.biz.board.impl.*"%>
<%@page import="java.util.*"%>
<%
//BoardVO vo = new BoardVO();
//BoardDAO dao = new BoardDAO();
//List<BoardVO> boardList = dao.getBoardList(vo);
// 모델 2방식에서는 위 코드를 사용하지 않는다.
// DispatcherServlet에서 만들어 둔 session에서 데이터를 가지고 온다
List<BoardVO> boardList = (List<BoardVO>)session.getAttribute("boardList");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<center>
<h1>글 목록</h1>
<h3>
테스트님! 게시판에 오신 걸 환영합니다! <a href="logout.do">log-out</a>
</h3>
<form action="getBoardList.jsp" method="post">
<table border="1" cellpadding="0" cellspacing="0" width="700">
<tr>
<td align="right">
<select name="searchCondition">
<option value="TITLE">제목</option>
<option value="CONTENT">내용</option>
</select>
<input name="searchKeyword" type="text" />
<input type="submit" value="검색" />
</td>
</tr>
</table>
</form>
<table border="1" cellpadding="0" cellspacing="0" width="700">
<tr>
<th bgcolor="orange" width="100">번호</th>
<th bgcolor="orange" width="200">제목</th>
<th bgcolor="orange" width="150">작성자</th>
<th bgcolor="orange" width="150">등록일</th>
<th bgcolor="orange" width="100">조회수</th>
</tr>
<%
for (BoardVO board : boardList) {
%>
<tr>
<td>
<%=board.getSeq() %>
</td>
<td>
<a href="getBoard.do?seq=<%=board.getSeq() %>">
<%=board.getTitle() %></a>
</td>
<td>
<%=board.getWriter() %>
</td>
<td>
<%=board.getRegDate() %>
</td>
<td>
<%=board.getCnt() %>
</td>
</tr>
<%
}
%>
</table>
<br> <a href="insertBoard.jsp">새글 등록</a>
</center>
</body>
</html>
insertBoard
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<center>
<h1>글 등록</h1>
<a href="logout.do">Log-out</a>
<hr>
<form action="insertBoard.do" method="post">
<table border="1" callpadding="0" cellspacing="0">
<tr>
<td bgcolor="orange" width="70">제목</td>
<td align="left"><input type="text" name="title" /></td>
</tr>
<tr>
<td bgcolor="orange">작성자</td>
<td align="left"><input type="text" name="writer" size="10" /></td>
</tr>
<tr>
<td bgcolor="orange">내용</td>
<td align="left"><textarea name="content" cols="40" rows="10"></textarea></td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="submit" value="새 글 등록" />
</td>
</tr>
</table>
</form>
<hr>
<a href="getBoardList.do">글 목록 가기</a>
</center>
</body>
</html>
글이 잘 들어오는 것을 확인할 수 있다.
MVC 구조의 프로그래밍
- DispatcherServlet(f.c)
- HandlerMapping
: 매핑정보를 관리해주는 핸들러
- Controller(a.c)
: 인터페이스 상속하는 구조로 작성, 역할은 다르지만 하나의 표준화된 메소드를 가지고 실행
(비즈니스 계층과 비슷하다)
- ViewResolver(jsp)
'2024_UIUX 국비 TIL' 카테고리의 다른 글
UIUX _국비과정 0723 [스프링 컨트롤러 사용하기] (0) | 2024.08.19 |
---|---|
UIUX _국비과정 0722 [웹소켓 채팅, 스프링 컨트롤러 사용하기] (0) | 2024.07.31 |
UIUX _국비과정 0718 [스프링 model1방식 웹만들기] (0) | 2024.07.30 |
UIUX _국비과정 0717 [스프링 3대 요소, AOP] (0) | 2024.07.29 |
UIUX _국비과정 0716 [스프링 게시판, 사용자 로그인 여부 알리기] (0) | 2024.07.29 |