김찬진의 개발 블로그
[23/05/01] Servlet / JSP / 본문
스프링부트는 내장톰캣서버가 있다
내장톰캣서버에는 WAS, 서블릿 컨테이너를 가지고 있다
내장톰캣서버는 서블릿 컨테이너에 서블릿 객체 (EX) MemberSaveServlet 등)를 싱글톤으로 생성한다
클라이언트가 요청을 보내면(EX) a 태그 누르기 등) 웹브라우저가 HTTP Request Message를 내장톰캣서버에게 보낸다
내장톰캣서버의 WAS는 그 HTTP Request Message를 읽고 HttPServletRequest객체와 HttPServletResponse객체를 매번 새롭게 만든다
내장톰캣서버는 HttPServletRequest객체와 HttPServletResponse객체를 서블릿 객체에게 넘겨준다
서블릿 객체가 호출되면 객체의 service 메서드가 호출된다
service 메서드는 HttPServletRequest객체로부터 데이터를 얻어내거나 HttPServletResponse객체의 데이터를 수정한다
내장톰캣서버는 HttPServletResponse객체를 WAS에게 전달한다
WAS는 HttPServletResponse객체를 웹브라우저에게 전달한다
Servlet
특정 url (EX) localhost:8080/servlet/members/save) 로 클라이언트 요청이 들어오면 톰캣의 WAS가 HttpServletRequest객체와 HttpServletResponse객체를 매번 새롭게 만든다.
톰캣의 WAS는 HttpServletRequest객체와 HttpServletResponse객체를 해당 urlPattern을 가진 서블릿 객체 (EX) MemberSaveServlet)에게 보낸다.
서블릿 객체의 service 메서드가 호출된다.
service 메서드는 HttpServletRequest객체로부터 데이터를 얻어내서(request.getParameter("username")), 동적으로 만들어진 HTML코드를 HttpServletResponse객체에 실어서(response.getWriter()) 클라이언트에게 보낸다. (JAVA 코드 안에 HTML를 쓴다.)
@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");
String username = request.getParameter("username");
int age = Integer.parseInt(request.getParameter("age"));
Member member = new Member(username, age);
memberRepository.save(member);
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
PrintWriter printWriter = response.getWriter();
printWriter.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>");
}
}
JSP
특정 url (EX) localhost:8080/jsp/members/save.jsp) 로 클라이언트 요청이 들어오면 톰캣의 WAS가 HttpServletRequest객체와 HttpServletResponse객체를 매번 새롭게 만든다. 이때 url은 특정 리소스를 의미한다.
톰캣의 WAS는 HttpServletRequest객체와 HttpServletResponse객체를 특정 리소스 (EX) /jsp/members/save.jsp)에게 보낸다.
jsp 파일안에 두 부분이 존재하는데, JAVA 코드로 짜여진 로직부분과 그 로직의 결과를 동적으로 HTML 코드에 포함시키는 부분이다. (HTML 안에 JAVA 코드를 쓴다.)
특정 url에서 jsp파일 띄워서 클라이언트에게 보여준다.
<%@ page import="hello.servlet.domain.member.Member" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import ="hello.servlet.domain.member.Member"%>
<%@ page import ="hello.servlet.domain.member.MemberRepository"%>
<%
// request, response 사용 가능
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>
성공 webapp/jsp/save.jsp
<ul>
<li>id=<%=member.getId()%></li>
<li>username=<%=member.getUsername()%></li>
<li>age=<%=member.getAge()%></li>
</ul>
<a href="/index.html">메인</a>
</body>
</html>
서블릿과 JSP를 사용한 MVC패턴
특정 url (EX) localhost:8080/servlet-mvc/members/new-form) 로 클라이언트 요청이 들어오면 톰캣의 WAS가 HttpServletRequest객체와 HttpServletResponse객체를 매번 새롭게 만든다.
C
톰캣의 WAS는 HttpServletRequest객체와 HttpServletResponse객체를 해당 urlPattern을 가진 서블릿 객체 (EX) MvcMemberSaveServlet)에게 보낸다.
서블릿 객체의 service 메서드가 호출된다.
M
service 메서드는 HttpServletRequest객체로부터 데이터를 얻어내고 Model에 데이터를 저장한다. (request.setAttribute("member", member))
C
viewPath 객체를 리터럴로 만든다. (String viewPath = "/WEB-INF/views/save-result.jsp";)
주어진 viewPath에 위치한 특정 리소스에 대한 작동하는 RequestDispatcher 객체를 만든다.
RequestDispatcher객체를 활용해서 HttpServletRequset객체를 특정 리소스에 forward하거나 HttpServletResponse객체의 리소스를 include한다.
V
템플릿 문법을 활용해서 동적으로 HTML 코드를 작성하고 jsp파일을 만든다.
HttpServletResponse객체에 jsp파일을 포함시켜 해당 url에 jsp파일을 띄워서 클라이언트에게 보여준다