第23章 Spring MVC初体验
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初体验的更多相关文章
- spring mvc(2) spring mvc初体验
前面讲到随着前端技术的发展,web的开发已经实现了前后分离,并且spring mvc经过多个版本的更新,使用上也变得不一样,并且提供了很多便捷的功能.但是为了便于理解,我们使用比较原始的方式搭建spr ...
- Spring之初体验
Spring之初体验 Spring是一个轻量级的Java Web开发框架,以IoC(Inverse of Control 控制反转)和 ...
- spring cloud 初体验
spring cloud分为注册端.客户端以及消费端 初体验的理解就是: 注册端就是将之前所有的应用在这边进行注册,然后给每个应用都生成自己的标识,这些应用就是来自于客户端,消费端则通过调用注册端(有 ...
- 第07章-Spring MVC 的高级技术
Spring MVC 的高级技术 1. Spring MVC配置的替代方案 1.1 自定义DispatcherServlet配置 AbstractAnnotationConfigDispatcherS ...
- Spring(三) Spring IOC 初体验
Web IOC 容器初体验 我们还是从大家最熟悉的 DispatcherServlet 开始,我们最先想到的还是 DispatcherServlet 的 init() 方法.我们发现在 Dispath ...
- Spring企业级程序设计 • 【第5章 Spring MVC快速入门】
全部章节 >>>> 本章目录 5.1 Spring MVC设计概述及其框架结构 5.1.1 Spring MVC介绍 5.1.1 Spring MVC优势 5.1.2 S ...
- maven+spring mvc初尝试
只是一个可以运行的例子,俺们来看看. 目录结构: pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xml ...
- 第14 章 Spring MVC的工作机制与设计模式
14.1 Spring MVC的总体设计 要使用SPring MVC,只要在web.xml中配置一个DispatcherServlet. 再定义一个dispatcherServlet-servlet. ...
- 第十四章 Spring MVC的工作机制与设计模式(待续)
Spring MVC的总体设计 Control设计 Model设计 View设计 框架设计的思考 设计模式解析之模版模式
随机推荐
- Mybatis入门实例
MyBatis 简介 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis ...
- 学用纯CSS打造可折叠树状菜单
随着CSS3的发布,国外研究正如火如荼,但在国内还有很多人抱着IE不支持CSS3的想法,始终无动于衷不肯去学习.但是历史告诉我们,好的东西必将盛行,CSS3也终将也会替代CSS2,下面就和大家分享一个 ...
- C# 程序运行进度显示Lable
public void test() { Thread.Sleep(); string vvv = ""; ; i < ;i++ ) { vvv = vvv +i.ToStr ...
- nodeJs express mongodb 建站(mac 版)
基本环境 homebrew.node.npm.express.mongodb 1.node .npm : (1)辅助工具:homebrew安装(mac下一个软件管理工具,相当于Red hat的yum, ...
- express 对数据库数据增删改查
接着 http://www.cnblogs.com/cynthia-wuqian/p/6560548.html (1)概念 Schema(属性) :一种以文件形式存储的数 据库模型骨架,不具备数据库的 ...
- Android项目实战(四十七):轮播图效果Viewpager
简易.常用的轮播图效果ViewPager ,老技术了,记一笔留着以后ctrl C + ctrl V 需求如下: 不定张个数的ImagView轮播,右下角显示轮播点图标,每隔固定时间切换下一张,最 ...
- 快速开发跨平台应用之Xamarin技术
Xamarin 介绍 Xamarin 是一个允许开发人员有效创建可跨 iOS.Android.Windows 应用程序的开发工具集.Xamarin是免费且开源的,遵循 MIT (麻省理工学院许可证)协 ...
- 算法:输入一个链表,输出该链表中倒数第k个结点。
算法:输入一个链表,输出该链表中倒数第k个结点.<剑指offer> 思路加到注释里面了: 1:两个if判断是否返回值为空,首个为空,没有第k个值: 2:for循环找到倒数第k个值,返回为a ...
- javascript:面向对象和常见内置对象及操作
本文内容: 面向对象 常见内置对象及操作 首发日期:2018-05-11 面向对象: JavaScript 是面向对象的编程语言 (OOP).OOP 语言使我们有能力定义自己的对象和变量类型. 对象是 ...
- spring静态代理和动态代理
本节要点: Java静态代理 Jdk动态代理 1 面向对象设计思想遇到的问题 在传统OOP编程里以对象为核心,并通过对象之间的协作来形成一个完整的软件功能,由于对象可以继承,因此我们可以把具有相同功能 ...