Spring MVC: różnica między znacznikami <kontekst: skanowanie elementów> i <sterowane adnotacjami />? [duplikować
To pytanie ma już odpowiedź tutaj:
Dlaczego Spring MVC odpowiada komunikatem 404 i zgłasza „Nie znaleziono mapowania dla żądania HTTP z URI […] w DispatcherServlet”? 6 odpowiedziNiektóre dni temu zacząłem studiować ten samouczek Spring Hello World:http: //viralpatel.net/blogs/spring-3-mvc-create-hello-world-application-spring-3-mvc
W tym samouczku Spring DispatcherServlet jest konfigurowany za pomocą spring-servlet.xml plik, ten:
<?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>
W tym pliku używamcontext: component-scan, aby powiedzieć, że Spring musi zeskanować mój plik, wyszukując adnotację, więc na przykład, gdy klasa kontrolera stwierdzi, że metoda jest opatrzona adnotacją@ RequestMapping („/ hello”)dnotacja @ wie, że ta metoda obsługuje żądanie HTTP w kierunku adresu URL kończącego się na „/ hello”. To jest proste ...
Teraz moje wątpliwości dotyczą projektu szablonu Spring MVC, który mógłbym automatycznie zbudować w STS \ Eclipse.
Kiedy tworzę nowy projekt Spring MVC w STS, mam to moje DispatcherServlet jest konfigurowany przez plik o nazwie servlet-context.xml, który zawiera konfigurację podobną do poprzedniego przykładowego pliku.
W tym pliku nadal mam tag skanowania komponentu:
<context:component-scan base-package="com.mycompany.maventestwebapp" />
ale mam też inny tag (wyglądający jak podobne zadanie), ten:
<annotation-driven />
Jaka jest różnica między tymi dwoma tagami?
Inną „dziwną” rzeczą jest to, że poprzedni przykład (który nie używa znacznika opartego na adnotacjach) jest bardzo podobny do projektu utworzonego przez STS przy użyciu projektu szablonu Spring MVC, ale jeśli usunę znacznik oparty na adnotacjach z jego plik konfiguracyjny projekt nie działa i wyświetla się następujący błąd:HTTP Status 404 -
I w stosie mam:
WARN: org.springframework.web.servlet.PageNotFound - Nie znaleziono mapowania dla żądania HTTP z URI [/ maventestwebapp /] w DispatcherServlet o nazwie „appServlet”
Ale dlaczego? Poprzedni przykład działa dobrze bez znacznika opartego na adnotacjach, a ta klasa kontrolera jest bardzo podobna. W rzeczywistości istnieje tylko jedna metoda, która obsługuje żądanie HTTP w kierunku ścieżki „/”
To jest kod mojej klasy kontrolera:
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";
}
Czy ktoś może mi pomóc w zrozumieniu tego?
Dziękuję Ci bardzo