第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设计 框架设计的思考 设计模式解析之模版模式
随机推荐
- node实现简单的群体聊天工具
一.使用的node模块 1.express当做服务器 2.socket.io 前后通信的桥梁 3.opn默认打开浏览器的模块(本质上用不到) 难点:前后通信 源码地址:https://github.c ...
- Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/fs/CanUnbuffer
在执行spark on hive 的时候在 sql.show()处报错 : Exception in thread "main" java.lang.NoClassDefFoun ...
- nginx部署与安装
1.在学习ngnix的时候,免不了需要进行安装,安装其实很简单,一个shell脚本就可以搞定可以参考如下 使用root用户执行nginx-install.sh脚本即可,脚本如下: #!/bin/bas ...
- Git学习(一)
版本控制系统是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统.版本控制系统不仅可以应用于软件源代码的文本文件,而且可以对任何类型的文件进行版本控制. 一.集中式版本控制系统 v.s ...
- linux学习笔记-wget相关知识
我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! wget是非交互式的网络文件下载工具,这里参考帮助文档,记录下实用参数和使用方法. 一.wget的实用参数: wget: 用法: ...
- jQuery效果之雪花飘落
实现思路 1.在一定的频率下在页面中生成一定数目的雪花从上往下飘落: 2.在指定的时间内飘落后移除页面: 3.可设置雪花的大小,在一定范围内随机雪花大小: 4.什么时间后清除生成雪花,停止函数. js ...
- 详解Vue.js 技术
本文主要从8个章节详解vue技术揭秘,小编觉得挺有用的,分享给大家. 为了把 Vue.js 的源码讲明白,课程设计成由浅入深,分为核心.编译.扩展.生态四个方面去讲,并拆成了八个章节,如下: 准备工作 ...
- iphone手机投屏在哪里 手机无线投屏电脑
Iphone是我们经常使用的一款手机,有时候经常需要将一些文件图片信息等投屏到电脑,那么iphone手机投屏在哪里?可以无线投屏到电脑吗?其实很简单,下面就分享下苹果手机投屏的具体方法给大家,希望对大 ...
- docker swarm 集群进入某节点容器失败的原因及解决方法
今日在自己的docker swarm 测试环境中,想进入某个节点的容器去查看下,结果进入容器失败,并且报了如下错误信息: [root@worker1 ~]# docker exec -it 9a6f6 ...
- Android 打包混淆
将项目改成Module //项目build.gradle的applicationId注释掉 修改apply plugin: 'com.android.library' 打包混淆脚本 //在项目的bui ...