web-dev-qa-db-ja.com

Servlet 2.5と3の違いは何ですか?

私はServlet 2.5に準拠したJ2EEコードを公開していますが、2.5と3の主な違いは何なのか疑問に思っています。公式のSunドキュメントと個人的な経験へのポインタは大歓迎です。

とりあえず3で自分のことを考えてはいけないなら、そう言ってください。ありがとう!

89
Max A.

更新

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

Web.xmlのモジュール化(プラガビリティ)

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

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

サーブレット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 をご覧ください。

144
morgano

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

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

21
Dónal

ドンが述べたように、改善と追加の主な分野は次のとおりです。

  • プラグイン可能性(web.xmlのモジュール化)
  • 開発の容易さ(注釈、ジェネリック、構成より規約)
  • 非同期サーブレットのサポート(コメットスタイルプログラミング、非同期Webプロキシ、非同期Webサービス用)
  • セキュリティの強化(プログラムによるログイン/ログアウト)
  • その他(HttpOnly Cookie、セッショントラッキング、WARファイル内のEJB)

詳細については、Javaone 2008のプレゼンテーション「 Java Servlet 3.0 API:新機能およびエキサイティングな機能 」をご覧ください。

13
Pascal Thivent

このリンクはサーブレット3に関する十分な情報を提供します

サーブレット3は、web.xml

@WebServlet
@WebServletContextListener
@ServletFilter
@InitParam
1
Ravi Parekh