Servlet 2.5와 3의 차이점은 무엇입니까?


92

저는 Servlet 2.5를 준수하는 J2EE 코드를 롤링하고 있으며 2.5와 3의 주요 차이점이 무엇인지 궁금합니다. 공식 Sun 문서와 개인적인 경험에 대한 포인터가 가장 높이 평가됩니다.

당분간 3으로 나 자신을 염려하지 말아야한다면 그렇게 말하십시오. 감사!


2
+1 그냥 :) 답변을 기다리고
ATorras

답변:


149

최신 정보

업데이트와 마찬가지로 더 명확하게하기 위해 서블릿 2.5와 3의 주요 차이점은 다음과 같습니다 (완전하지 않으려 고하는 것이 아니라 가장 흥미로운 부분 만 언급합니다).

서블릿, 필터 및 리스너를 선언하는 주석 (개발 용이성)

서블릿 2.5에서 하나의 init 매개 변수로 서블릿을 선언하려면 이것을 web.xml 에 추가해야합니다 .

<servlet>
    <servlet-name>myServlet</servlet-name>
    <servlet-class>my.server.side.stuff.MyAwesomeServlet</servlet-class>
    <init-param>
        <param-name>configFile</param-name>
        <param-value>config.xml</param-value>
    </init-param>
</servlet>

<servlet-mapping>
    <servlet-name>myServlet</servlet-name>
    <url-pattern>/path/to/my/servlet</url-pattern>
</servlet-mapping>

서블릿 3에서 web.xml 은 선택 사항이며 XML 대신 주석을 사용할 수 있습니다. 같은 예 :

@WebServlet(name="myServlet",
    urlPatterns={"/path/to/my/servlet"},
    initParams={@InitParam(name="configFile", value="config.xml")})
public class MyAwesomeServlet extends HttpServlet { ... }

필터의 경우 서블릿 2.5의 web.xml 에 다음을 추가해야합니다 .

<filter>
    <filter-name>myFilter</filter-name>
    <filter-class>my.server.side.stuff.MyAwesomeServlet</filter-class>
</filter>
<filter-mapping>
    <filter-name>myFilter</filter-name>
    <url-pattern>/path/to/my/filter</url-pattern>
</filter-mapping>

서블릿 3에서 주석을 사용하는 것과 동일합니다.

@ServletFilter(name="myFilter", urlPatterns={"/path/to/my/filter"})
public class MyAwesomeFilter implements Filter { ... }

리스너 (이 경우 ServletContextListener)의 경우 서블릿 2.5에서 :

<listener>
    <listener-class>my.server.side.stuff.MyAwesomeListener</listener-class>
</listener>

주석을 사용하여 동일 :

@WebServletContextListener
public class MyAwesomeListener implements ServletContextListener { ... }

web.xml 모듈화 (플러그 가능성)

  • 서블릿 2.5에는 모 놀리 식 web.xml이 하나뿐입니다. 파일이 .
  • 서블릿 3에서 각 "로드 가능"jar는 서블릿, 필터 등을 지정하는 META-INF 디렉토리 에 web-fragment.xml 을 가질 수 있습니다 . 이는 라이브러리와 프레임 워크가 자체 서블릿 또는 기타 개체를 지정할 수 있도록하기위한 것입니다.

컨텍스트 초기화 시간에 서블릿, 필터 및 리스너의 동적 등록 (플러그 가능성)

서블릿 (3)에서,은 ServletContextListener동적으로 추가 서블릿, 필터는 다음의 방법을 사용하여 수신기를 추가 할 수있다 SevletContext: addServlet(), addFilter()addListener()

비동기 지원

예 : 일부 서블릿 컨테이너의 스레드 풀에 5 개의 스레드가 있고 요청 당 실행되는 시간이 많이 걸리는 프로세스가 있다고 가정합니다 (복잡한 SQL 쿼리처럼).

  • 그것은 동시에 다섯 개 요청과 다섯 개 가능한 스레드 처리를하고 시작을받는 경우 스레드가 될 때까지 반환하지 않기 때문에 서블릿 2.5이 서블릿 컨테이너는, 사용 가능한 스레드 밖으로 실행됩니다 service()(또는 doGet(), doPost()등) 처음부터 실행 종료하고 응답을 반환합니다.

  • 서블릿 3.0을 사용하면이 오랜 프로세스를 다른 스레드에 위임 service()하고 응답을 보내기 전에 완료 할 수 있습니다 (이제 응답은 최신 스레드에서 전송됩니다). 이렇게하면 스레드가 새 응답을받을 수 있습니다.

비동기 지원의 예 :

서블릿 2.5 :

public class MyAwesomeServlet extends HttpSerlvet {

    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) {
        // ...

        runSlowProcess();
        // no async support, thread will be free when runSlowProcess() and
        // doGet finish

        // ...
    }

}

서블릿 3 :

@WebServlet(name="myServlet",
             urlPatterns={"/mySlowProcess"},
             asyncSupported=true) // asyncSupported MUST be specified for
                                  // servlets that support asynchronous
                                  // processing
public class MyAwesomeServlet extends HttpSerlvet {

    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) {


        // an AsyncContext is created, now the response will be completed
        // not when doGet finalizes its execution, but when
        // myAsyncContext.complete() is called.
        AsyncContext myAsyncContext = request.startAsync(request, response);

        // ...

        // myAsyncContext is passed to another thread
        delegateExecutionToProcessingThread(myAsyncContext);

        // done, now this thread is free to serve another request
    }

}

// ... and somewhere in another part of the code:

public class MyProcessingObject {

    public void doSlowProcess() {

        // ...

        runSlowProcess();
        myAsyncContext.complete(); // request is now completed.

        // ...

    }

}

인터페이스 AsyncContext 에는 요청 객체, 응답 객체를 가져오고 프로세스가 완료되면이를 알리는 리스너를 추가하는 메서드도 있습니다.

프로그래밍 방식 로그인 및 로그 아웃 (보안 향상)

서블릿 (3)에서, 인터페이스는 HttpServletRequest두 개의 새로운 방법이 추가되었다 : login(username, password)logout() .

자세한 내용은 Java EE 6 API를 참조하십시오 .


3
Servlet 3.0이 2009 년 12 월에 다시 출시되었다는 사실은 언급 할 가치가 있습니다. 질문과 현재 허용되는 답변은 그보다 앞서 있습니다.
eis

1
@ServletFilter@WebFilter@WebServletContextListener@WebListener공식 사양 AFAICT.
lapo

21

Servlet 3.0은 아직 출시되지 않았지만 매우 가까운 것 같습니다. 3.0에서 가장 중요한 변경 사항은 플러그 가능성, 개발 용이성, 비동기 서블릿, 보안입니다. 이것이 당신에게 중요한지 아닌지는 내가 말할 수 없습니다.

이들 중 가장 중요한 것은 아마도 비동기 서블릿에 대한 지원 일 것입니다. 이에 대해 자세히 설명 하는 기사 가 있습니다. 전체 사양은 여기에서 다운로드 할 수 있습니다 .


맙소사, 대단해. 정보를 제공해 주셔서 감사합니다. 나는 이것과 매우 유사한 코딩을 방금 마쳤습니다.
Max A.

@adi 2009 년 12 월에 출시되었습니다 ( jcp.org/aboutJava/communityprocess/final/jsr315 )
mauhiz


13

Don이 언급했듯이 주요 개선 및 추가 영역은 다음과 같습니다.

  • 플러그 가능성 (web.xml 모듈화)
  • 개발 용이성 (주석, 제네릭, 구성에 대한 규칙)
  • 비동기 서블릿 지원 (혜성 스타일 프로그래밍, 비동기 웹 프록시, 비동기 웹 서비스 용)
  • 보안 향상 (프로그래밍 방식 로그인 / 로그 아웃)
  • 기타 (HttpOnly 쿠키, 세션 추적, WAR 파일의 EJB)

자세한 내용은 Javaone 2008 프레젠테이션 " Java Servlet 3.0 API : 새롭고 흥미로운 기능 "을 확인하십시오.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.