1. 서블릿과 컨트롤러의 비교
- JSP와 Servlet은 거의 같다고 볼 수 있다.
- Servlet을 발전시킨게 Spring 이다.
(Dispatcherservlet) 어디서 사용? Spring에서도 사용한다. 그래서 Servlet을 알아야한다.
?. WebServlet 이란?
- @Controller + @RequestMapping 합친 형태라고 생각하면 된다.
(형태)
| @WebServlet("/rollDice2"); |
?. WebServlet과 @Controller의 차이점?
- @Controller은 필요한 매개변수만 사용해야 한다.
- 반면 @WebServlet은 메서드에 extends HttpServlet을 상속받아야하며, service가 있어야하고,
매개변수에 (HttpServiceRequest request, HttpServletReponse response) 불 필요한 매개변수 또한 다 넣어야 한다.
- Java는 단일상속의 특징을 갖고 있는데, @Controller에서는 상속을 받지않을 수 있게 개선이 되었다.
참고.
out.println 출력문을 사용하려면 매개변수에 throws IOException가 명시되어 있어야 한다.
| public void service(HttpServiceRequest request, HttpServletReponse response) throws IOException |
2. 서블릿의 생명주기
package com.fastcampus.ch2;
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. 뒷정리 - 서블릿이 메모리에서 제거될때 서블릿 컨테이너에 의해서 자동 호출
System.out.println("[HelloServlet] destroy() is called.");
}
}
@ Servlet은 기본적으로 3개의 메서드를 갖고있다.
1) init()
- 처음에 서블릿이 생성될 때, 서블릿을 초기화하기 위해서 사용한다.
- 생성할 때 한번만 수행된다.

2) service()
- 실제 작업을 처리하는 service 메서드

3) destroy()
- 서블릿이 변경되거나 새로 갱신될 때, 즉 메모리에서 제거될 때 한번만 수행된다.

@정리해서 이런식으로 동작한다고 생각하자.
1. 요청이 들어온다 ------> 서블릿 인스턴스가 존재하는가? ---(없다면) -------> 2번으로.
2. 서블릿 클래스 로딩&인스턴스 생성 -----> int()으로 초기화 -----> service()(처리)호출 -------> 응답해준다.
- Servlet은 singleten(싱글톤)이다.
- 즉 1개의 인스턴스만 만들어진다.
- 재 요청시 1개의 인스턴스를 재활용한다.
3. 재요청이 온다면 service만 계속 호출된다.
- 근데 여기서 서블릿 인스턴스가 존재하는지 어떻게 아는가?
- 프로그램이 실행되서 1번 동작한 이후엔
- Servlet Context에 children이라는 멤버가 인스턴스 변수로 있는데 Map 형태로 key와 value 값으로 저장되어있다.
- 그 안에 서블릿 이름과, 서블릿이 등록되어 있는데 여기서 인스턴스의 존재 여부를 판단한다.
4. 그리고 프로그램이 변경되거나 종료될 때, 즉 메모리에서 내려갈 때 destroy()를 호출한다.
3. JSP와 서블릿의 비교
@ JSP(Java Server Pages)란? = Servlet 으로 변환된다.
<%@ 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>
@ JSP 태그 종류
| 구분 | JSP 태그 | 용도 |
| 지시자 | <%@ %> | 페이지 속성 지정 |
| 주석 | <%-- --%> | 주석 처리 |
| 선언 | <%! %> | 변수, 메소드의 선언 |
| 표현식 | <%= %> | 결과값 출력 |
| 스크립트릿 | <% %> | JAVA 코드 삽입 |
| 액션태그 | <jsp:action></jsp:action> | 페이지 삽입, 공유, 자바빈 사용 |
4. JSP의 호출 과정
1) 첫번째 호출엔(시간이 걸린다. jsp 단점.)
*.jsp 요청이 들어오면 -> JspServlet이 받아서 -> Servlet 인스턴스가 존재하는가? -> 없다면
*.jsp 파일을 변환한다 -> twoDice_jsp.java 서블릿 소스파일로 -> 컴파일러가 twoDice_jsp.class 파일로 변환한다.
인스턴스를 생성한다. jspinit()메서드가 -> 생성된 인스턴스를 _jspService() 처리한다. -> 그리고 응답한다.
2) 두번째 호출엔
재 요청시 -> Servlet 인스턴스가 존재유무를 판단하고 -> 있다면 -> _jspService() 처리하고 응답한다.
3) 프로그램이 변경되면 다시 1번 과정을 거친다.
참고. 서블릿과 스프링의 차이
서블릿은 -> lazy - init() -> 늦은 초기화
- 요청이 올 때 객체르 만들고 초기화 한다.
스프링은 -> early - init()
- 미리 객체를 만들어놓고 요청이 올 때 초기화한다.
6. JSP의 서블릿으로 변환된 JSP의 비교
1. 클래스 이름 twoDice.jsp -> twoDice_jsp.java
2. <%! sadfsafas %> class 영역
3. <% asdfsafsa %> service 영역
7. JSP의 기본 객체 : 생성 없이 사용할 수 있는 객체.
<%
String year= request.getParameter("year");
%>
request를 사용하려면 매개변수에 HttpServletRequest request로 선언이 되어 있어야 하는데,
jsp서블릿 파일로 변환되면서 자동으로 선언되어 생성해준다.
pageContext도, session도, application도 기타 등등.. 선언부가 없어도 코드 블럭에서 사용할 수 있는데
변환된 코드가 스파게티 코드라 유지보수에 어렵다라는 단점이 있다.
@JSP의 기본 객체는 다음과 같다.
| 기본 객체 | 타입 | 설명 |
| request | javax.servlet.http.HttpServletRequest | 요청 정보가 담겨있는 객체 |
| response | javax.servlet.http.HttpServletResponse | 요청에 응답을 작성할 때 사용 |
| session | javax.servlet.http.HttpSession | HTTP session을 구현한 객체. 세션 정보 저장에 사용 |
| application | javax.servlet.ServletContext | Web Application 전체에서 공유하는 객체 |
| config | javax.servlet.ServletConfig | JSP 페이지에 대한 설정 정보가 담긴 객체 |
| page | java.lang.Object | JSP 페이지 객체 자신 |
| pageContext | javax.servlet.jsp.PageContext | JSP 페이지의 context정보를 제공 |
| out | javax.servlet.jsp.JspWriter | 응답에 포함될 내용을 출력할 때 사용 |
| exception | java.lang.Throwable | 예외가 발생했을 때 생성되는 예외 객체 |
'Java & Spring > SpringFramework' 카테고리의 다른 글
| 15. 서블릿과 JSP(3) 39:36 (0) | 2022.08.01 |
|---|---|
| 14. 서블릿과 JSP(2) 25:09 (0) | 2022.08.01 |
| 12. 관심사의 분리와 MVC 패턴 - 원리(2) 30:09 (0) | 2022.08.01 |
| 11. 관심사의 분리와 MVC패턴 - 원리(1) (0) | 2022.08.01 |
| 10. 관심사의 분리와 MVC패턴 - 이론 25:06 (0) | 2022.08.01 |