본문 바로가기

자바 웹/서블릿

서블릿 이해하기

728x90
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
package sec01.ex01;
 
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 FirstServlet extends HttpServlet{
    @Override
    public void init() throws ServletException {
        System.out.println("init 메소드 호출");
    }
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doGet 메소드 호출");
    }
    
    @Override
    public void destroy() {
        System.out.println("destroy 메소드 호출");
    }
}
cs

- FirstServelt.java

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
  <servlet> <!-- 브라우저에서 요청하는 매핑 이름에 대해 실제로 실행하는 서블릿 클래스를 설정 -->
      <servlet-name>aaa</servlet-name>
  <!-- <servlet-mapping>태그의 <servlet-name> 태그와 값이 동일 -->
      <servlet-class>sec01.ex01.FirstServlet</servlet-class>
  <!-- 브라우저에서 요청하는 매핑 이름에 대해 실제로 기능을 수행하는 서블릿 클래스 설정-->
  </servlet>
  <servlet-mapping> <!-- 브라우저에서 요청하는 논리적인 서블릿 설정-->
      <servlet-name>aaa</servlet-name>
  <!-- 매핑 이름으로 요청 시 값이 같은 <servlet>태그 안의 <servlet-name>과 연결 -->
      <url-pattern>/first</url-pattern>
<!-- 브라우저에서 sec01.ex01.FirstServlet을 요청하는 논리적인 서블릿 이름 -->
  </servlet-mapping>
</web-app>
cs

- web.xml

 

http://ip주소:포트번호/프로젝트이름/서브릿매핑 이름

(http://localhost:8090/pro05_1/first) - 로컬 pc에 설치된 경우 포트 번호만 입력해도 상관 없음

 

 

실행하면 콘솔창에 위와 같이 출력됨

 

다수의 서블릿 매핑

 

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
package sec01.ex01;
 
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 SecondServlet extends HttpServlet{
    @Override
    public void init() throws ServletException {
        System.out.println("init 메소드 호출>>");
    }
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doGet 메소드 호출>>");        
    }
    
    @Override
    public void destroy() {
        System.out.println("destroy 메소드 호출>>");
    }
}
cs

- SecondServlet.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
  <servlet>
      <servlet-name>aaa</servlet-name>
      <servlet-class>sec01.ex01.FirstServlet</servlet-class>
  </servlet>
  <servlet>
      <servlet-name>bbb</servlet-name>
      <servlet-class>sec01.ex01.SecondServlet</servlet-class>
  </servlet>
  
  <servlet-mapping>
      <servlet-name>aaa</servlet-name>
      <url-pattern>/first</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
      <servlet-name>bbb</servlet-name>
      <url-pattern>/second</url-pattern>
  </servlet-mapping>
</web-app>
cs

- web.xml 수정

 

위의 예제처럼 다수의 서블릿을 web.xml에 매핑하기 위해서는 <servlet>태그와 <servlet-mapping>를 분리한 뒤 <servlet-name>태그의 값을 다른 값으로 설정해야 함

 

출력 결과를 보면 최초 요청에만 init메소드가 실행되었고, 이후부터는 doGet메소드만 실행됨

 

애너테이션을 이용한 서블릿 매핑

 web.xml에 여러 서블릿을 설정할 경우 복잡해진다는 단점이 있다. 따라서 각 서블릿 클래스에 @를 사용해서 서블릿 표시를 해주면 가독성이 훨씬 좋아진다.

 

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
package sec01.ex01;
 
import java.io.IOException;
import javax.servlet.ServletConfig;
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("/Third")
public class ThirdServlet extends HttpServlet {
 
    public void init(ServletConfig config) throws ServletException {
        System.out.println("ThirdServlet init 메소드 호출");
    }
 
 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("ThirdServlet doGet 메소드 호출");    
    }
 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("ThirdServlet doPost 메소드 호출");        
    }
 
    public void destroy() {        
        System.out.println("ThirdServlet destroy 메소드 호출");
    }
}
cs

 

728x90

'자바 웹 > 서블릿' 카테고리의 다른 글

쿠키와 세션  (0) 2022.05.08
load-on-startup 기능  (0) 2022.05.08
바인딩  (0) 2022.04.11
서블릿 비즈니스 로직 처리  (0) 2022.03.27
서블릿 기초  (0) 2022.03.22