SpringのDispatcherサーブレットとは何ですか?


195

この画像(ここから取得したもの)では、HTTPリクエストが何かを送信します Dispatcherサーブレットに。

ここに画像の説明を入力してください

私の質問は Dispatcherサーブレットするのですか?

それは、Webページからスローされた情報を取得してコントローラーにスローするようなものですか?

回答:


202

DispatcherServletの仕事は、着信URIを取り、ハンドラー(通常はコントローラークラスのメソッド)とビュー(通常はJSP)の正しい組み合わせを見つけて、その場所で見つかるはずのページまたはリソースを形成することです。

私が持っているかもしれない

  • ファイル /WEB-INF/jsp/pages/Home.jsp
  • および方法クラスの

    @RequestMapping(value="/pages/Home.html")
    private ModelMap buildHome() {
        return somestuff;
    }

ディスパッチャサーブレットは、ブラウザがページを要求した場合、そのメソッドを呼び出すために、HTML文書を作るために、一致JSPファイルを使用してその結果を結合するために、「知っている」というビットです。

これを実現する方法は、構成とSpringバージョンによって大きく異なります。

また、最終結果がWebページでなければならない理由もありません。これは、RMIエンドポイントの検索、SOAPリクエストの処理、サーブレットに入る可能性のあるすべての処理と同じことができます。


4
大いなる反論、今度はDispatcherServletがクラス名とメソッド名を識別する理由についての質問です。2つのクラスと2つのメソッド名がある構成の例と、DispatcherServletが適切なリクエストをキャッチする方法を教えてください。
ケビン

10
実際には、起動時にクラスパスをスキャンしてその注釈を探し、「/ pages / Home.html」をクラス+メソッドにマッピングします。「/pages/Home.html」があり、アノテーションに他の制限がない2つのメソッドがある場合、それはエラーとなり、例外が発生します。オールドスクールであれば、XMLと一緒に配線することもできます。
2010年

2
Dispatcher Servletアノテーションベースを使用する場合、xmlファイルが必要@RestControllerですか?
viper

1
@viperはweb.xmlで、アノテーションやxml構成を使用している場合でも、常にディスパッチャーサーブレットを構成する必要があります
Mahender Reddy Yasa

他のタイプのサーブレットはありますか?
MinhNghĩa

72

Spring MVCでは、すべての受信リクエストは単一のサーブレットを経由します。このサーブレットDispatcherServletは、フロントコントローラです。フロントコントローラーは、Webアプリケーション開発における典型的な設計パターンです。この場合、単一のサーブレットがすべての要求を受け取り、それらをアプリケーションの他のすべてのコンポーネントに転送します。

のタスクは、DispatcherServlet特定のSpring MVCコントローラーにリクエストを送信することです。

通常、コントローラーはたくさんあり、 DispatcherServlet、ターゲットコントローラーを決定するために、次のマッパーのいずれかを参照します。

何も設定を行わない場合には、DispatcherServlet用途BeanNameUrlHandlerMappingDefaultAnnotationHandlerMappingデフォルトされます。

ターゲットコントローラが識別されると、 DispatcherServlet要求を送信します。コントローラーは要求に従っていくつかの作業を実行し(またはそれを他のオブジェクトに委任し)、DispatcherServletモデルとビューの名前を使用してに戻ります。

ビューの名前は単なる論理名です。この論理名は、実際のビューを検索するために使用されます(コントローラーおよび特定のビューとの結合を回避するため)。次に、をDispatcherServlet参照し、ViewResolverビューの論理名をビューの特定の実装にマップします。

可能な実装は次のViewResolverとおりです。

とき DispatcherServlet、それは応答としてレンダリングされる結果を表示するビューを決定します。

最後に、DispatcherServletResponseオブジェクトをクライアントに返します。


47

DispatcherServletSpring MVCのフロントコントローラーパターンの実装です

ここのSpringドキュメントの説明を参照してください

基本的に、それは受信リクエストを受け取り、そのリクエストの処理を多数のハンドラーの1つに委任するサーブレットであり、そのマッピングはDispatcherServlet構成に固有です。


Flexのイベントのようなものですか?あるMXMLから別のMXMLに、またはサーバーにディスパッチイベントを取得します。アプリケーションに複数のDispatcherServletを含めることはできますか?各クラスファイルには個別のDispatcherServletがありますか。
ケビン

通常、フロントコントローラーは1つだけです。これは、モデルやビューに関係なく行われます。特定のモデルとビューを1つにまとめるだけです。
BalusC 2010年

2
@theband:あなたがすることができ、複数のを持っているDispatcherServletsあなたのアーキテクチャは道が、通常にない理由はありませんがより理にかなっている場合、。
skaffman

47

私はこの質問がすでに解決済みとしてマークされていることを知っていますが、このパターンを詳細に説明する新しい画像を追加したいと思います(出典:Spring in action 4):

ここに画像の説明を入力してください

説明

リクエストがブラウザー(1)を離れると、ユーザーが何を求めているかに関する情報が含まれます。少なくとも、リクエストにはリクエストされたURLが含まれます。ただし、ユーザーがフォームで送信した情報など、追加のデータが含まれる場合もあります。

リクエストの移動の最初の目的地は、SpringのDispatcherServletです。ほとんどのJavaベースのWebフレームワークと同様に、Spring MVCは単一のフロントコントローラーサーブレットを介してリクエストをファネリングします。フロントコントローラは、1つのサーブレットが実際の処理を実行するために、アプリケーションの他のコンポーネントへの要求に対する責任を委任する一般的なWebアプリケーションパターンです。Spring MVCの場合、DispatcherServletがフロントコントローラです。DispatcherServletの仕事は、Spring MVCコントローラーにリクエストを送信することです。コントローラは、リクエストを処理するSpringコンポーネントです。しかし、一般的なアプリケーションには複数のコントローラーがあり、DispatcherServletはリクエストを送信するコントローラーを決定するのに助けが必要です。したがって、DispatcherServletは1つ以上のハンドラーマッピングを調べます(2)リクエストの次のストップがどこにあるかを把握する。ハンドラーマッピングは、その決定を行うときに、要求によって運ばれるURLに特に注意を払います。適切なコントローラが選択されると、DispatcherServletは選択されたコントローラに陽気な方法でリクエストを送信します(3)。コントローラーでは、リクエストがペイロード(ユーザーが送信した情報)をドロップし、コントローラーがその情報を処理する間、辛抱強く待機します。(実際には、適切に設計されたコントローラーは、それ自体で処理をほとんどまたはまったく実行せず、代わりにビジネスロジックの責任を1つ以上のサービスオブジェクトに委任します。ユーザーとブラウザに表示されます。この情報はモデルと呼ばれます。ただし、生の情報をユーザーに送り返すだけでは十分ではありません。ユーザーフレンドリーな形式(通常はHTML)でフォーマットする必要があります。そのためには、情報をビュー(通常はJavaServer Page(JSP))に渡す必要があります。コントローラーが最後に行うことの1つは、モデルデータをパッケージ化し、出力をレンダリングするビューの名前を識別することです。次に、リクエストをモデルとビュー名とともにDispatcherServletに送信します。(4)。コントローラが特定のビューに結合されないように、DispatcherServletに返されるビュー名は特定のJSPを直接識別しません。ビューがJSPであることを必ずしも示唆していません。代わりに、結果を生成する実際のビューを検索するために使用される論理名のみを保持します。DispatcherServletするビューリゾルバー(5)問い合わせをして、論理ビュー名を特定のビュー実装(JSPの場合もそうでない場合もあるにマップします。DispatcherServletが結果をレンダリングするビューを認識したので、リクエストのジョブはほぼ終わりです。その最後のストップはビューの実装です(6)、通常はJSPで、モデルデータを配信します。リクエストの仕事がついに完了しました。ビューはモデルデータを使用して、(それほどハードワークではない)応答オブジェクト(7)によってクライアントに戻される出力をレンダリングします。


ブラウザで表示されるJSONオブジェクトを返す場合にどのようにビューを選択するのですか、論理ビューが選択されていない場合は同じURIに戻りますか?
ネスリン

1
@Nesrinあなたが尋ねてからずっと昔ですが、ここに答えがあります:@Controller呼び出されたメソッドの真上に@ResponseBody、返された応答がHTTP応答の本文に直接書き込まれる必要があることを示す特別な注釈を置きます。 。
ダッシュボード

6

DispatcherServletSpring MVCのすべてを処理するようなものです。

Webコンテナーの起動時に:

  1. DispatcherServletinit()メソッドを呼び出してロードおよび初期化されます
  2. init()of DispatcherServlet"servlet_name-servlet.xml"、すべてのBeanを識別できるような命名規則でSpring Configuration Documentを識別しようとします 。

例:

public class DispatcherServlet extends HttpServlet {

    ApplicationContext ctx = null;

    public void init(ServletConfig cfg){
        // 1. try to get the spring configuration document with default naming conventions
        String xml = "servlet_name" + "-servlet.xml";

        //if it was found then creates the ApplicationContext object
        ctx = new XmlWebApplicationContext(xml);
    }
    ...
}

したがって、通常DispatcherServletはリクエストURIをキャプチャしてに渡しHandlerMappingます。HandlerMappingコントローラのメソッドでマッピングBeanを検索します。コントローラは論理名(ビュー)を返します。次に、この論理名はDispatcherServletによって送信されHandlerMappingます。次に、接頭辞と接尾辞を追加してビューの完全な場所を提供し、クライアントにビューを提供するようにDispatcherServlet指示ViewResolverDispatcherServletます。


これは素晴らしい説明です。ポイント2は、DispatcherServletがSpring構成ドキュメントを「servlet_name-servlet.xml」のような命名規則で識別しようとすることを示しています。しかし、「ディスパッチャー」のような名前のみを使用するプロジェクトを見たことがありますが、これは問題なく機能します。私も試しました。しかし、なぜかわかりませんか?
Subhasish Bhattacharjee 2016

0

Dispatcher Controllerが図に表示されています。すべての着信要求は、フロントコントローラーとして機能するディスパッチャーサーブレットによってインターセプトされています。ディスパッチャーサーブレットは、XMLファイルからハンドラーマッピングへのエントリを取得し、コントローラーへの要求を転送します。


-1
<?xml version='1.0' encoding='UTF-8' ?>
<!-- was: <?xml version="1.0" encoding="UTF-8"?> -->
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
               http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">

    <bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/>
    <context:component-scan base-package="com.demo" />
    <context:annotation-config />

    <mvc:annotation-driven />


    <bean id="viewResolver"
          class="org.springframework.web.servlet.view.InternalResourceViewResolver"
          p:prefix="/WEB-INF/jsp/"
          p:suffix=".jsp" />

    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="datasource" />
    </bean> 

          <bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />  
        <property name="url" value="jdbc:mysql://localhost:3306/employee" />
        <property name="username" value="username" />
        <property name="password" value="password" />
    </bean> 

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