Spring MVC为什么这个Hello World程序可以在没有`annotation-driven`标签的情况下正常运行(与其他Spring项目不同)?

10 浏览
0 Comments

Spring MVC为什么这个Hello World程序可以在没有`annotation-driven`标签的情况下正常运行(与其他Spring项目不同)?

我已经开始学习Spring MVC,并阅读了这篇教程:http://viralpatel.net/blogs/spring-3-mvc-create-hello-world-application-spring-3-mvc/

在这个例子中,我有一个web.xml文件来配置我的Web应用:



Spring3MVC

    index.jsp


    spring
    
        org.springframework.web.servlet.DispatcherServlet
    
    1


    spring
    *.html

还有spring-servlet.xml文件用于配置我的DispatcherServlet:





    
    
    

正如你在之前的链接中看到的,我只有一个控制器类来处理指向“/hello”URL的HTTP请求... 好的...这对我很清楚...

在这个例子之后,我使用STS / Eclipse中的相关模板项目创建了一个新的Spring MVC项目。

这个例子非常非常类似于之前的例子:我仍然有web.xml文件来配置我的Web应用程序,一个用于配置DispatcherServlet的文件,以及一个处理HTTP请求的控制器类。

但是有一些我无法理解的差异。

这是我的web.xml配置文件:





    contextConfigLocation
    /WEB-INF/spring/root-context.xml



    org.springframework.web.context.ContextLoaderListener



    appServlet
    org.springframework.web.servlet.DispatcherServlet
    
        contextConfigLocation
        /WEB-INF/spring/appServlet/servlet-context.xml
    
    1


    appServlet
    /

而这是servlet-context.xml文件(配置我的DispatcherServlet的配置文件):











    
    

正如你所看到的,这两个例子的配置文件中有一些不同之处:

在由STS / Eclipse创建的项目中,在servlet-context.xml文件中,我有一些在我发布的第一个例子中不存在的配置:



好的...我已经阅读了很多关于这个配置标签的文档:它意味着你可以定义Spring Bean的依赖关系,而无需在xml中指定一堆元素,也不需要实现接口或扩展基类。当Spring启动时,它会读取其xml配置文件,并查找是否有被@ Controller标记的Foo类,它知道这个类是一个控制器,并将其作为控制器处理。默认情况下,Spring假设所有应该由它管理的类都在beans.xml文件中明确定义。然后,有一个组件扫描标签,告诉Spring它应该在com.mycompany.maventestweapp下的类路径中搜索所有的类,并检查每个类是否有@ Controller,@ Repository,@ Service或@ Component,如果有,则Spring将像在xml配置文件中输入一样将该类注册到bean工厂。BLABLABLA ETCETCETC BLABLA

好的,这对我来说绝对清楚!我认为我没有问题地理解为什么在我的第二个例子的DispatcherServlet配置文件中有annotation-driven标签,这是清楚的。

问题是理解为什么在我的第一个例子的DispatcherServlet配置文件中没有这个标签,但它仍然工作正常。如果我尝试从servlet-context.xml文件(在我的第二个例子中)中删除此标签,它就无法运行并报错说:HTTP状态404-,并且在堆栈跟踪中我有:WARN:org.springframework.web.servlet.PageNotFound - 在名称为'appServlet'的DispatcherServlet中找不到与URI [/maventestwebapp /] 相对应的映射

我认为这是合理的行为,因为Spring没有启用注释支持,所以没有注册我的控制器类(使用annotation-driven并在我的控制器类上添加@Controller就像我在bean.xml文件中显式定义了这个类一样),所以无法使用该bean的方法来处理HTTP请求...好的...这听起来很好...

但是为什么在第一个例子中没有annotation-driven标签时,它仍然可以工作呢?

我没有annotation-driven标签(因此我没有启用使用注释来声明哪个类是Spring bean,比如控制器),也没有在beans.xml文件中显式声明此类...所以不应该像第二个例子那样工作当我删除了annotation-driven标签时...但它却可以工作 :-/

我正在为理解为什么而疯狂...

请问,你能帮助我吗?

非常感谢

安德烈亚

0
0 Comments

Spring MVC为什么这个Hello World程序可以不使用<mvc:annotation-driven>标签而正常运行(不像其他Spring项目一样需要该标签)?问题的出现原因是Spring MVC中的<mvc:annotation-driven>标签提供了附加的服务,包括注册默认的处理器映射、消息转换、JSR 303验证、转换服务等。但是对于简单的控制器而言,不需要这个标签也可以正常工作,只要有适当的映射即可。但是如果想要实现一些更高级的功能,比如JSR 303验证、实现JSON的REST服务、注册转换服务等,这个标签就非常有用,因为它将这些服务的配置集中在一个地方。所以在Spring模板项目中包含了这个标签,模板项目更多是作为Spring应用程序的起点,而不仅仅是Spring学习者的示例。另外需要注意的是,Spring 3.1中处理器映射的配置发生了变化。解决方法是可以在servlet-context.xml文件中显式地添加所需的bean。

0