1. 개요

이 예제에서는 Servlet 3.0+를 사용하여 Java 웹 애플리케이션을 작성합니다 .

web.xml 파일을 제거하는 데 도움 이되는 세 가지 어노테이션 ( @WebServlet , @WebFilter@WebListener)을 살펴 보겠습니다 .

2. Maven 의존성

이러한 새 어노테이션을 사용하려면 javax.servlet-api 의존성 을 포함해야합니다 .

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
</dependency>

3. XML 기반 구성

Servlet 3.0 이전에는 web.xml 파일 에서 Java 웹 애플리케이션을 구성했습니다 .

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
  http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  version="2.5">
    <listener>
        <listener-class>com.baeldung.servlets3.web.listeners.RequestListener</listener-class>
    </listener>
    <servlet>
        <servlet-name>uppercaseServlet</servlet-name>
        <servlet-class>com.baeldung.servlets3.web.servlets.UppercaseServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>uppercaseServlet</servlet-name>
        <url-pattern>/uppercase</url-pattern>
    </servlet-mapping>
    <filter>
        <filter-name>emptyParamFilter</filter-name>
        <filter-class>com.baeldung.servlets3.web.filters.EmptyParamFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>emptyParamFilter</filter-name>
        <url-pattern>/uppercase</url-pattern>
    </filter-mapping>
</web-app>

각 구성 섹션을 Servlet 3.0에 도입 된 각 어노테이션으로 대체 해 보겠습니다.

4. 서블릿

JEE 6은 Servlet 3.0과 함께 제공되어 서블릿 정의에 대한 어노테이션을 사용할 수 있으므로 웹 애플리케이션에 대한 web.xml 파일 사용을 최소화 할 수 있습니다 .

예를 들어 서블릿을 정의하고 @WebServlet 어노테이션으로 노출 할 수 있습니다.

URL 패턴 / uppercase에 대해 하나의 서블릿을 정의 해 보겠습니다 . 입력 요청 매개 변수 의 값 을 대문자로 변환합니다 .

@WebServlet(urlPatterns = "/uppercase", name = "uppercaseServlet")
public class UppercaseServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response) 
      throws IOException {
        String inputString = request.getParameter("input").toUpperCase();

        PrintWriter out = response.getWriter();
        out.println(inputString);
    }
}

 이제 참조 할 수 있는 서블릿 ( uppercaseServlet) 의 이름을 정의했습니다 . 다음 섹션에서이를 활용하겠습니다.

으로 @WebServlet 어노테이션, 우리는 교체하고 서블릿서블릿 매핑 으로부터 섹션 의 web.xml의 파일입니다.

5. 필터

필터는 사전 또는 사후 처리 작업을 수행 차단 요청 또는 응답에 사용되는 객체입니다.

@WebFilter 어노테이션 으로 필터를 정의 할 수 있습니다 .

입력 요청 매개 변수가 있는지 확인하는 필터를 만들어 보겠습니다 .

@WebFilter(urlPatterns = "/uppercase")
public class EmptyParamFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
      FilterChain filterChain) throws IOException, ServletException {
        String inputString = servletRequest.getParameter("input");

        if (inputString != null && inputString.matches("[A-Za-z0-9]+")) {
            filterChain.doFilter(servletRequest, servletResponse);
        } else {
            servletResponse.getWriter().println("Missing input parameter");
        }
    }

    // implementations for other methods
}

으로 @WebFilter의 어노테이션, 우리는 교체하고 필터필터 매핑 으로부터 섹션 의 web.xml의 파일입니다.

6. 청취자

종종 특정 이벤트를 기반으로 작업을 트리거해야합니다. 이것은 청취자가 구조에 오는 곳입니다. 이러한 객체는 이벤트를 수신하고 지정한 동작을 실행합니다.

이전과 마찬가지로 @WebListener 어노테이션 으로 리스너를 정의 할 수 있습니다 .

서버에 대한 요청을 수행 할 때마다 계산하는 리스너를 생성 해 보겠습니다. ServletRequestEvent 를 수신하는 ServletRequestListener를 구현합니다 .

@WebListener
public class RequestListener implements ServletRequestListener {
    @Override
    public void requestDestroyed(ServletRequestEvent event) {
        HttpServletRequest request = (HttpServletRequest)event.getServletRequest();
        if (!request.getServletPath().equals("/counter")) {
            ServletContext context = event.getServletContext();
            context.setAttribute("counter", (int) context.getAttribute("counter") + 1);
        }
    }

    // implementations for other methods
}

URL 패턴 / counter에 대한 요청은 제외 됩니다.

으로 @WebListener의 어노테이션, 우리는 교체하고 청취자  로부터 섹션 의 web.xml의 파일을.

7. 빌드 및 실행

다음 사용자를 위해 테스트를 위해 카운터 서블릿 컨텍스트 속성을 반환하는 / counter 엔드 포인트  에 대해 추가 한 두 번째 서블릿이  있습니다.

따라서 Tomcat 을 응용 프로그램 서버로 사용하겠습니다 .

3.1.0 이전 버전의 maven-war-plugin 을 사용하는 경우 failOnMissingWebXml 속성 false 로 설정해야합니다 .

이제 .war 파일을 Tomcat에 배포 하고 서블릿에 액세스 할 수 있습니다.

/ uppercase 끝점을 사용해 보겠습니다 .

curl http://localhost:8080/spring-mvc-java/uppercase?input=texttouppercase

TEXTTOUPPERCASE

또한 오류 처리가 어떻게 보이는지 확인해야합니다.

curl http://localhost:8080/spring-mvc-java/uppercase

Missing input parameter

마지막으로 청취자의 빠른 테스트 :

curl http://localhost:8080/spring-mvc-java/counter

Request counter: 2

8. 여전히 필요한 XML

Servlet 3.0에 도입 된 모든 기능에도 불구하고 web.xml 파일 이 여전히 필요한 사용 사례가 있습니다.

  • 어노테이션으로 필터 순서를 정의 할 수 없습니다 . 특정 순서로 적용해야하는 필터가 여러 개있는 경우 여전히 <filter-mapping> 섹션이 필요합니다.
  • 세션 시간 제한 을 정의하려면  <session-config> 섹션 을 사용해야합니다.
  • 컨테이너 기반 인증 에는 여전히 <security-role> 요소 가 필요합니다.
  • 환영 파일을 지정하려면 여전히 <welcome-file-list> 섹션이 필요합니다.

또는 Servlet 3.0은 또한 ServletContainerInitializer 를 통해 일부 프로그래밍 지원을 도입 하여 이러한 공백 중 일부를 채울 수도 있습니다.

9. 결론

이 예제에서는 동등한 어노테이션을 실행하여 web.xml 파일을 사용하지 않고 Java 웹 애플리케이션을 구성했습니다 .

항상 그렇듯이이 예제의 소스 코드는 GitHub 에서 찾을 수 있습니다 . 또한 기존 web.xml 파일을 사용하는 애플리케이션도 GitHub 에서 찾을 수 있습니다 .

Spring 기반 접근 방식의 경우 web.xml 대 Spring을 사용한 Initializer 사용방법(예제)를 참조하십시오 .