target
掌握MVC设计模式
了解SpringMVC是什么?优势有哪些
了解SpringMVC主要组件
掌握SpringMVC执行流程
掌握SpringMVC项目的编写
Spring MVC 是 Spring 提供给 Web 应用的框架设计。Spring MVC 是一个典型的教科书式的 mvc 构架,不像 Struts 等都是变种或者不是完全基于 mvc 系统的框架。
Spring MVC 角色划分清晰,分工明细,并且和 Spring 框架无缝结合。作为当今业界最主流的 Web 开发框架,Spring MVC 已经成为当前最热门的开发技能,同时也广泛用于桌面开发领域。
1. MVC设计模式简介
MVC 设计不仅限于 Java Web 应用,还包括许多应用,比如前端、PHP、.NET 等语言。之所以那么做的根本原因在于解耦各个模块。
MVC 是 Model、View 和 Controller 的缩写,分别代表 Web 应用程序中的 3 种职责。
模型:用于存储数据以及处理用户请求的业务逻辑。
视图:向控制器提交数据,显示模型中的数据。
控制器:根据视图提出的请求判断将请求和数据交给哪个模型处理,将处理后的有关结果交给哪个视图更新显示。
基于 Servlet 的 MVC 模式的具体实现如下:
模型:一个或多个 JavaBean 对象,用于存储数据(实体模型,由 JavaBean 类创建)和处理业务逻辑(业务模型,由一般的 Java 类创建)。
视图:一个或多个 JSP页面,向控制器提交数据和为模型提供数据显示,JSP 页面主要使用 HTML 标记和 JavaBean 标记来显示数据。
控制器:一个或多个 Servlet 对象,根据视图提交的请求进行控制,即将请求转发给处理业务逻辑的 JavaBean,并将处理结果存放到实体模型 JavaBean 中,输出给视图显示。
基于 Servlet 的 MVC 模式的流程如图所示:
Spring MVC 框架是高度可配置的,包含多种视图技术,例如 JSP 技术、Velocity、Tiles、iText 和 POI。
Spring MVC 框架并不关心使用的视图技术,也不会强迫开发者只使用 JSP 技术。
2. SpringMVC是什么
一种轻量级的、基于 MVC 的 Web 层应用框架。偏前端而不是基于业务逻辑层。Spring 框架的一个后续产品。
-
Spring 为展现层提供的基于 MVC 设计理念的优秀的 Web 框架,是目前最主流的 MVC 框架之一
注意MVC是设计理念,不是设计模式。
-
Spring 框架结构图(新版本):
3. SpringMVC的优势
天生与 Spring 框架集成,如:(IOC,AOP)
支持 Restful ⻛格
进行更简洁的 Web 层开发
支持灵活的 URL 到⻚面控制器的映射
-
非常容易与其他视图技术集成,如:Velocity、FreeMarker 等等
为什么现在 的页面都是HTML,而不是jsp?
因为jsp是页面包含HTML和Java代码,需要先编译解析完Java代码后,才会交给浏览器处理HTML页面,加载速度慢。
模型数据不存放在特定的 API 里,而是放在一个 Model 里(Map 数据结构实现,因此很容易被其他框架使用)
非常灵活的数据验证、格式化和数据绑定机制、能使用任何对象进行数据绑定,不必实现特定框架的 API
更加简单、强大的异常处理
对静态资源的支持
支持灵活的本地化、主题等解析
4. SpringMVC的主要组件
SpringMVC是将Web层进行了职责解耦, 常用主要组件有:
DispatcherServlet
:前端控制器Controller
:处理器/⻚面控制器,做的是 MVC 中的 C 的事情,控制逻辑转移到前端控制器,用于对请求进行处理HandlerMapping
:处理器映射器,负责找到能够处理该请求的控制器View Resolver
: 视图解析器,负责查找 View 对象,从而将相应结果渲染给客户。LocalResolver
:处理本地化、国际化资源MultipartResolver
:文件上传解析器,处理文件上传HandlerExceptionResolver
:异常处理器,对异常进行处理
5. 流程分析
SpringMVC的流程如下:
浏览器发起请求(比如是:/hello请求),首先会被
DispatcherServlet
拦截。拦截后,交给
Handler Mapping
(处理器映射器),处理器映射器拿到/hello请求后,会去IOC容器里寻找能够处理他的控制器,然后将找到的具体控制器告诉DispatcherServlet
。DispatcherServlet
拿到具体的控制器后,会去访问这个Controller
,比如HelloController。控制器内部会调用业务逻辑相关,然后将数据封装到ModelAndView中,返回给DispatcherServlet
。其中ModelAndView中包含携带的数据和跳转的视图信息。DispatcherServlet
拿到ModelAndView后,会把它传递给View Resolver
(视图解析器),视图解析器进行解析后,再次传递给DispatcherServlet
。一旦确定视图,
DispatcherServlet
将把模型数据传递给View
,最后呈现在浏览器中。
6. 第一个SpringMVC程序
创建动态web项目:SpringMVC-01
项目结构:
6.1 导入jar
将以下jar复制到lib目录下:
commons-logging-1.2.jar
spring-aop-4.3.9.RELEASE.jar
spring-beans-4.3.9.RELEASE.jar
spring-context-4.3.9.RELEASE.jar
spring-core-4.3.9.RELEASE.jar
spring-expression-4.3.9.RELEASE.jar
spring-web-4.3.9.RELEASE.jar
spring-webmvc-4.3.9.RELEASE.jar
6.2 配置前端控制器
在开发 Spring MVC 应用时需要在 web.xml 中部署 DispatcherServlet,代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>SpringMVC-01</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- 部署 DispatcherServlet -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 配置 DispatcherServlet 的初始化參數:设置文件的路径和文件名称 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!-- 表示容器再启动时立即加载servlet -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!-- 处理所有URL -->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
解释:
contextConfigLocation 是用来配置 SpringMVC 的配置文件的路径的,也可以不配置contextConfigLocation,会使用默认路径。
默认的配置文件路径为: /WEB-INF/
默认配置文件名称为:[dispatcherServlet名字]-servlet.xml
6.3 创建 Web 应用首页
在 WebContent 目录下有个应用首页 index.jsp。index.jsp 的代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href="${pageContext.request.contextPath }/helloworld">Hello World</a>
</body>
</html>
也可以直接写成:
<a href="helloworld">Hello World</a>
6.4 创建 Controller 类
在 src 目录下创建 com.lee.springmvc.controller 包,并在该包中创建 HelloController ,用来处理首页中"Hello World"超链接的请求。
package com.lee.springmvc.controller;
@Controller
public class HelloController {
@RequestMapping(value = "/helloworld", method = RequestMethod.GET)
public String helloworld() {
System.out.println("hello,world");
return "success";
}
}
6.5 Spring MVC 的配置文件
在 Src 目录下创建名为 springmvc.xml 的配置文件,具体代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<!-- 设置扫描组件的包: -->
<context:component-scan base-package="com.lee.springmvc.controller" />
<!-- 配置映射解析器:如何将控制器返回的结果字符串,转换为一个物理的视图文件 -->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>
SpringMVC中需要配置控制器相关包扫描和视图解析器。
6.6 应用的其他页面
HelloController 控制器处理成功后跳转到 /WEB-INF/views 下的 success.jsp 视图,因此在应用的 /WEB-INF/views 目录下应有 success.jsp :
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>springmvc</title>
</head>
<body>
你好,SpringMVC!
</body>
</html>
6.7 发布并运行 Spring MVC 应用
将 SpringMVC-01 发布到 tomcat服务器:
访问"http://localhost:8080/SpringMVC-01/",如图:
点击 Hello World,会跳转到 success.jsp 页面:
7. HelloWorld请求流程图解
首先客户端发出请求helloworld
,会被 dispatchServlet
拦截(由于dispatchServlet设置的url-pattern是"/",所以会拦截所有请求)。
然后dispatchServlet
会去控制器中寻找一个可以映射到该请求的方法,这个方法就会来处理客户端的请求。
最后处理请求的方法会返回一个字符串,这个字符串就会和 视图解析器中的前缀、后缀拼接,拼接后的路径就是响应的视图页面路径。
注意两个点:
① 映射路径名称:
一般请求的映射路径名称和处理请求的方法名称最好一致(实质上方法名称任意)
@RequestMapping(value="/helloworld",method=RequestMethod.GET)
public String helloworld(){
//public String abc123(){
System.out.println("hello,world");
return "success";
}
② 一个错误:
经常有同学在配置视图解析器的时候出现错误,把/WEB-INF/views/
配置成了 /WEB-INF/views
,正确写法如下:
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>