23.1 鸟瞰Spring MVC

  粗略的介绍了SpringMVC的主要组成部分,SpringMVC作为一个Web层的框架,最大的作用是把我从繁重的web.xml文件编写中解救出来,再也不要不停的添加Servlet和Servlet-mapping了。

  通过引入Front Controller和Page Controller的概念,把映射的编写从单一的wen.xml中分离出来。具体来说,DispatcherServlet作为Front Controller是所有应用的大总管,所有的请求都要由DispatcherServlet来先处理,所谓的处理即选择一个合适的Controller来具体的处理请求,Controller就是Page Controller的角色,这个选择是根据HandlerMapping来决定的。最终Controller会返回一个ModelAndView对象,该对象里封装了需要生产一个View的所有必要的信息,DispatcherServlet拿着MondelAndView对象传给ViewResolver去生产View对象。

  时序图如下。

  

23.2 实践出真知

  具体的介绍了如何实现上述的控制流程,即如何写配置文件,如何继承接口,如何继承类等等。

  用SpringMVC写的Web程序也要遵循Servlet规范,也要遵循基本的web工程的文件夹结构,更得有一个web,xml。

  大体的结构如上图所示,在WEB-INF下面有三个xml文件,首先是老朋友web.xml。如果让我设计,我会在这里放什么呢?我设计的哲学是只在web.xml里放最主要的servlet即DispatcherServlel,后续的乱七八糟的都交给他,那么肯定这个servlet和servlet-mapping的编写是逃不掉的。一个框架只有这点东西不行,SSM,还要和后面的Spring结合,所以我tomcat服务器启动的时候也要加载Spring的容器,相关的Bean如DAO、Service都定义在这个Spring容器里,所以web.xml文件里还得有办法启动Spring容器。

  先从启动Spring容器看起,启动Spring容器就得有一个Spring的配置文件,这个配置文件就是上面三个xml文件中的applicationContext.xml,前面学的IOC、AOP乱七八糟的都可以在这里用起来。怎么启动呢?我想在Tomcat服务器启动的是就加载这个Spring容器,而且还得让Tomcat所有的请求都能共享这个容器。在Tomcat启动是时候,会调用实现了ServletContextListener接口类的contextInitialized方法,所以Spring提供一个类实现了该接口,并把加载Spring容器的逻辑封装在contextInitialized方法里,这个类就是ContextLoaderListener。所以Toncat加载Spring容器就是利用监听器机制实现的。并且在Spring容器启动后也会和ServletContext绑定到一起实现了全局请求的共享。

  ContextLoaderListener加载Spring容器时,在没有特殊配置的时候回加载一个默认位置的默认名称的配置文件:WEB-INF/applicationContext.xml,这是一个和web.xml同位置的文件,有的时候需要把Spring配置文件分开配置并且放到别的位置,就需要特殊的配置,如下。在param-value里用空格隔开多个配置文件,可是实现配置文件分层。

   <context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:smart-context.xml</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>

  下面的配置是关于DispatcherServlet,这个是SpringMVC里最重要的一个Servlet。就像下面那样配置,平平无常,和普通的Servlet一样。

    <servlet>
<servlet-name>smart</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>3</load-on-startup>
</servlet> <servlet-mapping>
<servlet-name>smart</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>

  但其实这个Servlet也需要一个配置文件,这个配置文件的默认名称是<servlet-name>加上servlet.xml,在这个例子里就是smart-servlet.xml,其默认位置也是在WEB-INF下。在smart-xml里需要配置HandlerMapping、controller、ViewResovler等等,这就是我们学习SpringMVC的主要内容。同样的,也可以改变DispatcherServlet配置文件的默认位置和名称,如下。

    <servlet>
<servlet-name>smart</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:smart-servlet.xml</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet> <servlet-mapping>
<servlet-name>smart</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>

  

  

第23章 Spring MVC初体验的更多相关文章

  1. spring mvc(2) spring mvc初体验

    前面讲到随着前端技术的发展,web的开发已经实现了前后分离,并且spring mvc经过多个版本的更新,使用上也变得不一样,并且提供了很多便捷的功能.但是为了便于理解,我们使用比较原始的方式搭建spr ...

  2. Spring之初体验

                                     Spring之初体验 Spring是一个轻量级的Java Web开发框架,以IoC(Inverse of Control 控制反转)和 ...

  3. spring cloud 初体验

    spring cloud分为注册端.客户端以及消费端 初体验的理解就是: 注册端就是将之前所有的应用在这边进行注册,然后给每个应用都生成自己的标识,这些应用就是来自于客户端,消费端则通过调用注册端(有 ...

  4. 第07章-Spring MVC 的高级技术

    Spring MVC 的高级技术 1. Spring MVC配置的替代方案 1.1 自定义DispatcherServlet配置 AbstractAnnotationConfigDispatcherS ...

  5. Spring(三) Spring IOC 初体验

    Web IOC 容器初体验 我们还是从大家最熟悉的 DispatcherServlet 开始,我们最先想到的还是 DispatcherServlet 的 init() 方法.我们发现在 Dispath ...

  6. Spring企业级程序设计 • 【第5章 Spring MVC快速入门】

    全部章节   >>>> 本章目录 5.1 Spring MVC设计概述及其框架结构 5.1.1 Spring MVC介绍 5.1.1 Spring MVC优势 5.1.2  S ...

  7. maven+spring mvc初尝试

    只是一个可以运行的例子,俺们来看看. 目录结构: pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xml ...

  8. 第14 章 Spring MVC的工作机制与设计模式

    14.1 Spring MVC的总体设计 要使用SPring MVC,只要在web.xml中配置一个DispatcherServlet. 再定义一个dispatcherServlet-servlet. ...

  9. 第十四章 Spring MVC的工作机制与设计模式(待续)

    Spring MVC的总体设计 Control设计 Model设计 View设计 框架设计的思考 设计模式解析之模版模式

随机推荐

  1. JavaScript如何工作:内存管理+如何处理4个常见的内存泄漏

    摘要: 作者将自己常用的JavaScript模块分享给大家. 原文:JavaScript如何工作:内存管理+如何处理4个常见的内存泄漏 作者:前端小智 Fundebug经授权转载,版权归原作者所有. ...

  2. Java中static与final

    修饰变量:static:静态变量,是属于这个类的final :常量,只能赋值一次static final:静态常量,必须立即初始化(同时具有static.final的特点) 修饰方法:static:静 ...

  3. angular $watch 一个变量的变化

    $scope.$watch('custArea', function(newValue, oldValue) { angular.forEach(newValue, function(item, ke ...

  4. CSS3 - 盒子的 box - size

    两个参数: border-box和content-box <!DOCTYPE html> <html lang="en"> <head> < ...

  5. HTML琐碎知识点(持续补充)

    一.table标签 <table> <thead> <tr> <th>111</th> </tr> </thead> ...

  6. DEM山体阴影原理以及算法具体解释

    山体阴影原理以及算法具体解释 山体阴影基本原理: 山体阴影是假想一个光源在某个方向和某个太阳高度的模拟下.用过临近像元的计算来生成一副0-255的灰度图. 一.山体阴影的主要參数: 1.  太阳光线的 ...

  7. 简单易用的堡垒机系统—Teleport

    简单易用的堡垒机系统-Teleport 官方文档:http://teleport.eomsoft.net/doc#!1  一.Teleport介绍 Teleport是触维软件推出的一款简单易用的堡垒机 ...

  8. 微信小程序开发之初探

    本文是以一个简单的小例子,来简要讲解微信小程序开发步骤,希望促进学习分享. 概念 微信小程序,简称小程序,缩写xcx,英文mini program.是一种不需要下载安装即可使用的应用,它实现了应用“触 ...

  9. spring-AOP(面向切面编程)-xml方式配置

    AOP是针对面向对象编程的一种补充,有时使用面向对象不能很好完成一些额外的功能业务时,可以采用AOP来进行补充. AOP术语: 切面(Aspect) 切面是用于编写切面逻辑的一个类,这个类很类似于JD ...

  10. ASP.NET MVC 扩展方法

    一.扩展方法的语法        在视图中使用扩展方法的时候 如果扩展方法定义的类在其他命名空间,需要首先引用该命名空间,才能使用该扩展方法        static class 静态类名      ...