Spring MVC 体系结构和处理请求控制器
①MVC小结:
1.MVC处理过程
对于MVC的三部分(模型Model、视图View、控制器Controller)功能职责分别进行了相应的阐述,并描述了各部分之间的调用关系。
MVC整体的处理过程:
(1)首先视图提供系统与用户交互的界面,并发送用户输入给控制器。
(2)控制器接受用户的请求,并决定应该调用那个模型来进行处理。
(3)模型根据用户请求进行相应的业务逻辑处理,并返回处理结果(数据)。
(4)控制器根据返回的处理结果,调用相应的视图格式化模型返回的数据,并通过视图呈现给用户结果。
2.MVC优缺点
1)优点
(1)多视图共享一个模型,大大提高代码的可重用性。
(2)MVC三个模块相互独立,松耦合架构。
(3)控制器提高了应用程序的灵活性和可配置性。
(4)有利于软件工程化管理。
通过MVC的设计模式最终可以打造出一个松耦合+高重用性+高可适用性的完美架构。
2)缺点
(1)原理复杂。
(2)增加了系统结构和实现的复杂性。
(3)视图对模型数据的低效率访问。
对于MVC来说,它并不适合小型甚至中性规模的项目,花费大量时间将MVC应用到规模并不是很大的应用程序通常得不偿失,所以对于MVC设计模式的使用要根据具体的应用场景来决定。
②Spring MVC框架介绍
Spring MVC是Spring框架中用于Web应用开发的一个模块,是Spring提供的一个基于MVC设计模式的优秀Web开发框架,它本质上相当于Servlet。在MVC设计模式中,
Spring MVC作为控制器(Controller)来建立模型与视图的数据交互,是结构最清晰的MVC Model2实现,可称为一个典型的MVC框架。
在Spring MVC框架中,Controller替换Servlet来担负控制器的职责,Controller接收请求,调用相应的Model进行处理,处理器完成业务处理后返回处理结果。Controller调用相应的
View并对处理结果进行视图渲染,最终客户端得到相应消息。
③Spring MVC环境搭建
使用Spring MVC框架步骤如下:
(1)引入jar文件。
(2)Spring MVC配置:
1)在web.xml中配置Servlet,定义DispatcherServlet。
2)创建Spring MVC的配置文件。
(3)创建Controller(处理请求的控制器)。
(4)创建View(JSP等)。
(5)部署运行。
1)下载需要的jar文件
(1)spring-web-3.2.13.RELEASE.jar:在Web应用开发时使用Spring框架所需的核心类。
(2)Spring-webmvc-3.2.13.RELEASE.jar:Spring MVC框架相关的所有类,包含框架的Servlets,Web MVC框架,以及对控制器和视图的支持。
2)在web.xml中配置Servlet
Spring MVC是基于Servlet的,DispatcherServlet是整个Spring MVC框架的核心,它负责截获请求并将其分派给相应的处理器处理。那么配置Spring MVC,首先就要进行DispatcherServlet的配置,
当然跟所有的Servlet一样,用户必须在web.xml中进行配置。关键代码👇:
<!-- 配置Spring MVC的核心控制器 DispatcherServlet --> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class> <!-- 初始化参数 --> <init-param> <param-name>contextConfigLocation</param-name <param-value>classpath:springmvc-servlet.xml</param-value> </init-param> <!-- 自动启动 --> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
3)创建Spring MVC的配置文件(springmvc-servlet.xml)
在项目工程下创建resources目录(注:Source Folder),并在此目录下添加Spring MVC的xml配置文件,为了方便框架集成的时候各个配置文件更好的区分,我们可将此文件命名为“springmvc-servlet.xml”。
在该配置文件中,我们使用Spring MVC最简单配置方式来进行配置,关键代码👇:
<?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:mvc="http://www.springframework.org/schema/mvc" xmlns:p="http://www.springframework.org/schema/p" 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.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!-- 配置处理器映射 HandlerMapping --> <bean name="/index.html" class="cn.smbms.controller.IndexController" /> <!-- 配置视图解析器 --> <!-- 对转向页面的路径解析。prefix:前缀, suffix:后缀 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/" /> <property name="suffix" value=".jsp" /> </bean> </beans>
1)配置处理器映射
DispatcherServlet要将一个请求交给哪个特定的Controller处理,它需要咨询一个Bean,这个Bean就叫做HandlerMapping,它的作用就是把一个URL请求指定给一个Controller处理。
Spring默认选中BeanNameUrlHandlerMapping处理器映射,即在Spring容器中查找与请求URL同名的Bean。这个映射器不需要配置,根据请求的URL路径映射到控制器Bean的名称。如下代码所示👇:
<bean name="/index.html" class="cn.smbms.controller.IndexController" />
指定的URL请求:/index.html,处理该URL请求的控制器:cn.smbms.controller.IndexController。
2)配置视图解析器
DispatcherServlet会找到一个视图解析器,将控制器返回的逻辑视图名称转换成渲染结果的实际视图。使用InternalResourceViewResolver定义该视图解析器。通过配置prefix(前缀)和suffix(后缀),
将视图逻辑名解析为/WEB-INF/jsp/<viewName>.jsp。
4)创建Controller
到目前为止,Spring MVC的相关环境配置已经完成,接下来编写Controller和View,就可以运行测试了。
在src下新建包cn.smbms.controller,并在该包下新建class:IndexController.java,如何将该javaBean变成一个可以处理前端请求的控制器?需要继承org.springframework.web.servlet.mvc.AbstractController,
并实现HandleRequestInternal方法,关键代码如下👇:
package cn.smbms.controller; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.AbstractController; public class IndexController extends AbstractController { @Override protected ModelAndView handleRequestInternal(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception { System.out.println("hello,spring mvc!");//在控制台输出日志信息 return new ModelAndView("index"); } }
5)创建View
在第二步配置视图解析器时,根据所定义prefix(前缀)——/WEB-INF/jsp/he suffix(后缀)——.jsp,我们需要在WEB-INF下创建jsp文件夹,并在该文件夹下创建真正的JSP视图——index.jsp,
并在该视图上输出“hello,Spring MVC!”,关键代码如下👇:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'index.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> </head> <body>hello,Spring MVC!</body> </html>
由于控制器IndexController返回的逻辑视图名称为index,那么通过视图解析器,会将视图逻辑名解析为/WEB-INF/jsp/index.jsp,得到真正的JSP视图名。
6)部署运行
到目前为止,所有的环境搭建一级示例的编码工作一级完成,下面可以编译后部署到Tomcat下运行测试。
④Spring MVC框架的请求处理流程及体系结构
1)Spring MVC框架的请求处理流程
Spring MVC框架也是一个基于请求驱动的Web框架,并且也使用了前端控制器模式来进行设计,再根据请求映射规则分发给相应的页面控制器(处理器)来进行处理。分析Spring MVC请求处理的流程步骤👇
(1)首先用户发送请求到前端控制器(DispatcherServlet),前端控制器根据请求信息(如URL)来决定选择哪个页面控制器(Controller)来进行处理,并把请求委托给它,即Servlet控制器的控制逻辑部分。
(2)页面控制器接收到到请求后,进行业务处理,处理完毕后返回一个ModelAndView(模型数据和逻辑视图名)。
(3)前端控制器收回控制权,然后根据返回的逻辑视图名,选择相应的真正视图,并把模型数据传入以便将视图渲染展示。
(4)前端控制器再次收回控制权,将响应结果返回给用户,至此整个流程结束。
2)Spring MVC框架的体系结构
Spring MVC通过一个前端控制器(DispatcherServlet)接收所有的请求,并将具体工作委托给其他组件进行处理,DispatcherServlet处于核心地位,它负责协调组织不同组件完成请求处理并返回响应。每个组件所负责的工作内容👇
(1)客户端发出HTTP请求,Web应用服务器接受此请求。若匹配DispatcherServlet的请求映射路径(在web.xml中指定),则Web容器将该请求转交给DispatcherServlet处理。
(2)DispatcherServlet接收到该请求后,将根据请求的信息(包括URL、请求参数、HTTP方法等)及HandlerMapping的配置(在<servletName>-servlet.xml中配置)找到处理请求的处理器(Handler)。
(3)当DispatcherServlet根据HandlerMapping找到对应当前请求的Handler之后,通过HandlerAdapter对Handler进行封装,再以统一的适配器接口调用Handler。HanlerAdapter可以理解为具体使用Handler来干活的人。
(4)在请求信息到达真正调用Handler的处理方法之前的这段时间内,Spring MVC还完成了很多工作,它会将请求信息以一定方式转换并绑定到请求方法的入参中,对于入参的对象会进行数据转换、数据格式化以及数据校验等。
这些都做完之后,最后才真正地调用Handler的处理方法进行相应的业务逻辑处理。
(5)处理器完成业务逻辑处理之后将返回一个ModelAndView对象给DispatcherServlet,ModelAndView对象包含了逻辑视图名和模型数据信息。
(6)ModelAndView对象中包含的是“逻辑视图名”,而非真正的视图对象。DispatcherServlet会通过ViewResolver将逻辑视图名解析为真正的视图对象View。当然,负责数据展示的视图可以为JSP、XML、PDF、JSON等多种数据格式,
对应Spring MVC均可灵活配置。
(7)当得到真正的视图对象View后,DispatcherServlet会使用ModelAndView对象中的模型数据对View进行视图渲染。
(8)最终客户端获得响应消息,根据配置,可以是普通的HTML页面,也可以是一个XML或者JSON格式的数据等。
3)Spring MVC框架的特点
(1)清晰地角色划分。Spring MVC在Model、View和Controller方面提供了一个非常清晰的角色划分,这三个方面真正是各司其职、各负其责。
(2)灵活的配置功能。以为Spring的核心是IoC,同样在实现MVC上,也可以把各种类当作Bean来通过XML进行配置。
(3)提供了大量的控制器接口和实现类。开发者可以使用Spring提供的控制器实现类,也可以自己实现控制器接口。
(4)真正做到与View层的实现无关(JSP、Velocity、XSLT等)。它不会强制开发者使用JSP,也可以根据项目需求使用Velocity、XSLT等技术,使用起来更加灵活。
(5)国际化支持。
(6)面向接口编程。
(7)Spring提供了Web应用开发的一整套流程,不仅仅是MVC,它们之间可以很方面地结合一起。