반응형
# Servlet 개념
WAS(톰캣)이 요청을 받았을 때 해당 요청을 처리해줄 컨트롤러.
최초 한번 생성되고, 다른 요청이 있을땐 기존 생성된 서블릿을 사용하기 때문에, 매번 새로운 처리 객체를 만드는 다른 CGI언어에 비해 서버가 받는 부하가 적다.
# Servlet 생명주기
1) @PostConstruct
Servlet이 생성될 때 1번만 실행됨, init메소드보다 먼저실행됨
어노테이션을 이용해 PostConstruct메소드로 지정함으로써 구현
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 {
// 처리 내용 구현
}
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 |