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查找模型(Controller、Handler);
3、 返回执行链,执行链包含了2部分内容,Handler对象以及拦截器(组);
4、 通过HandlerAdapter执行模型(Handler)
5、 适配器调用Handler对象处理业务逻辑;
6、 模型处理完业务逻辑,返回ModelAndView对象,view不是真正的视图对象,而是视图名称;
7、 将ModelAndView对象返回给前端控制器;
8、 前端控制器通过视图名称经过视图解析器查找视图对象;
9、 返回视图对象;
10、前端控制器渲染视图;
11、返回给前端控制器;
12、前端控制器将视图(html、json、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这两个的配置?
查看源码:
有点豁然开朗。