数日前、私はこの Spring Hello World チュートリアルを勉強し始めました:http://viralpatel.net/blogs/spring-3-mvc-create-hello-world-application-spring-3-mvc/
このチュートリアルでは、Spring DispatcherServletはスプリングサーブレット.xmlこのファイル:
<?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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="net.viralpatel.spring3.controller" />
<bean id="viewResolver"
class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
このファイルでは、コンテキスト:コンポーネントスキャンタグは、Springがファイルをスキャンしてアノテーションを探す必要があることを示しているので、例えば、コントローラクラスがメソッドが@RequestMapping("/hello")アノテーションは、このメソッドが「/hello」で終わる URL への HTTP リクエストを処理することを認識します。これは簡単です...
現在、私の疑問は、STS\Eclipse で自動的にビルドできる Spring MVC テンプレート プロジェクトに関連しています。
STSで新しいSpring MVCプロジェクトを作成すると、ディスパッチャサーブレットという名前のファイルによって設定されますサーブレットコンテキスト.xml前のサンプル ファイルと同様の構成が含まれています。
このファイルには、コンポーネント スキャン タグがまだ残っています。
<context:component-scan base-package="com.mycompany.maventestwebapp" />
しかし、別のタグ(同様のタスクがあるように見える)もあります。
<annotation-driven />
これら 2 つのタグの違いは何でしょうか?
もう 1 つの「奇妙な」点は、前の例 (アノテーション駆動タグを使用しない) は、Spring MVC テンプレート プロジェクトを使用して STS によって作成されたプロジェクトと非常によく似ていますが、構成ファイルからアノテーション駆動タグを削除すると、プロジェクトが実行されず、次のエラーが発生することです。HTTP ステータス 404 -
スタックトレースには次の内容が記載されています:
警告: org.springframework.web.servlet.PageNotFound - 'appServlet' という名前の DispatcherServlet で、URI [/maventestwebapp/] の HTTP リクエストのマッピングが見つかりません
しかし、なぜでしょうか? 前の例はアノテーション駆動タグなしでもうまく動作し、このコントローラクラスも非常に似ています。実際、"/"パスへのHTTPリクエストを処理するメソッドは1つしかありません。
これは私のコントローラー クラスのコードです。
package com.mycompany.maventestwebapp;
import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
/**
* Handles requests for the application home page.
*/
@Controller
public class HomeController {
private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
/**
* Simply selects the home view to render by returning its name.
*/
@RequestMapping(value = "/", method = RequestMethod.GET)
public String home(Locale locale, Model model) {
logger.info("Welcome home! The client locale is {}.", locale);
Date date = new Date();
DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);
String formattedDate = dateFormat.format(date);
model.addAttribute("serverTime", formattedDate );
return "home";
}
誰かこのことを理解するのを手伝ってくれませんか?
どうもありがとうございます!
ベストアンサー1
<mvc:annotation-driven />
つまり、XML で一連の要素を指定したり、インターフェイスを実装したり、基本クラスを拡張したりすることなく、Spring Bean の依存関係を定義できます。たとえば、@Repository
クラスが Dao であることを Spring に伝えるために、JpaDaoSupport
DaoSupport のサブクラスを拡張したりする必要はありません。同様に、@Controller
Controller インターフェイスを実装したり、コントローラーを実装するサブクラスを拡張したりすることなく、指定されたクラスに HTTP リクエストを処理するメソッドが含まれていることを Spring に伝えます。
Spring が起動すると、XML 構成ファイルを読み取り、その中の要素を検索します。 Foo が<bean
のようなマークアップになっている場合、クラスがコントローラーであると認識され、そのように処理されます。デフォルトでは、Spring は管理する必要があるすべてのクラスが beans.XML ファイルで明示的に定義されていると想定します。<bean class="com.example.Foo" />
@Controller
を使用したコンポーネント スキャンは、<context:component-scan base-package="com.mycompany.maventestwebapp" />
Spring に対して、com.mycompany.maventestweapp の下にあるすべてのクラスのクラスパスを検索し、各クラスに、、、、、@Controller
または@Repository
が@Service
あるかどうかを確認するように指示します。これらがある場合、Spring は、XML 構成ファイルに@Component
入力した場合と同様に、クラスを Bean ファクトリに登録します。<bean class="..." />
一般的な Spring MVC アプリには、2 つの Spring 構成ファイルがあります。1 つはアプリケーション コンテキストを構成するファイルで、通常は Spring コンテキスト リスナーで開始されます。
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
また、Spring MVC 構成ファイルは通常、Spring ディスパッチャ サーブレットで開始されます。次に例を示します。
<servlet>
<servlet-name>main</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>main</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
Spring は階層型 Bean ファクトリをサポートしているため、Spring MVC の場合、ディスパッチャ サーブレット コンテキストはメイン アプリケーション コンテキストの子になります。サーブレット コンテキストが「abc」という Bean を要求された場合、まずサーブレット コンテキストを検索し、見つからない場合は親コンテキスト (つまりアプリケーション コンテキスト) を検索します。
データ ソース、JPA 構成、ビジネス サービスなどの共通 Bean はアプリケーション コンテキストで定義されますが、MVC 固有の構成はサーブレットに関連付けられた構成ファイルには定義されません。
お役に立てれば。