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 사용방법(예제)를 참조하십시오 .