springMVC注解驱动

今天又详细学习一下springMVC

springMVC简介

大部分java应用都是web应用,展现层是web应用最为重要的部分。Spring为展现层提供了一个优秀的web框架——Spring MVC。和众多其他web框架一样,它基于MVC的设计理念,此外,它采用了松散耦合可插拔组件结构,比其他MVC框架更具扩展性和灵活性。

SpringMVC通过一套MVC注解,让POJO成为处理请求的控制器,无需实现任何接口,同时,SpringMVC还支持REST风格的URL请求。

此外,SpringMVC在数据绑定、视图解析、本地化处理及静态资源处理上都有许多不俗的表现。

它在框架设计、扩展性、灵活性等方面全面超越了Struts、WebWork等MVC框架,从原来的追赶者一跃成为MVC的领跑者。

SpringMVC框架围绕DispatcherServlet这个核心展开,DispatcherServlet是SpringMVC框架的总导演、总策划,它负责截获请求并将其分派给相应的处理器处理。

springMVC的整体架构

如图所示:

1、 用户发起请求到前端控制器(DispatcherServlet),前端控制器没有能力处理业务逻辑;

2、 通过HandlerMapping查找模型(ControllerHandler

3、 返回执行链,执行链包含了2部分内容,Handler对象以及拦截器(组);

4、 通过HandlerAdapter执行模型(Handler

5、 适配器调用Handler对象处理业务逻辑;

6、 模型处理完业务逻辑,返回ModelAndView对象,view不是真正的视图对象,而是视图名称;

7、 将ModelAndView对象返回给前端控制器;

8、 前端控制器通过视图名称经过视图解析器查找视图对象;

9、 返回视图对象;

10、前端控制器渲染视图;

11、返回给前端控制器;

12、前端控制器将视图(htmljson、xml、Excel返回给用户;

本文重点

这里主要想说的是mvc的注解驱动

web.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    id="MyWebApp" version="2.5">
    <display-name>springmvc</display-name>

    <!-- springmvc 入口 -->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 启动顺序 -->
        <load-on-startup>1</load-on-startup>
        <!-- 默认查找配置文件规则  /WEB-INF/servletName-servlet.xml -->
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <!-- 所有请求以*.do会进入MVC框架 -->
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>


    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>

</web-app>

下面是springmvc的配置文件

<?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"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <!-- 注册HandlerMapping -->
    <!-- <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/> -->
    
    <!-- 注册简单适配器 -->
    <!-- <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/> -->
    
    <!-- 推荐使用的注解的HandlerMapping -->
    <!-- <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/> -->
    
    <!-- 推荐使用的注解适配器 -->
    <!-- <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/> -->

    <!-- mvc的注解驱动 -->
    <mvc:annotation-driven/>
    <!-- 扫描包,使@Controller生效 -->
    <context:component-scan base-package="cn.vincce.springmvc.controller"/>
    
    <!-- 自定义Handler -->
    <!-- <bean name="/hello.do" class="cn.vincce.springmvc.controller.HelloController"/> -->
    
    <!-- prefix="/WEB-INF/jsp/", suffix=".jsp", viewname="test" -> "/WEB-INF/jsp/test.jsp"  -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 前缀 -->
        <property name="prefix" value="/WEB-INF/views/"/>
        <!-- 后缀 -->
        <property name="suffix" value=".jsp"/>
    </bean>

</beans>

根据上面springmvc的整体架构,做上面的相关配置,这一块儿的配置根据源码

   <!-- 推荐使用的注解的HandlerMapping -->
    <!-- <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/> -->
    
    <!-- 推荐使用的注解适配器 -->
    <!-- <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/> -->

可以用

<!-- mvc的注解驱动 -->

<mvc:annotation-driven/>

代替,项目启动时打印的日志信息:红色标记

2016-01-12 16:57:09,250 [localhost-startStop-1] [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping]-[DEBUG] Looking for request mappings in application context: WebApplicationContext for namespace 'springmvc-servlet': startup date [Tue Jan 12 16:57:08 CST 2016]; root of context hierarchy
2016-01-12 16:57:09,277 [localhost-startStop-1] [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping]-[INFO] Mapped "{[/test/mv],methods=[],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public org.springframework.web.servlet.ModelAndView com.vincce.study.controller.TestController.page()

为什么mvc的注解驱动可以替代HandleMapping和HandleAdapter这两个的配置?

查看源码:

有点豁然开朗。

posted @ 2016-01-12 17:10  heyLuer  阅读(11460)  评论(1编辑  收藏  举报