본문으로 바로가기

Servlet 기본 및 예제

category Back-End/JSP 2018. 9. 17. 22:11
반응형
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-End > JSP' 카테고리의 다른 글

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