Spring MVC介绍
本小记学习目标
1.Spring MVC相关工作原理理解
2.入门Spring MVC应用开发
说到Spring MVC必须先简单地说一下MVC的概念
MVC的思想是把一个应用分成三个基本部分,M(Model)模型、V(View)视图、C(Controller)控制器,使这三个基本部分以最低的耦合进行协同工作,从而提高应用的可扩展性和可维护性。
Spring MVC它是一个框架,它应用了MVC的思想,它就是Spring提供的一个实现了Web MVC设计模式的轻量级Web框架
一、Spring MVC相关工作原理理解
在说Spring MVC工作原理之前我们先说说MVC模式。
1.MVC的概念
它就是Model,View,Controller的三个首字母缩写,分别代表了Web应用中的3种基本职责划分。
Model:模型,用来存储数据,处理用户请求的业务逻辑
View:视图,向控制器提交数据,显示模型中的数据
Controller:控制器,连接视图与模型,视图有请求来了后,判断把这个请求交由哪个模型来处理,模型处理完成后的结果由它判断交由哪个视图来做显示
2.基于Servlet的MVC模式
基于Servlet的MVC模式是Web开发过程中常用的模式,它具体的内容如下
Model:模型,一个或多个JavaBean对象,它分为实体模型(JavaBean类创建)和业务模型(一般的Java类创建)
View:视图,一个或多个JSP页面,它主要是向控制器提交数据和为模型提供数据的显示
Controller:控制器,一个或多个Servlet对象,根据视图提交的请求进行判断,把请求转发给处理业务逻辑的JavaBean,并把处理结果存放在实体JavaBean模型中输出给到视图展示
基于Servlet的MVC模式的流程如下图所示

3.Spring MVC工作原理
Spring MVC是一个MVC的应用框架,它主要由DispatcherServlet、处理映射器、控制器、视图解析器、视图组成
Spring MVC的工作流程主要如下
-
客户端(浏览器)的请求提交到DispatcherServlet
-
由DispatcherServlet寻找一个或多个HandlerMapping,找到处理请求的Controller
-
DispatcherServlet把请求提交到Controller
-
Controller调用业务逻辑处理后返回ModelAndView
-
DispatcherServlet寻找一个或多个ViewResolver视图解析器,找到ModelAndView指定的视图
-
视图把结果显示到客户端
Spring MVC工作原理图

上图中蓝色标识的四个块为Spring MVC接口,它们分别是
DispatcherServlet
HandlerMapping
Controller
ViewResolver
DispatcherServlet:所有的请求由它来统一分发,在它把请求分发给到Controller前需要借助于HandlerMapping定位到具体的Controller
HandlerMapping:负责完成客户请求到Controller映射
Controller:处理用户请求,当它处理完用户请求后会返回ModelAndView对象给到DispatcherServlet前端控制器,这里的ModelAndView从名称可以看得出来它包含了Model和View
ViewResolver:它是一个视图解析器,它负责找到View对象,从而把相应的结果渲染给客户
注意:这里重点的说明一下,DispatcherServlet是一个前端控制器,它是整个Web应用程序的控制器,而Controller则是单个请求处理过程中的控制器
二、入门Spring MVC应用开发
Spring入门程序的配置及部署
新增一个Maven的 war工程,在pom中新增如下jar包的依赖
<
dependencies
>
<!-- context -->
<
dependency
>
<
groupId
>org.springframework
</
groupId
>
<
artifactId
>spring-context
</
artifactId
>
<
version
>5.0.2.RELEASE
</
version
>
</
dependency
>
<!-- Spring MVC -->
<
dependency
>
<
groupId
>org.springframework
</
groupId
>
<
artifactId
>spring-
webmvc
</
artifactId
>
<
version
>5.0.2.RELEASE
</
version
>
</
dependency
>
<!-- Spring web -->
<
dependency
>
<
groupId
>org.springframework
</
groupId
>
<
artifactId
>spring-web
</
artifactId
>
<
version
>5.0.2.RELEASE
</
version
>
</
dependency
>
<!-- commons-logging -->
<
dependency
>
<
groupId
>commons-logging
</
groupId
>
<
artifactId
>commons-logging
</
artifactId
>
<
version
>1.2
</
version
>
</
dependency
>
<!-- spring-
aop
-->
<
dependency
>
<
groupId
>org.springframework
</
groupId
>
<
artifactId
>spring-
aop
</
artifactId
>
<
version
>5.0.2.RELEASE
</
version
>
</
dependency
>
</
dependencies
>
注意:在新增war工程后在Eclipse中对应的项目上会有一个红色的小叉,这个是由于动态web工程相关的目录结构未正常创建出来,处理方法如下
在工程名上右键--->properties
选择Project Facets
去掉Dynamic Web Module选项,点击Apply
再勾选上上面去掉的这个选项,点击Apply and Close
配置动态web工程的web.xml,这里主要是配置DispatcherServlet
配置DispatcherServlet的快捷方式,可以按Alt+/选择倒数第二项(Dispatcherservetl - DispatcherServlet declaration)
<!-- DispatcherServlet配置 -->
<
servlet
>
<
servlet-name
>
springmvc
</
servlet-name
>
<
servlet-class
>org.springframework.web.servlet.DispatcherServlet
</
servlet-class
>
<!-- 加载spring
mvc
的配置文件 -->
<
init-param
>
<
param-name
>contextConfigLocation
</
param-name
>
<!-- 配置SpringMVC配置文件的路径 -->
<
param-value
>classpath:springmvc.xml
</
param-value
>
</
init-param
>
<!--
tomcat
容器在启动时加载
servlet
-->
<
load-on-startup
>1
</
load-on-startup
>
</
servlet
>
<
servlet-mapping
>
<
servlet-name
>
springmvc
</
servlet-name
>
<!--
servlet
处理请求地址,这里/表示所有
url
-->
<
url-pattern
>/
</
url-pattern
>
</
servlet-mapping
>
在src/main/resources下新增springmvc.xml,也就是上面配置中要加载的springMVC的配置文件
注意上面init-param中的配置写法,classpath:springmvc.xml,表示在类路径下查找springmvc.xml
在WebContent目录下新增jsp页面:index.jsp
<%@
page
language=
"java"
contentType=
"text/html; charset=UTF-8"
pageEncoding=
"UTF-8"
%>
<!
DOCTYPE
html
PUBLIC
"-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd"
>
<
html
>
<
head
>
<
meta
http-equiv=
"Content-Type"
content=
"text/html; charset=UTF-8"
>
<
title
>Insert title here
</
title
>
</
head
>
<
body
>
未注册用户,请
<
a
href=
"${pageContext.request.contextPath }
/register"
>注册
</
a
>!
<
br
/>
已注册用户,请
<
a
href=
"${pageContext.request.contextPath }
/login"
>登录
</
a
>!
</
body
>
</
html
>
注意:在新增完jsp页面后可能会出现一个红叉,这个是由于没有引入web容器的运行环境
处理方式如下
右键点击项目--->Build Path--->Configure Build Path...
选择Add Library...
选择Server Runtime,点击Next
选择相应的Tomcat运行环境即可
新增controller类com.xiaoxie.controller.RegisterController、com.xiaoxie.controller.LoginController
package com.xiaoxie.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
public
class RegisterController
implements Controller{
@Override
public ModelAndView handleRequest(HttpServletRequest
arg0, HttpServletResponse
arg1)
throws Exception {
return
new ModelAndView(
"/WEB-INF/jsp/register.jsp");
}
}
package com.xiaoxie.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
public
class LoginController
implements Controller{
@Override
public ModelAndView handleRequest(HttpServletRequest
arg0, HttpServletResponse
arg1)
throws Exception {
return
new ModelAndView(
"/WEB-INF/jsp/login.jsp");
}
}
新增上面指定要跳转到的视图jsp文件register.jsp、login.jsp,它们创建在WebContent/WEB-INF/jsp下
register.jsp
<%@
page
language=
"java"
contentType=
"text/html; charset=UTF-8"
pageEncoding=
"UTF-8"
%>
<!
DOCTYPE
html
PUBLIC
"-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd"
>
<
html
>
<
head
>
<
meta
http-equiv=
"Content-Type"
content=
"text/html; charset=UTF-8"
>
<
title
>Insert title here
</
title
>
</
head
>
<
body
>
注册页面!
</
body
>
</
html
>
login.jsp
<%@
page
language=
"java"
contentType=
"text/html; charset=UTF-8"
pageEncoding=
"UTF-8"
%>
<!
DOCTYPE
html
PUBLIC
"-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd"
>
<
html
>
<
head
>
<
meta
http-equiv=
"Content-Type"
content=
"text/html; charset=UTF-8"
>
<
title
>Insert title here
</
title
>
</
head
>
<
body
>
恭喜您,登录成功!
</
body>
</
html
>
配置springmvc.xml这个配置文件
它的配置主要是把Controller类映射到哪个url请求
<?
xml
version=
"1.0"
encoding=
"UTF-8"
?>
xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"
>
<!-- 把LoginController映射到 /login -->
<
bean
name=
"/login"
class=
"com.xiaoxie.controller.LoginController"
/>
<!-- 把RegisterController映射到 /register -->
<
bean
name=
"/register"
class=
"com.xiaoxie.controller.RegisterController"
/>
</
beans
>
运行项目
在项目名上右键--->Run As--->Run on Server
直接下一步,完成即可,Tomcat启动后会打开浏览器访问应用的主页面index.jsp

点击“注册”请求/register,跳转到register.jsp

点击“登录”,请求/login,跳转到login.jsp

在上面我们的应用中Controller中跳转的视图需要写全,这个比较麻烦,我们可以使用视图解析器来把公用的部分做为配置配置好,那么到时候则只需要在Controller中写变化的部分,SpringMVC会自动帮忙去拼接
在springmvc.xml配置文件中添加视图解析器
<!-- 配置视图解析器 -->
<
bean
class=
"org.springframework.web.servlet.view.InternalResourceViewResolver"
id=
"viewResolver"
>
<!-- 拼接前缀 -->
<
property
name=
"
prefix"
value=
"/WEB-INF/jsp/"
/>
<!-- 拼接后缀 -->
<
property
name=
"
suffix"
value=
".jsp"
/>
</
bean
>
这个时候我们Controller中返回的视图只需要写上变化的部分如下
在LoginController中返回的只需要写上login就可以了
return
new ModelAndView(
"login"); 它会根据视图解析器拼接为“/WEB-INF/jsp/login.jsp”
在RegisterController中返回的只需要写上register就可以
return
new ModelAndView(
"register"); 它会根据视图解析器拼接为“/WEB-INF/jsp/register.jsp”