Servlet vs Controller
Servlet 은 class 마다 @WebServlet 을 사용해야 하기 때문에 클래스가 무한정 늘어나는 단점이 있다.
또한 HttpServlet 을 상속 받아야 하고 Service 메서드를 override 받아야 하기 때문에 한계가 명확하다.
파라미터 또한 HttpServletRequest, HttpServletResponse 를 모두 받아야 한다.
이런 점에서 Controller 가 더 발전된 형태이다.
Servlet 의 생성주기
package com.fastcampus.app;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/hello")
public class HelloServlet extends HttpServlet{
@Override
public void init() throws ServletException {
// 서블릿이 초기화 될 때 자동 호출 되는 메서드
// 1. 서블릿의 초기화 작업 담당
System.out.println("[HelloServlet] init() is called.");
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1. 입력
// 2. 처리
// 3. 출력
System.out.println("[HelloServlet] service() is called.");
}
@Override
public void destroy() {
// 3. 뒷 정리 - 서블릿이 메모리에서 제거 될 때 Servlet Container에 의해서 자동 호출
System.out.println("[HelloServlet] destroy() is called.");
}
}
실행 시
[HelloServlet] init() is called.
[HelloServlet] service() is called.
서블릿 : Singleton, 1개 인스턴스 재활용
JSP(Java Server Pages)란?
서블릿과 비슷하다, 서블릿으로 변환
twoDice.jsp =>변환 twoDice_jsp.java(서블릿 소스 파일) =>(컴파일) twoDice_jsp.class(서블릿 클래스 파일)
<%@ page contentType="text/html;charset=utf-8"%>
<%@ page import="java.util.Random" %>
<%-- <%! 클래스 영역 %> --%>
<%!
int getRandomInt(int range){
return new Random().nextInt(range)+1;
}
%>
<%-- <% 메서드 영역 - service()의 내부 %> --%>
<%
int idx1 = getRandomInt(6);
int idx2 = getRandomInt(6);
%>
<html>
<head>
<title>twoDice.jsp</title>
</head>
<body>
<img src='resources/img/dice<%=idx1%>.jpg'>
<img src='resources/img/dice<%=idx2%>.jpg'>
</body>
</html>
public final class twoDice_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent, org.apache.jasper.runtime.JspSourceImports {
int getRandomInt(int range) {
return new Random().nextInt(range)+1;
}
public void _jspService(final javax.servlet.http.HttpServletReqeust request,
final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException {
// ...
int idx1 = getRandomInt(6);
int idx2 = getRandomInt(6);
out.write("\t<html>\n");
out.write("\t<head>\n");
out.write("\t\t<title>twoDice.jsp<title>\n");
out.write("\t</head>\n");
out.write("\t<body>\n");
out.write("\t<img src='resources/img/dece>");
out.write(idx1);
out.write(".jpg'>\n");
// ...
JSP 의 호출 과정
초기화
서블릿 : lazy-init
스프링 : early-init
JSP 의 기본 객체
생성없이 사용할 수 있는 객체
기본 객체 | 타입 | 설명 |
request | 요청 정보가 담겨있는 객체 | |
response | 요청에 응답을 작성할 때 사용 | |
session | HTTP session 을 구현한 객체, 세션 정보 저장에 사용 | |
application | Web Application 전체에서 공유하는 객체 | |
config | JSP 페이지에 대한 설정 정보가 담긴 객체 | |
page | JSP 페이지 객체 자신 | |
pageContext | JSP 페이지의 context 정보를 제공 | |
out | 응답에 포함될 내용을 출력할 때 사용 | |
exception | 예외가 발생했을 때 생성되는 예외 객체 |
'Spring > Ch2. Spring MVC' 카테고리의 다른 글
Spring MVC - EL(Expression Language) (0) | 2022.09.17 |
---|---|
Spring MVC - 유효 범위(scope)와 속성(attribute) (0) | 2022.09.17 |
Spring MVC - servlet-context.xml (0) | 2022.09.16 |
Spring MVC - 관심사의 분리 (0) | 2022.09.15 |
Spring MVC - HTTP(Hyper Text Transfer Protocol)란? (0) | 2022.09.15 |