code

Tomcat 7을 사용한 @WebServlet 주석

codestyles 2020. 12. 4. 08:14
반응형

Tomcat 7을 사용한 @WebServlet 주석


내 응용 프로그램에서 web.xml에 다음 과 같이 정의 된 서블릿이 있습니다 .

<servlet>
    <display-name>Notification Servlet</display-name>
    <servlet-name>NotificationServlet</servlet-name>
    <servlet-class>com.XXX.servlet.NotificationServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>NotificationServlet</servlet-name>
    <url-pattern>/notification/*</url-pattern>
</servlet-mapping>

Tomcat 7을 사용하기 위해 이동 한 후 @WebServlet작업을 수행 할 주석 을 사용하고 싶습니다 .
내가 한 방법은 다음과 같습니다.

@WebServlet( name="NotificationServlet", displayName="Notification Servlet", urlPatterns = {"/notification"}, loadOnStartup=1)
public class NotificationServlet extends HttpServlet {

그리고 그것은 작동하지 않습니다. 누군가 내가 뭘 잘못했는지 말해 줄 수 있습니까?


Tomcat 7 이상을 사용하고 있다고 확신하는 web.xml경우 Tomcat이 주석을 스캔하고 처리하도록 하려면 webapp이 Servlet 3.0 사양을 준수하도록 선언해야합니다. 그렇지 않으면 Tomcat은 .NET의 Servlet 버전과 일치하는 대체 모드에서 계속 실행됩니다 web.xml. 서블릿 API 주석에 대한 지원은 서블릿 3.0 (Tomcat 7)에서만 추가되었습니다.

그래서, 당신의 루트 선언 web.xml다음과 같은 필수 모양은 (당신이 어떤 제거 할 DOCTYPE에서 web.xml그렇지 않으면도 Servlet 2.3으로 해석됩니다도를!).

<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_3_0.xsd"
    version="3.0">

또한 URL 패턴에 약간의 차이가 있습니다. URL 패턴 /notifications을 사용하면 서블릿이 정확히 해당 경로의 요청 만 수신 할 수 있습니다. 추가 경로와 같은 요청을 시작하지 않습니다 /notifications/list. URL 패턴 /notifications/*을 사용하면 서블릿이 추가 경로 정보로 요청을 수신 할 수도 있습니다.

따라서 최소 @WebServlet주석은 다음과 같아야합니다.

@WebServlet("/notifications/*")

나머지 속성은 선택 사항이므로 서블릿이 동일하게 작동하도록하기 위해 필수는 아닙니다.

또한보십시오:


같은 이름의 주석이있는 두 개의 클래스가 있는지 확인할 수도 있습니다.

@WebServlet(name = "Foo", urlPatterns = {"/foo"})
public class Foo extends HttpServlet {
    //...
}

과:

@WebServlet(name = "Foo", urlPatterns = {"/bar"})
public class Bar extends HttpServlet {
    //...
}

이 경우 서블릿 중 하나가 작동하지 않습니다. 이름을 사용하지 않는 경우 @BalusC가 제안하는 것처럼 생략하십시오. 서블릿 중 하나가 변경하고 컴파일 한 직후에만 작동하지만 변경없이 컴파일 한 후에는 작동하지 않는 이상한 동작이 발생했습니다.


또한 이러한 주석을 사용하고 코드를 컴파일하려면 pom.xml에서 해당 종속성을 가져와야하지만 제공된 원인에 따라 "Servlet 3.0"호환 서버에 이미이 항목이 있습니다.

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.0.1</version>
    <scope>provided</scope>
</dependency>

참고 URL : https://stackoverflow.com/questions/6535676/webservlet-annotation-with-tomcat-7

반응형