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. Angular6 组件树结构优化

    本片博客主要是记录实际项目开发中使用Angular6框架,遇到的一个问题. 现象: Angular6框架写的前端web网页,在实际部署运行过程中遇到了一种现象,引入懒加载以后,加载登录面速度很快,但是 ...

  2. 洛谷P4302 [SCOI2003]字符串折叠(区间dp)

    题意 题目链接 Sol 裸的区间dp. 转移的时候枚举一下断点.然后判断一下区间内的字符串是否循环即可 `cpp #include<bits/stdc++.h> #define Pair ...

  3. 【代码笔记】Web-Javascript-Javascript typeof

    一,效果图. 二,代码. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...

  4. 如何用ABP框架快速完成项目(13) - 用ABP遇到难题项目受阻时如何避免项目延迟

    只有一个人在开发ABP, 遇到难题时可以: 最根本的, 简化问题, 不要盖楼式结构 前端优先用VSCode看文档, 后端看官网文档. 看ABP源码/issues 到QQ群和微信群里寻求外援.   我建 ...

  5. ORACLE中内部函数SYS_OP_C2C和隐式类型转换

    什么是SYS_OP_C2C呢?官方的介绍如下: SYS_OP_C2C is an internal function which does an implicit conversion of varc ...

  6. SQL Server的优化器会缓存标量子查询结果集吗

    在这篇博客"ORACLE当中自定义函数性优化浅析"中,我们介绍了通过标量子查询缓存来优化函数性能: 标量子查询缓存(scalar subquery caching)会通过缓存结果减 ...

  7. 反射生成 INSERT 多个对象的 SQL 语句(批量插入)

    + View code private static void insertObject(List<?> objectList) throws IllegalAccessException ...

  8. c/c++ 链栈

    c/c++ 链栈 链栈 下面的代码实现了以下功能 函数 功能描述 push 压入 pop 弹出 show_list 打印 clear 释放所有内存空间 destroy 释放所有内存空间 nodesta ...

  9. logstash配置

    input { #You must define a [type], otherwise you cannot get a field to cut. tcp { port => 5045 ty ...

  10. 关于.NET字符串驻留的问题

    默认情况下,CLR会把字符串常量保存在字符串池中..NET 2.0引入了CompilationRelaxations.NoStringInterning枚举成员.这个枚举CompilationRela ...