스프링 서블릿, jsp, 그리고 mvc

justindevcode·2023년 7월 19일
0

스프링부트

목록 보기
23/39
post-thumbnail

스프링 서블릿, jsp, 그리고 mvc


서블릿

WebServlet(name = "memberFormServlet", urlPatterns = "/servlet/members/newform")
public class MemberFormServlet extends HttpServlet {
 @Override
 protected void service(HttpServletRequest request, HttpServletResponse 
response)
 throws ServletException, IOException {
 response.setContentType("text/html");
 response.setCharacterEncoding("utf-8");
 PrintWriter w = response.getWriter();
 w.write("<!DOCTYPE html>\n" +
 "<html>\n" +
 "<head>\n" +
 " <meta charset=\"UTF-8\">\n" +
 " <title>Title</title>\n" +
 "</head>\n" +
 "<body>\n" +
 "<form action=\"/servlet/members/save\" method=\"post\">\n" +
 " username: <input type=\"text\" name=\"username\" />\n" +
 " age: <input type=\"text\" name=\"age\" />\n" +
 " <button type=\"submit\">전송</button>\n" +
 "</form>\n" +
 "</body>\n" +
 "</html>\n");
 }
}

이전에 작성한 서블릿이다. 자바안에서 html을 냅다 작성한다고 생각하면 된다.

특별할게없지만 그렇기에 진짜 이게 맞나 생각이 들정도다.


jsp

위의 상황을 개선하고자 html안에서 필요한것들을 자바 코드로 조작하는 방법인거같다.

<%@ page import="hello.servlet.domain.member.MemberRepository" %>
<%@ page import="hello.servlet.domain.member.Member" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
// request, response 사용 가능
 MemberRepository memberRepository = MemberRepository.getInstance();
 System.out.println("save.jsp");
 String username = request.getParameter("username");
 int age = Integer.parseInt(request.getParameter("age"));
 Member member = new Member(username, age);
 System.out.println("member = " + member);
 memberRepository.save(member);
%>
<html>
<head>
 <meta charset="UTF-8">
</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>

편하게 html을 작성하면서 필요한곳에 자바 코드를 넣고 필요한 데이터들은 위에서 import로 받아오는것을 볼 수 있다.

근데 보면 이거도 먼가 html같은곳에 자바 코드가 덕지덕지 들어가있는 느낌이다.


MVC

각각의 단점을 보완 하면서 장점만 가져오기위해 업무를 분단 하게된다.

컨트롤러(서블릿, 데이터전달 역할과 뷰선택)

모델(서블릿의 객체 request, response를 사용)

@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 {
 System.out.println("MvcMemberListServlet.service");
 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);
 }
}

회원을 조회하는 기능인데 서블릿에서 데이터전달과 뷰호출을 한다.

뷰(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>

컨트롤러를 분리해서 jsp에서는 필요한부분에만 자바코드로 데이터를 삽입하게된다.

이런 방식으로 서로의 단점을 보안하지만 중복코드나 공통처리의 문제로 인해서 단점이 아직 많긴하다.


나의 생각

서블릿이 정말 웹 데이터 전달의 기초이며 지금의 SSR방식의 많은 기술들 (타임리프)같은것들이 jsp에서 시작됐겠구나 유추할 수있다. 지금은 잘 안쓰이는 기술이지만 웹통신의 이해를 위해서는 꼭 필요한거같다.

profile
("Hello World!");

0개의 댓글