Spring MVC: の違い そして タグ? [重複] 質問する

Spring MVC: の違い そして タグ? [重複] 質問する

数日前、私はこの 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 に伝えるために、JpaDaoSupportDaoSupport のサブクラスを拡張したりする必要はありません。同様に、@ControllerController インターフェイスを実装したり、コントローラーを実装するサブクラスを拡張したりすることなく、指定されたクラスに 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 固有の構成はサーブレットに関連付けられた構成ファイルには定義されません。

お役に立てれば。

おすすめ記事