web-dev-qa-db-ja.com

web.xmlを使用したサーブレットマッピング

サーブレットマッピングのweb.xmlの構造に関して混乱があります。実行しても問題はありませんが、なぜデプロイメント記述子にこのようなパターンがあるのか​​を理解しようとしています。

<web-app>
    <servlet>
         <servlet-name>Servlet1</servlet-name>
         <servlet-path>foo.Servlet</servlet-path>
    </servlet>
    <servlet-mapping>
         <servlet-name>Servlet1</servlet-name>
         <url-pattern>/enroll</url-pattern>
    </servlet-mapping>
</web-app>

Url-pattern "/ enroll"に対する要求が来るたびに、サーブレットコンテナはservlet-nameとurl-patternを照合し、対応するservlet-pathを見つけようとし、コントロールを転送します。 foo.Servletへ。基本的に、servlet-nameを見つけるためのパスとservlet-pathのためのパスの2つのパスがあります。私の質問は、コンテナが次のように動作するように設計されているかどうかです

<web-app>
        <servlet>
             <servlet-name>foo.Servlet</servlet-path>
             <url-pattern>/enroll</url-pattern>
        </servlet>
</web-app>

次のアプローチを使用した場合の欠点は何でしょうか。それはより効率的であり、応答時間は速いでしょう。

29
Mike

これにより、サーブレットは複数のサーブレットマッピングを持つことができます。

<servlet>
    <servlet-name>Servlet1</servlet-name>
    <servlet-path>foo.Servlet</servlet-path>
</servlet>
<servlet-mapping>
    <servlet-name>Servlet1</servlet-name>
    <url-pattern>/enroll</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>Servlet1</servlet-name>
    <url-pattern>/pay</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>Servlet1</servlet-name>
    <url-pattern>/bill</url-pattern>
</servlet-mapping>

特定のサーブレットにフィルターをマッピングできます。

<filter-mapping>
    <filter-name>Filter1</filter-name>
    <servlet-name>Servlet1</servlet-name>
</filter-mapping>

あなたの提案はどちらもサポートしません。 web.xmlは、アプリケーションの起動中に1回だけ読み取られて解析され、皆さんが考えているようにすべてのHTTPリクエストでは解析されません。

Servlet 3.0以降、 @WebServlet このボイラープレートを最小化する注釈:

@WebServlet("/enroll")
public class Servlet1 extends HttpServlet {

こちらもご覧ください:

48
BalusC