본문 바로가기

Java & Spring/SpringFramework

13. 서블릿과 JSP(1) 31:47

728x90

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

 - 처음에 서블릿이 생성될 때, 서블릿을 초기화하기 위해서 사용한다.

 - 생성할 때 한번만 수행된다.

서버 실행 후 URL 호출시 한번실행

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 예외가 발생했을 때 생성되는 예외 객체

 

728x90