6.1MVC模式概述
Model Ⅰ 和Model Ⅱ
model Ⅰ:jsp
改进的model Ⅰ:jsp文件负责程序的流程控制逻辑和数据显示逻辑任务,JavaBean负责处理业务逻辑任务
model Ⅱ:jsp负责数据显示逻辑任务,servlet负责程序流程控制逻辑任务,JavaBean负责处理业务逻辑任务。
MVC模式及其优势
MVC思想将一个应用分成三个基本部分:Model(模型),View(视图)和Controller(控制器),这三个部分以最少的耦合协同工作,从而提高应用的可扩展性和可维护性。
6.2Spring MVC概述
Spring MVC是Spring框架中用于Web开发的一个模块,是Spring提供的一个基于MVC设计模式的轻量级Web框架。Spring框架提供了构建Web应用程序的全功能MVC模块。Spring MVC框架本质上相当于servlet,提供了一个DispatcherServlet作为前端控制器来分派请求,同时提供灵活的配置处理程序映射、视图解析、语言环境和主题解析,并支持文件上传暂时先不管这个
在MVC设计模式中,Spring MVC作为控制器(Controller)来建立模型与视图的数据交互, 是一个典型的MVC框架
- Spring MVC拥有强大的灵活性、非侵入性(不需要用户代码引入框架代码,直接用就可以了)、可配置性(文件可以通过配置文件来实现)。
- Spring MVC提供了一个前端控制器DispatcherServlet,开发者无需额外开发控制器对象
- Spring MVC分工明确,包括控制器、验证器、命令对象、模型对象、处理程序映射视图解析器等等,每一个功能实现由一个专门的对象负责
- Spring MVC可以自动绑定用户输入,并正确转换数据类型。
- Spring MVC使用一个名称/值的Map对象实现更加灵活的模型数据类型。
- Spring MVC内置了常见的校验器,可以检验用户输入,如果校验不同,则重定向回输入表单。输入校验是可选的,并且支持编程方式即声明方式。
- Spring MVC支持国际化,支持根据用户区域显式多国语言,并且国际化的配置非常简单
- Spring MVC支持多种视图技术,最常见的有JSP技术以及其他技术,包括Velocity和FreeMarker。
- Spring MVC提供了一个简单而强大的JSP标签库,支持数据绑定功能,使得编写JSP页面更加容易。
- 特点很重要的,最好记一下,后面都会讲到。
6.3Spring MVC环境搭建
新建一个web项目
添加需要的jar包(16个)
在web.xml文件中,配置Spring MVC的前端控制器DispatcherServlet
Spring MVC是基于Servlet的框架,DispatcherServlet是整个Spring MVC框架的核心,它负责接收请求并将其分派给相应的处理器处理,关键配置代码如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>springmvc-1</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!--配置spring MVC的前端控制器DispatcherServlet -->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--初始化参数,配置Spring MVC配置文件的位置以及名称 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!--表示容器启动时,立即加载 DispatcherServlet -->
<load-on-startup>1</load-on-startup>
</servlet>
<!--Spring MVC的前端控制器拦截所有的请求 -->
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
新建springmvc.xml文件在src目录下
在springmvc.xml文件中,首先要引入beans、aop、context和mvc命名空间;然后主要完成配置处理器映射和配置视图解析器。
① 配置处理器映射器
Spring提供了多种处理器映射(HanderMapping)支持,例如:
org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping
org.springframework.web.servlet.SimpleUrlHandlerMapping
org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping
可以根据需求选择处理器映射,这里我们选择BeanNameUrlHandlerMapping,若没有明确声明任何处理器映射,Spring会默认使用BeanNameUrlHandlerMapping,即在Spring容器中查找与请求URL同名的Bean,通过声明HelloController业务控制器类,并将其映射到/hello请求。
② 配置视图解析器
处理请求的最后一件事就是解析输出,该任务由视图(这里使用JSP)实现,那么需要确定:指定的请求需要使用哪个视图进行请求结果的解析输出?DispatcherServlet会查找到一个视图解析器,将控制器返回的逻辑视图名称转换解析成结果的实际视图。Spring提供了多种视图解析器,例如:
org.springframework.web.servlet.view.InternalResourceViewResolver
org.springframework.web.servlet.view.ContentNegotiatingViewResolver
在springmvc.xml配置文件中,并没有配置处理器映射和处理器适配器,当用户没有配置这两项时,Spring会使用默认的处理器映射和处理器适配器处理请求。
创建处理请求的控制器类
上面程序的HelloController是一个实现Controller接口的控制器,他可以处理一个单一的请求动作,handleRequest是Controller接口必须要实现的方法,该方法必须返回一个包含视图名或视图名和模型的ModelAndView对象(后面会详解),该对象既包含视图信息,也包含模型数据信息。
创建视图页面
测试运行
运行tomcat服务器
打开浏览器
6.4Spring MVC请求流程
当用户发送URL请求http://localhost:8080/springmvc-1/hello时,根据web.xml中对于DispatcherServlet的配置,该请求被DispatcherServlet截获,并根据HandlerMapping找到处理相应请求的Controller控制器(HelloController);Controller处理完成后,返回ModelAndView对象;该对象告诉DispatcherServlet需要通过哪个视图来进行数据模型的展示,DispatcherServlet根据视图解析器把Controller返回的逻辑视图名渲染成真正的视图并输出,呈现给用户。