回答:
更新
更新と同様に、より明確にするために、これらはサーブレット2.5と3の主な違いです(私は網羅するつもりはありません。最も興味深い部分についてのみ言及しています)。
サーブレット2.5では、1つの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では、それは同時に5つの要求を受信した場合、このサーブレットコンテナが使用可能なスレッドを使い果たすだろうとのスレッドがするまで戻りませんので、利用可能な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
2つの新しいメソッドが追加されました:login(username, password)
およびlogout()
。
詳細については、Java EE 6 APIをご覧ください。
@ServletFilter
→ @WebFilter
および@WebServletContextListener
→ @WebListener
公式仕様AFAICT。
サーブレット3.0はまだリリースされていませんが、非常に近いようです。3.0での最も重要な変更は、プラグ可能性、開発の容易さ、非同期サーブレット、セキュリティです。これらがあなたにとって重要であるかどうかは私には言えません。
これらのうち最も重要なものは、おそらく非同期サーブレットのサポートです。ここだ記事これを詳細に説明します。完全な仕様はここからダウンロードできます。
Donが述べたように、改善と追加の主な領域は次のとおりです。
詳細については、Javaone 2008のプレゼンテーション「Java Servlet 3.0 API:新機能と新機能」をご覧ください。
サーブレット3は、削除するアノテーションをサポートします web.xml
@WebServlet
@WebServletContextListener
@ServletFilter
@InitParam