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)返回给用户;
本文重点:
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配置文件
<?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这两个的配置?
查看springmvc源码:
看完源码我们就不难知道为什么去接驱动可以代替HandleMapping和HandleAdapter这两个bean了