스프링/3. 스프링 MVC

21. MVC 적용

sdafdq 2023. 8. 6. 01:03

서블릿은 컨트롤러로, 

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