코드 그라데이션
MVC 패턴 - 적용 본문
MVC 패턴 - 적용
회원 등록
회원 등록 폼 - 컨트롤러
@WebServlet(name = "mvcMemberFormServlet", urlPatterns = "/servlet-mvc/members/new-form")
public class MvcMemberFormServlet extends HttpServlet { // 컨트롤러 역할
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 그냥 jsp로 가주기만 하면 된다.
String viewPath = "/WEB-INF/views/new-form.jsp";
RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath); // 컨트롤러에서 뷰로 이동
dispatcher.forward(request, response); // 서블릿에서 jsp를 호출하는 코드. 서버끼리 내부에서 호출
}
}
부연설명
viewPath 변수:
- viewPath 변수는 보여줄 JSP 페이지의 경로를 저장.
이 코드에서는 "/WEB-INF/views/new-form.jsp"라는 JSP 페이지를 사용한다.
일반적으로 JSP 파일은 WEB-INF 폴더 안에 있으며, 직접 클라이언트에게 노출되지 않는다.
.RequestDispatcher 객체:
- RequestDispatcher는 서블릿에서 다른 자원 (이 경우 JSP 페이지) 로 제어를 전달하는데 사용.
request.getRequestDispatcher(viewPath)는 viewPath에 지정된 JSP 페이지로 제어를 전달하기 위한 RequestDispatcher
객체를 얻는다.
dispatcher.forward(request, response):
- 이 부분은 서블릿에서 JSP 페이지로 제어를 전달하는 역할을 한다.
forward 메서드를 호출하여 현재 서블릿에서 JSP 페이지로 요청을 전달하고, 이후 JSP 페이지에서 응답을 생성한다.
요약하면, 이 서블릿은 "/servlet-mvc/members/new-form" 경로로 들어오는 요청을 처리하고,
"new-form.jsp"라는 JSP 페이지를 클라이언트에게 보여준다.
이것은 MVC 아키텍처에서 컨트롤러 역할을 하며,
사용자 인터페이스 (회원 가입 양식)와 비즈니스 로직을 분리하여 웹 애플리케이션을 구조화하고
유지보수하기 쉽게 만든다.
회원 등록 폼 - 뷰
main/webapp/WEB-INF/views/new-form.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!-- 상대경로 사용, [현재 URL이 속한 계층 경로 + /save]
상대경로 쓴 이유는 경로가 달라도 다른 곳에서 계속 사용하기 위함-->
<form action="save" method="post">
username: <input type="text" name="username" />
age: <input type="text" name="age" />
<button type="submit">전송</button>
</form>
</body>
</html>
실행
화면 정상적으로 출력
회원 저장
회원 저장 - 컨트롤러
MvcMemberSaveServlet
@WebServlet(name = "mvcMemberSaveServlet", urlPatterns = "/servlet-mvc/members/save")
public class MvcMemberSaveServlet extends HttpServlet {
private MemberRepository memberRepository = MemberRepository.getInstance();
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 파라미터 받고
String username = request.getParameter("username");
int age = Integer.parseInt(request.getParameter("age"));
//실제 비즈니스 로직 호출하고
Member member = new Member(username, age);
memberRepository.save(member);
// 모델에 데이터 담고
//Model에 데이터를 보관한다.
request.setAttribute("member", member); // request 내부 저장소에 이 데이터가 저장됨.
// 뷰로 던지고
String viewPath = "/WEB-INF/views/save-result.jsp";
RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
dispatcher.forward(request, response); // 내부호출.
}
}
부연설명
# 회원 정보 수신 및 저장:
request.getParameter("username")와 request.getParameter("age")를 사용하여 클라이언트로부터 전송된 회원 이름과 나이 정보를 가져온다.
이 정보를 사용하여 Member 객체를 생성하고, memberRepository를 사용하여 회원 정보를 저장함.
# Model에 데이터 보관:
- request.setAttribute("member", member)를 사용하여 "member"라는 이름으로 member 객체를 Model에 저장.
이렇게 저장된 데이터는 JSP 페이지에서 사용할 수 있다.
# JSP 페이지로 제어 전달:
- 마지막으로, viewPath 변수에 저장된 JSP 페이지인 "/WEB-INF/views/save-result.jsp"로 제어를 전달한다.
이를 통해 클라이언트에게 응답 결과를 보여줄 JSP 페이지로 이동함.
요약하면, 이 서블릿은 회원 정보를 입력받아 저장하고,
저장된 회원 정보를 Model에 저장한 후
"/WEB-INF/views/save-result.jsp" JSP 페이지로 이동하여
결과를 클라이언트에게 보여주는 역할을 수행합니다.
이것은 MVC 아키텍처에서 컨트롤러 역할을 하며,
사용자의 입력을 처리하고 모델과 뷰 간의 상호 작용을 조정한다.
회원 저장 - 뷰
main/webapp/WEB-INF/views/save-result.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
성공
<ul>
<li>id=${member.id}</li>
<li>username=${member.username}</li>
<li>age=${member.age}</li>
</ul>
<a href="/index.html">메인</a>
</body>
</html>
실행해서 확인하면
데이터 입력 후 클릭하면
저장 데이터 확인 가능.
회원 목록 조회
회원 목록 조회 - 컨트롤러
MvcMemberListServlet
@WebServlet(name = "mvcMemberListServlet", urlPatterns = "/servlet-mvc/members")
public class MvcMemberListServlet extends HttpServlet {
private MemberRepository memberRepository = MemberRepository.getInstance();
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
List<Member> members = memberRepository.findAll();
request.setAttribute("members", members);
String viewPath = "/WEB-INF/views/members.jsp";
RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
dispatcher.forward(request, response);
}
}
부연설명
# 회원 목록 조회:
memberRepository.findAll()을 사용하여 모든 회원의 목록을 가져온다.
이것은 회원 목록을 데이터베이스나 다른 저장소에서 검색하는 것으로 가정.
Model에 데이터 보관:
- request.setAttribute("members", members)를 사용하여 "members"라는 이름으로 회원 목록을 Model에 저장한다.
이렇게 저장된 데이터는 JSP 페이지에서 사용할 수 있다.
JSP 페이지로 제어 전달:
- 마지막으로, viewPath 변수에 저장된 JSP 페이지인 "/WEB-INF/views/members.jsp"로 제어를 전달.
이를 통해 클라이언트에게 회원 목록을 표시할 JSP 페이지로 이동한다.
요약하면, 이 서블릿은 회원 목록을 조회하고, 조회된 회원 목록을 Model에 저장한 후
"/WEB-INF/views/members.jsp" JSP 페이지로 이동하여 결과를 클라이언트에게 보여주는 역할을 수행.
이것은 MVC 아키텍처에서 컨트롤러 역할을 하며, 사용자의 요청을 처리하고 모델과 뷰 간의 상호 작용을 조정.
회원 목록 조회 - 뷰
main/webapp/WEB-INF/views/members.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<a href="/index.html">메인페이지</a>
<table>
<thead>
<th>id</th>
<th>username</th>
<th>age</th>
</thead>
<tbody>
<c:forEach var="item" items="${members}">
<tr>
<td>${item.id}</td>
<td>${item.username}</td>
<td>${item.age}</td>
</tr>
</c:forEach>
</tbody>
</table>
</body>
</html>
데이터 3개 넣어서 실행하면
3개 들어가 있음.
'Spring > MVC 1' 카테고리의 다른 글
프론트 컨트롤러 패턴 소개 (0) | 2023.09.24 |
---|---|
MVC 패턴 - 한계 (0) | 2023.09.23 |
MVC 패턴 - 개요 (0) | 2023.09.23 |
JSP로 회원 관리 웹 애플리케이션 만들기 (0) | 2023.09.22 |
서블릿으로 회원 관리 웹 애플리케이션 만들기 (0) | 2023.09.22 |