서블릿은 컨트롤러로,
JSP는 뷰로 사용할 거
모델은 request로 사용할거다.
request.setAttribute()에 임시로 값을 저장할 수 있었어서.
mvc패턴은 항상 컨트롤러 거처서 view로 가야 함.
@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 {
String viewPath = "/WEB-INF/views/new-form.jsp";
RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
dispatcher.forward(request, response);
}
}
MVC의 기본은 모든 요청은 C를 거쳐서 가는 것, 그래서 그냥 response라도
이렇게 form이 있는 jsp를
RequestDispatcher는 말 그대로 요청을 전해주는 것이고, request.getRequestDispatcher(viewPath) 해 주면 viewPath를 가진 RequestDispatcher를 생성해 준다.
그 다음에, 거기로 request, response를 보낸다.
forward는 리다이렉트랑 다르다. 리다이렉트는 클라이언트가 호출을 하도록 하지만, forward는 그냥 서버내부에서만 호출하는 것이다.
그리고 /WEB-INF 이 경로는, 여기 아래에 있는 것 들은 클라이언트가 요청해도 안보여준다. 그래서 저렇게 쓴다.
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--<form action="/WEB-INF/views/save-result.jsp" method="post">--%>
<form action="save" method="post">
username: <input type="text" name="username" />
age: <input type="text" name="age" />
<button type="submit">전송</button>
</form>
</body>
</html>
그 다음은 또 이게 유형마다 다른데, jsp면 jsp 처리 다 한후 컨테이너가 그걸 캡쳐해 뒀다가 response에 넣는 둥, 다 다르다. servlet, 뭐 html, json 등등 다 유형마다 다르게 처리된다.
여튼 이경우는 jsp 이므로 jsp가 다 처리되면 그걸 컨테이너가 캡쳐해뒀다가 response에 넣고 다시 service로 돌아와 service가 다 끝나면 클라이언트에게 response를 보낸다.
아 저기서 그리고 action="save"인데, 이게 상대경로라고 함.
저렇게 하면 형제의 것을 뒤지는데, 이게 저 jsp파일 기준이 아니라 사용자가 요청한 url을 기준으로 형제임.
그러니까 폼 요청한 servlet의 url은 /servlet-mvc/members/new-form이고, 마찬가지로 /servlet-mvc/members/new-form에서 호출한 jsp의 url도 /servlet-mvc/members/new-form이다. 그리고 이 new-form.jsp에서 action으로 save를 하면
/servlet-mvc/members/save 이렇게 되는 것이다.
@WebServlet(name = "mvcMemberSaveServlet", urlPatterns = "/servlet-mvc/members/save")
public class MvcMemberSaveServlet extends HttpServlet {
MemberRepository memberRepository = MemberRepository.getInstance();
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String viewPath = "/WEB-INF/views/save-result.jsp";
Member member = new Member(request.getParameter("username"), Integer.parseInt(request.getParameter("age")));
Member savedMember = memberRepository.save(member);
request.setAttribute("member", savedMember);
RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
dispatcher.forward(request, response);
}
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<ul>
<li>id : ${member.id}</li>
<li>name : ${member.username}</li>
<li>age : ${member.age}</li>
</ul>
<a href="/index.html">메인</a>
</body>
</html>
${member.id} 저건 jsp 문법 중 하난데, 저렇게 하면 request.getAttribute("member").getId()와 같다.
getter로 호출해 주는거다.
@WebServlet(name="mvcMemberListServlet", urlPatterns = "/servlet-mvc/members")
public class MvcMemberListServlet extends HttpServlet {
MemberRepository memberRepository = MemberRepository.getInstance();
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String viewPath = "/WEB-INF/views/members.jsp";
List<Member> members = memberRepository.findAll();
request.setAttribute("members", members);
RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
dispatcher.forward(request, response);
}
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core_rt"%>
<html>
<head>
<title>Title</title>
</head>
<body>
<table>
<thead>
<th>id</th>
<th>name</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>
<a href="/index.html">메인</a>
</body>
</html>
이건 thymeleaf와 비슷한 태그문법이다.
http://java.sun.com/jstl/core_rt의 이름을 c를 이름으로 정하고, 저런 식으로 forEach문 사용할 수 있다.
'스프링 > 3. 스프링 MVC' 카테고리의 다른 글
23. 프론트 컨트롤러 (0) | 2023.08.06 |
---|---|
22. MVC 패턴 단점. (0) | 2023.08.06 |
20. MVC 개요 (0) | 2023.08.05 |
19. JSP 회원관리 웹 애플리케이션 (0) | 2023.08.05 |
18. 서블릿 회원관리 애플리케이션 (0) | 2023.08.05 |