저는 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