Controller
)์ ์ข์Servlet
์ธํฐํ์ด์ค ์์ service
๋ฉ์๋ ์กด์ฌ
ServletRequest
๋ฅผ ๋น์ฆ๋์ค ๋ก์ง์ผ๋ก ์ฒ๋ฆฌํด์ ServletResponse
๋ก ์๋ต
Java ๋ด์ฅ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ HTTPServlet
์ด๋ผ๋ ์ถ์ ํด๋์ค ๊ตฌํ
HTTPServlet
์ GenericServlet(์๋ธ๋ฆฟ ์ธํฐํ์ด์ค)
๋ฅผ ์์๋ฐ์
์น์์ ์ค๋ ์์ฒญ๊ณผ ์๋ต์ ๋ค๋ฃจ๋ ํ์ค ํ๋กํ ์ฝ
doGet(), doPost() ๋ฑ ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉํด์ ์ํ๋ ๋ก์ง ๊ตฌํ ๊ฐ๋ฅ (์ค๋ฒ๋ผ์ด๋ฉ)
๐๏ธ ์์
package hello.servlet.web;
import hello.servlet.domain.member.Member;
import hello.servlet.domain.member.MemberRepository;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(name = "memberSaveServlet", urlPatterns = "/servlet/members/save")
public class MemberSaveServlet extends HttpServlet {
private MemberRepository memberRepository = MemberRepository.getInstance();
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("MemberSaveServlet.service");
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
String username = request.getParameter("username");
int age = Integer.parseInt(request.getParameter("age"));
Member member = new Member(username, age);
memberRepository.save(member);
PrintWriter w = response.getWriter();
w.write("<html>\n" +
"<head>\n" +
" <meta charset=\"UTF-8\">\n" + "</head>\n" +
"<body>\n" +
"์ฑ๊ณต\n" +
"<ul>\n" +
" <li>id="+member.getId()+"</li>\n" +
" <li>username="+member.getUsername()+"</li>\n" +
" <li>age="+member.getAge()+"</li>\n" + "</ul>\n" +
"<a href=\"/index.html\">๋ฉ์ธ</a>\n" + "</body>\n" +
"</html>");
}
}
์๋ธ๋ฆฟ ๊ธฐ๋ฐ์ ์๋ฒ ์คํฌ๋ฆฝํธ ์ธ์ด (๋์ ์นํ์ด์ง ์์ฑ)
HTML ์ฝ๋ ์์ Java ์ฝ๋ ๋ฃ์
์ฅ์
๐๏ธ ์์
<%@ page import="hello.servlet.domain.member.Member" %>
<%@ page import="hello.servlet.domain.member.MemberRepository" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
MemberRepository memberRepository = MemberRepository.getInstance();
System.out.println("MemberSaveServlet.service");
String username = request.getParameter("username");
int age = Integer.parseInt(request.getParameter("age"));
Member member = new Member(username, age);
memberRepository.save(member);
%>
<html>
<head>
<title>Title</title>
</head>
<body>
์ฑ๊ณต
<ul>
<li>id=<%=member.getId()%></li>
<li>username=<%=member.getUsername()%></li>
<li>age=<%=member.getAge()%></li>
</ul>
<a href="/index.html">๋ฉ์ธ</a>
</body>
</html>
Servlet
+ JSP
ํํ
Model
View : ์ฌ์ฉ์์ ์์ฒญ์ ํ๋ฉด์ผ๋ก ์ถ๋ ฅ (JSP
)
Controller : ์ฌ์ฉ์ ์์ฒญ์ ์ฒ๋ฆฌ, ์์ฒญ์ ๋ฐ๋ฅธ ์ ์ฒด์ ์ธ ํ๋ฆ ์ ์ด (Servlet
)
FrontController ํจํด์ ์ ๋ชฉํ ์น ์ดํ๋ฆฌ์ผ์ด์ ํ๋ ์์ํฌ
์๋ธ๋ฆฟ์ด ํธ์ถ๋๋ฉด HttpServlet
์ด ์ ๊ณตํ๋ service()
ํธ์ถ
โก๏ธ ์คํ๋ง MVC DispatcherServlet
์ ๋ถ๋ชจ์ธ FrameworkServlet
์์ service()
์ค๋ฒ๋ผ์ด๋
โก๏ธ FrameworkServlet.service()
๋ฅผ ์์ํ๊ณ , ์ฌ๋ฌ ๋ฉ์๋๊ฐ ํธ์ถ๋๋ฉด์ DispatcherServlet.doDispatcher()
ํธ์ถ๋จ
์ฌ์ฉ์๊ฐ ์ ๋ณด๋ฅผ Controller
์๊ฒ ์์ฒญ โก๏ธ ๋น์ฆ๋์ค ๋ก์ง ์ํ ์ค ํ์์ Model
ํธ์ถํ์ฌ ๋ฐ์ดํฐ ์์ฒญ โก๏ธ ์๋ฃ์ View
๋ฅผ ํตํด ํ๋ฉด์ ์ถ๋ ฅ
Handler Mapping
Handler Adaptor
View Resolver
ModelAndView
: ์ปจํธ๋กค๋ฌ์์ ์ฒ๋ฆฌํ ๋ฐ์ดํฐ(๋ชจ๋ธ)๊ณผ ํด๋น ๋ฐ์ดํฐ๋ฅผ ํ์ํ View์ ์ ๋ณด๋ฅผ ๊ฐ์ง ๊ฐ์ฒดDispatcher Servlet
HandlerMapping
, HandlerAdapter
, ViewResolver
๋ฅผ ๋ฆฌ์คํธ๋ก ๊ฐ์ง๐ ์ฐธ๊ณ ๐ doDispatch ๋์ ์์
- ์ฒ์ FrontController ์ญํ
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception { HttpServletRequest processedRequest = request; HandlerExecutionChain mappedHandler = null; ModelAndView mv = null; // 1. ํธ๋ค๋ฌ ์กฐํ mappedHandler = getHandler(processedRequest); if (mappedHandler == null) { noHandleFound(processedRequest, response); return; } // 2.ํธ๋ค๋ฌ ์ด๋ํฐ ์กฐํ-ํธ๋ค๋ฌ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ ์ด๋ํฐ HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler()); // 3. ํธ๋ค๋ฌ ์ด๋ํฐ ์คํ -> 4. ํธ๋ค๋ฌ ์ด๋ํฐ๋ฅผ ํตํด ํธ๋ค๋ฌ ์คํ -> 5. ModelAndView ๋ฐํ mv = ha.handle(processedRequest, response, mappedHandler.getHandler()); processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException); } private void processDispatchResult(HttpServletRequest request, HttpServletResponse response, HandlerExecutionChain mappedHandler, ModelAndView mv, Exception exception) throws Exception { // ๋ทฐ ๋ ๋๋ง ํธ์ถ render(mv, request, response); } protected void render(ModelAndView mv, HttpServletRequest request, HttpServletResponse response) throws Exception { View view; String viewName = mv.getViewName(); // 6. ๋ทฐ ๋ฆฌ์กธ๋ฒ๋ฅผ ํตํด์ ๋ทฐ ์ฐพ๊ธฐ, 7.View ๋ฐํ view = resolveViewName(viewName, mv.getModelInternal(), locale, request); // 8. ๋ทฐ ๋ ๋๋ง view.render(mv.getModelInternal(), request, response); }
3) MVC ์ข ๋ฅ
MVC1
MVC2
๐ ์ฐธ๊ณ ๐ JSTL
- ์๋ฐ ์๋ฒ ํ์ด์ง ํ์ค ํ๊ทธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ (Javaserver pages Standard Tag Library)
- Java EE ๊ธฐ๋ฐ์ ์น ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ ํ๋ซํผ์ ์ํ ์ปดํฌ๋ํธ ๋ชจ์
- XML ๋ฐ์ดํฐ ์ฒ๋ฆฌ, JSP ํ๊ทธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ถ๊ฐํ์ฌ JSP ์ฌ์ ํ์ฅ
package hello.servlet.web.servletmvc;
import hello.servlet.domain.member.Member;
import hello.servlet.domain.member.MemberRepository;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
@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 viewPaht = "/WEB-INF/views/members.jsp";
RequestDispatcher dispatcher = request.getRequestDispatcher(viewPaht);
dispatcher.forward(request, response);
}
}
// /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>
<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>