programing

스프링 MVC: 와 태그의 차이점은 무엇입니까?

telecom 2023. 9. 2. 07:58
반응형

스프링 MVC: 와 태그의 차이점무엇입니까?

얼마 전에 저는 이 봄 헬로 월드 튜토리얼을 공부하기 시작했습니다: http://viralpatel.net/blogs/spring-3-mvc-create-hello-world-application-spring-3-mvc/

이 튜토리얼에서는 spring-servlet.xml 파일을 사용하여 Spring Dispatcher Servlet을 구성합니다. 다음 파일이 있습니다.

<?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>

이 파일에서 context:component-scan 태그를 사용하여 Spring이 주석을 검색하는 내 파일을 검색해야 한다고 말합니다. 예를 들어, 컨트롤러 클래스가 @RequestMapping("/hello")에 의해 주석이 달린 메서드가 "/hello"로 끝나는 URL에 대한 HTTP 요청을 처리한다는 것을 알 수 있습니다.이건 단순한...

STS\Eclipse에서 자동으로 빌드할 수 있는 Spring MVC 템플릿 프로젝트와 관련이 있습니다.

STS에서 새 Spring MVC 프로젝트를 만들 때 이전 예제 파일과 유사한 구성이 포함된 servlet-context.xml이라는 파일에 의해 DispatcherServlet이 구성됩니다.

이 파일에는 여전히 구성 요소 스캔 태그가 있습니다.

<context:component-scan base-package="com.mycompany.maventestwebapp" />

하지만 다른 태그도 있습니다(비슷한 작업을 수행하는 것처럼 보이는 태그).

<annotation-driven />

이 두 태그의 차이점은 무엇입니까?
또 다른 "이상한" 것은 이전 예제(주석 기반 태그를 사용하지 않음)가 STS가 Spring MVC Template 프로젝트를 사용하여 만든 프로젝트와 매우 유사하지만 구성 파일에서 주석 기반 태그를 삭제하면 프로젝트가 실행되지 않고 HTTP Status 404 -라는 오류가 표시된다는 것입니다.

스택 추적에서 다음과 같은 이점을 얻을 수 있습니다.

경고: org.스프링 프레임워크.웹.서블릿PageNotFound - 이름이 'appServlet'인 DispatcherServlet에 URI가 [/maventestwebapp/]인 HTTP 요청에 대한 매핑을 찾을 수 없습니다.

하지만 왜 그랬을까?이전 예제는 주석 기반 태그 없이도 잘 작동하며 이 컨트롤러 클래스는 매우 유사합니다.실제로 "/" 경로를 향한 HTTP 요청을 처리하는 방법은 하나뿐입니다.

다음은 컨트롤러 클래스의 코드입니다.

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";
}

누가 이 일을 이해하는 것을 도와줄 수 있습니까?

감사합니다!

<mvc:annotation-driven />즉, XML에서 요소 집합을 실제로 지정하거나 인터페이스를 구현하거나 기본 클래스를 확장할 필요 없이 스프링 콩 종속성을 정의할 수 있습니다.를 들어 를들면입니다.@Repository수업을 연장할 필요 없이 봄에 수업이 다오라고 말하는 것JpaDaoSupport또는 DaoSupport의 다른 하위 클래스입니다. 유하게사▁similarly@Controller지정된 클래스에 컨트롤러 인터페이스를 구현하거나 컨트롤러를 구현하는 하위 클래스를 확장할 필요 없이 Http 요청을 처리하는 메서드가 포함되어 있음을 나타냅니다.

"XML 파일"을 .<bean만약 그것이 무언가를 본다면 그 안의 요소들.<bean class="com.example.Foo" />그리고 Foo는 함께 표시되었습니다.@Controller클래스가 컨트롤러라는 것을 알고 있으며 클래스를 그렇게 취급합니다.기본적으로 Spring은 관리해야 하는 모든 클래스가 콩에 명시적으로 정의되어 있다고 가정합니다.XML 파.

를 사용한 <context:component-scan base-package="com.mycompany.maventestwebapp" />는 com각에 봄com.mycompany.maventtestsweapp이 있습니다.@Controller또는@Repository또는@Service또는@Component그리고 만약 그렇다면 스프링은 당신이 입력한 것처럼 콩 공장에 수업을 등록할 것입니다.<bean class="..." />XML 구성 파일에 있습니다.

일반적인 스프링 MVC 앱에는 두 개의 스프링 구성 파일이 있습니다. 이 파일은 일반적으로 스프링 컨텍스트 수신기로 시작하는 응용 프로그램 컨텍스트를 구성하는 파일입니다.

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

Spring MVC 구성 파일은 일반적으로 Spring dispatcher servlet으로 시작합니다.예를들면.

<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은 계층적 빈 팩토리를 지원하므로 Spring MVC의 경우 디스패처 서블릿 컨텍스트는 기본 애플리케이션 컨텍스트의 하위 항목입니다.서블릿 컨텍스트에서 "abc"라는 빈을 요청한 경우 서블릿 컨텍스트에서 먼저 찾고, 서블릿 컨텍스트에서 찾지 못하면 응용프로그램 컨텍스트인 상위 컨텍스트에서 찾습니다.

데이터 소스, JPA 구성, 비즈니스 서비스와 같은 공통 요소는 애플리케이션 컨텍스트에 정의되어 있지만 MVC 관련 구성은 서블릿과 연결된 구성 파일이 아닙니다.

이게 도움이 되길 바랍니다.

<context:component-scan base-package="" /> 

Spring에 해당 패키지에서 주석을 검색하도록 지시합니다.

<mvc:annotation-driven> 

에서는 MVC와 함께 제공되는 @RequestMapping, @ExceptionHandler 등의 주석이 달린 컨트롤러 메서드를 지원하기 위해 RequestMappingHanderMapping, RequestMappingHanderAdapter 및 ExceptionHandlerExceptionResolver를 등록합니다.

또한 출력의 Annotation 기반 형식과 입력에 대한 Annotation 기반 검증을 지원하는 ConversionService를 활성화합니다.또한 JSON 데이터를 반환하는 데 사용할 수 있는 @ResponseBody를 지원합니다.

@Configuration 클래스에서 @ComponentScan(basePackages={"...", "..."}) 및 @EnableWebMvc를 사용하여 Java 기반 구성을 사용하여 동일한 작업을 수행할 수 있습니다.

자세한 내용은 3.1 설명서를 참조하십시오.

http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/mvc.html#mvc-config

주석 기반은 주석이 달린 콩을 스캔해야 하며 XML 빈 구성에만 의존해서는 안 된다는 것을 스프링에 나타냅니다.구성요소 스캔은 해당 콩을 찾는 위치를 나타냅니다.

여기 가지 의사가 있습니다: http://static.springsource.org/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-config-enable

언급URL : https://stackoverflow.com/questions/13661985/spring-mvc-difference-between-contextcomponent-scan-and-annotation-driven

반응형