回答:
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リクエストの処理、サーブレットに入る可能性のあるすべての処理と同じことができます。
Dispatcher Servlet
アノテーションベースを使用する場合、xmlファイルが必要@RestController
ですか?
Spring MVCでは、すべての受信リクエストは単一のサーブレットを経由します。このサーブレットDispatcherServlet
は、フロントコントローラです。フロントコントローラーは、Webアプリケーション開発における典型的な設計パターンです。この場合、単一のサーブレットがすべての要求を受け取り、それらをアプリケーションの他のすべてのコンポーネントに転送します。
のタスクは、DispatcherServlet
特定のSpring MVCコントローラーにリクエストを送信することです。
通常、コントローラーはたくさんあり、 DispatcherServlet
、ターゲットコントローラーを決定するために、次のマッパーのいずれかを参照します。
BeanNameUrlHandlerMapping
;ControllerBeanNameHandlerMapping
;ControllerClassNameHandlerMapping
;DefaultAnnotationHandlerMapping
;SimpleUrlHandlerMapping
。何も設定を行わない場合には、DispatcherServlet
用途BeanNameUrlHandlerMapping
、DefaultAnnotationHandlerMapping
デフォルトされます。
ターゲットコントローラが識別されると、 DispatcherServlet
要求を送信します。コントローラーは要求に従っていくつかの作業を実行し(またはそれを他のオブジェクトに委任し)、DispatcherServlet
モデルとビューの名前を使用してに戻ります。
ビューの名前は単なる論理名です。この論理名は、実際のビューを検索するために使用されます(コントローラーおよび特定のビューとの結合を回避するため)。次に、をDispatcherServlet
参照し、ViewResolver
ビューの論理名をビューの特定の実装にマップします。
可能な実装は次のViewResolver
とおりです。
BeanNameViewResolver
;ContentNegotiatingViewResolver
;FreeMarkerViewResolver
;InternalResourceViewResolver
;JasperReportsViewResolver
;ResourceBundleViewResolver
;TilesViewResolver
;UrlBasedViewResolver
;VelocityLayoutViewResolver
;VelocityViewResolver
;XmlViewResolver
;XsltViewResolver
。とき DispatcherServlet
、それは応答としてレンダリングされる結果を表示するビューを決定します。
最後に、DispatcherServlet
はResponse
オブジェクトをクライアントに返します。
DispatcherServlet
Spring MVCのフロントコントローラーパターンの実装です。
ここのSpringドキュメントの説明を参照してください。
基本的に、それは受信リクエストを受け取り、そのリクエストの処理を多数のハンドラーの1つに委任するサーブレットであり、そのマッピングはDispatcherServlet
構成に固有です。
DispatcherServlets
あなたのアーキテクチャは道が、通常にない理由はありませんがより理にかなっている場合、。
私はこの質問がすでに解決済みとしてマークされていることを知っていますが、このパターンを詳細に説明する新しい画像を追加したいと思います(出典: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)によってクライアントに戻される出力をレンダリングします。
@Controller
呼び出されたメソッドの真上に@ResponseBody
、返された応答がHTTP応答の本文に直接書き込まれる必要があることを示す特別な注釈を置きます。 。
DispatcherServlet
Spring MVCのすべてを処理するようなものです。
Webコンテナーの起動時に:
DispatcherServlet
init()
メソッドを呼び出してロードおよび初期化されます
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
指示ViewResolver
しDispatcherServlet
ます。
Dispatcher Controllerが図に表示されています。すべての着信要求は、フロントコントローラーとして機能するディスパッチャーサーブレットによってインターセプトされています。ディスパッチャーサーブレットは、XMLファイルからハンドラーマッピングへのエントリを取得し、コントローラーへの要求を転送します。
<?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>