본문으로 바로가기

Servlet 기본 및 예제

category Back-EndJSP 7년 전
반응형
Servlet 개념
WAS(톰캣)이 요청을 받았을 때 해당 요청을 처리해줄 컨트롤러.
최초 한번 생성되고, 다른 요청이 있을땐 기존 생성된 서블릿을 사용하기 때문에, 매번 새로운 처리 객체를 만드는 다른 CGI언어에 비해 서버가 받는 부하가 적다.

# Servlet 생명주기
1) @PostConstruct
Servlet이 생성될 때 1번만 실행됨, init메소드보다 먼저실행됨
어노테이션을 이용해 PostConstruct메소드로 지정함으로써 구현


1
2
3
4
5
6
@PostConstruct
public void myInitMethod()
{
    // 초기화 내용 구현
}
 
cs


2) init()
PostConstruct와 같이 Servlet이 생성될 때 1번만 실행됨
 
1
2
3
4
@Override
public void init() throws ServletException { 
    // 처리 내용 구현
}
cs



3) service()
웹브라우저의 요청이 있을때 WAS가 처리할 컨트롤러(Servlet)를 선정하면 해당 컨트롤러의 service메소드가 실행됨.
이 메소드에서 요청이 get인지 post인지 구분한 후 4)단계로 감
요청방식이 get이나 post에 관계없이 공통적으로 실행될 내용이 있다면 이 메소드에 구현할 수 있음
인자의 HttpServletReqeust는 웹브라우저의 요청을 표현한 객체, HttpServletResponse는 응답을 표현하는 객체



1
2
3
4
5
@Override
protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
    super.service(arg0, arg1);
    // 처리 내용 구현
}
cs


4) doGet() or doPost()
웹브라우저의 요쳥이 GET방식일땐 doGet, POST방식일땐 doPost메소드가 실행됨. service->doGet or doPost로 분기
인자는 service와 동일


1
2
3
4
5
6
7
8
9
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    // 처리 내용 구현
}
    
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    // 처리 내용 구현
}
cs


5) destory()
WAS 재가동, Servlet이 수정되 다시 로딩해야할 필요가 있는 경우, 기존 객체를 소멸시키게되는데 이때 실행되는 메소드

6) @PreDestroy
destroy가 실행된 후 실행되는 메소드
1)과같이 어노테이션으로 지정해 사용함

1. 프로젝트 생성
1) File->New->Dynamic Web Project

2) 이름 입력하고 Next 2번 클릭

3) Generate web.xml deploayment descriptor 체크해줌
(자동으로 web.xml파일 만들기위함)

4) 생성된 프로젝트 확인
Java Resources 부분에 Servlet, Model 등 java자원들이 들어가게되고
WebContent에 html, css, jsp등 view 관련 자원들이 들어가게됨

web.xml이 생성돼있는데, context 설정파일 역할을 함
context는 HelloJSP프로젝트 단위라고 생각하면 됨


 

2. Servlet 생성

1) Servlet도 클래스임. 클래스 생성
   패키지설정 꼭 해줘야함 (자신이 임의대로 3단계 패키지명 기술)

3. 처리 내용 구현
접속요청을 카운팅하는 간단한 서블릿 구현
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package com.exam.svl;
 
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
public class HelloServlet extends HttpServlet {
 
    private static final long serialVersionUID = 1L;
    
    private int visitor;
    
    @Override
    public void init() throws ServletException { 
        visitor = 0;
    }
    
    @Override
    protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
        super.service(arg0, arg1);

        System.out.println("지금까지 접속요청수 : "+visitor++);
        
        System.out.println("새로운 접속 요청 확인");
        
        if(visitor==1)
        {
            System.out.println("## 최초 접속 요청 ##");
        }
        
    }
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doGet 실행");
    }
    
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doPost 실행");
    }    
}
 




4. web.xml에 생성한 Servlet 등록
처음 web.xml을 열어보면 아래와 같은 내용을 확인할 수 있다.


web.xml에서 서블릿을 표현하는 방식은 다음과 같다.

<servlet>
  <servlet-name>helloServlet</servlet-name>
  <servlet-class>com.exam.svl.HelloServlet</servlet-class>

</servlet>

<servlet> : 하나의 서블릿을 표현
<servlet-name> : web.xml에서 이 서블릿을 식별할 때 사용하는 이름
<servlet-class> : 이 서블릿을 실제 구현한 클래스, 패키지+클래스명까지 기술

다음 정의한 servlet을 url과 매핑 시켜준다.

<servlet-mapping>
  <servlet-name>helloServlet</servlet-name>
  <url-pattern>/hello</url-pattern>
</servlet-mapping>

<servlet-mapping> : 하나의 서블릿 매핑 표현
<servlet-name> : 매핑될 서블릿의 이름, <servlet>으로 서블릿 정의할때 <servlet-name>으로 정의한 이름 사용하면 됨
<url-pattern> : 어떤 url로 요청을 했을때 이 서블릿이 담당하게 할 건지 그 url을 기술

# JSP에서 URL 형식

- IP주소
접속하려는 서버의 IP 주소

- 포트번호
접속에 사용할 포트번호

- 컨텍스트-경로
웹어플리케이션의 이름?정도, 톰캣의 server.xml에서 확인,수정 가능 기본값은 해당 프로젝트 이름
프로젝트를 생성할때 server.xml에 자동으로 추가됨

- 컴포넌트명
톰캣은 컨텍스트-경로로 지정된 웹어플리케이션의 webContent를 기본경로로 잡게되는데 여기 들어가는 컴포넌트명은 webContent내의 html, jsp 등의 파일 또는 web.xml에서 servlet-mapping으로 지정한 url등이 올 수있음

5. 테스트

1. 브라우저 주소창에 아래 url입력

localhost의 8080번 포트로 접속,
HelloJSP context의 hello 컴포넌트 요청

web.xml에 정의되어있는대로 /hello에 해당하는 helloServlet이름을 가진 HelloServlet 이 실행되게됨

2. 현재 HelloServlet에 응답에 관련된 코드를 구현하지 않아서 당연히 브라우저에 아무것도 안보임

 


3. 하지만 이클립스의 콘솔을 확인해보면 서블릿이 실행됐음을 확인할 수 있음.
  구현한 대로, 처음 접속 요청을 감지하고 로그가 출력된것이 확인됨.



4. 브라우저 새로고침 등을 통해 접속요청을 몇번 더해보면 아래와 같은 결과를 확인할 수 있다.
  새로운 접속요청이 있을때마다 visitor 변수값이 증가한다.
  설명한대로 init메소드는 컨테이너 내에 생성된 서블릿이 없어서 서블릿이 새로 생성될 때 1번 실행되기 때문에 visitor값이 다시 0으로
  초기화 되지 않음을 확인할 수 있다.
 

 

반응형

Back-EndJSP카테고리의 다른글

JSP 란?  (1) 2018.09.17
서블릿 초기화 파라미터(ServletConfig)  (0) 2018.09.17
JSP Servlet Context 단위 공유 파라미터  (0) 2018.09.17
JSP Servlet 한글 인코딩 처리  (0) 2018.09.17
JSP에서의 MVC 모델1, 모델2  (0) 2018.09.17