私はServlet 2.5に準拠したJ2EEコードを公開していますが、2.5と3の主な違いは何なのか疑問に思っています。公式のSunドキュメントと個人的な経験へのポインタは大歓迎です。
とりあえず3で自分のことを考えてはいけないなら、そう言ってください。ありがとう!
更新
更新として、そしてより明確にするために、これらはサーブレット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>
サーブレットでアノテーションを使用するのと同等:
@ServletFilter(name="myFilter", urlPatterns={"/path/to/my/filter"})
public class MyAwesomeFilter implements Filter { ... }
リスナー2.5(この場合は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 をご覧ください。
ドンが述べたように、改善と追加の主な分野は次のとおりです。
詳細については、Javaone 2008のプレゼンテーション「 Java Servlet 3.0 API:新機能およびエキサイティングな機能 」をご覧ください。
サーブレット3は、web.xml
@WebServlet
@WebServletContextListener
@ServletFilter
@InitParam