サーブレット2.5と3の違いは何ですか?


91

サーブレット2.5に準拠したJ2EEコードをローリングしていますが、2.5と3の主な違いは何なのかと思います。公式のSunドキュメントへのポインタと個人的な経験が最も高く評価されています。

とりあえず3を気にする必要がなければ、そう言ってください。ありがとう!


2
+1答えを待っているだけです:)
ATorras 2009年

回答:


149

更新

更新と同様に、より明確にするために、これらはサーブレット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 { ... }

web.xmlのモジュール化(プラグアビリティ)

  • サーブレット2.5では、モノリシックweb.xmlファイルが1つだけあります。
  • サーブレット3では、それぞれの「ロード可能」ジャーを持つことができ、ウェブfragment.xmlその中にMETA-INFのこれは、ライブラリやフレームワークは独自のサーブレットまたはその他のオブジェクトを指定することができるようにすることですなど、サーブレット、フィルタを、指定したディレクトリを。

コンテキスト初期化時のサーブレット、フィルター、リスナーの動的登録(プラグアビリティ)

サーブレット3では、ServletContextListener動的に追加されたサーブレット、フィルタ、次の方法を使用してリスナーを追加することができますSevletContextaddServlet()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では、インターフェースにHttpServletRequest2つの新しいメソッドが追加されました:login(username, password)およびlogout()

詳細については、Java EE 6 APIをご覧ください。


3
サーブレット3.0が2009年12月にリリースされたことは、言及する価値があります。質問と現在受け入れられている回答の回答は、それらより前のものです。
eis 2013

1
@ServletFilter@WebFilterおよび@WebServletContextListener@WebListener公式仕様AFAICT。
lapo

21

サーブレット3.0はまだリリースされていませんが、非常に近いようです。3.0での最も重要な変更は、プラグ可能性、開発の容易さ、非同期サーブレット、セキュリティです。これらがあなたにとって重要であるかどうかは私には言えません。

これらのうち最も重要なものは、おそらく非同期サーブレットのサポートです。ここだ記事これを詳細に説明します。完全な仕様はここからダウンロードできます


神聖ながらくた、それは素晴らしいです。非同期のものは素晴らしいです、情報をありがとう。これと非常によく似たもののコーディングを終えたところです。
最大A.

@adiそれは、2009年(12月にリリースされたjcp.org/aboutJava/communityprocess/final/jsr315
mauhiz

4
2013-05にリリースされたUPDATE サーブレット3.1仕様新機能をご覧ください。
バジルブルク2015年

13

Donが述べたように、改善と追加の主な領域は次のとおりです。

  • プラグイン(web.xmlのモジュール化)
  • 開発のしやすさ(アノテーション、ジェネリックス、構成上の規約)
  • 非同期サーブレットのサポート(Cometスタイルのプログラミング、非同期Webプロキシ、非同期Webサービス用)
  • セキュリティの強化(プログラムによるログイン/ログアウト)
  • その他(HttpOnly Cookie、セッション追跡、WARファイル内のEJB)

詳細については、Javaone 2008のプレゼンテーション「Java Servlet 3.0 API:新機能と新機能」をご覧ください。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.