저는 Servlet 2.5를 준수하는 J2EE 코드를 롤링하고 있으며 2.5와 3의 주요 차이점이 무엇인지 궁금합니다. 공식 Sun 문서와 개인적인 경험에 대한 포인터가 가장 높이 평가됩니다.
당분간 3으로 나 자신을 염려하지 말아야한다면 그렇게 말하십시오. 감사!
답변:
최신 정보
업데이트와 마찬가지로 더 명확하게하기 위해 서블릿 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 { ... }
서블릿 (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를 참조하십시오 .
@ServletFilter→ @WebFilter및 @WebServletContextListener→ @WebListener공식 사양 AFAICT.
Don이 언급했듯이 주요 개선 및 추가 영역은 다음과 같습니다.
자세한 내용은 Javaone 2008 프레젠테이션 " Java Servlet 3.0 API : 새롭고 흥미로운 기능 "을 확인하십시오.
이 링크는 Servlet 3에 대한 충분한 정보를 제공합니다.
Servlet 3는 주석을 제거하여 web.xml
@WebServlet
@WebServletContextListener
@ServletFilter
@InitParam