本文为《Spring + MyBatis 企业应用实战》章节笔记
2.1 MVC 思想概述
2.1.1 传统 Model1 和 Model2
-
Model1
:整个 Web 应用几乎都由 JSP 页面组成,JSP 页面接收处理客户端请求,对请求处理后直接做出响应。 -
Model2
:Servlet 作为前端控制器(Controller),负责接收客户端发送的请求;然后调用后端 JavaBean(Model) 来完成实际的逻辑处理;最后,将其转发到相应的 JSP 页面(View)来处理现实逻辑。
2.1.2 MVC 思想及其优势
MVC 思想将一个应用分成三个基本部分:Model
(模型)、View
(视图)和 Controller
(控制器),这三个部分以最少的耦合协同工作。
优势
-
多个视图可以对应一个模型
-
模型返回的数据与显示逻辑分离
-
应用分为三层,降低耦合,提供了拓展性
-
控制层概念很有效,把各个模型和视图组合在一起
-
MVC 更符合软件工程化管理的精神
2.2 Spring MVC
2.2.1 Spring MVC 的优势
Spring MVC 框架提供了一个 DispatcherServlet
作为前端控制器来分派请求,同时提供灵活的配置处理程序映射、视图解析、语言环境和主题解析,并支持文件上传。
特点
-
拥有强大的灵活性、非侵入性和可配置性
-
提供一个前端控制器
DispatcherServlet
,无需额外开发 -
分工明确,包括控制器、验证器、命令对象、模型对象、处理程序映射视图解析器等
-
自动绑定用户输入,并正确地转换数据类型
-
使用 Map 对象实现更加灵活的模型数据传输
-
内置常见的校验器
-
支持国际化
-
支持多种视图技术
-
Spring 提供了简单而强大的 JSP 标签库,支持数据绑定
2.3 开发第一个 Spring MVC 应用
2.3.1 Spring 的下载和安装
2.3.2 Spring MVC 的 DispatcherServlet
使用时需把它配置在 Web 应用的部署描述 web.xml
文件中
它加载时会需要一个 Spring MVC 的配置文件(springmvc-config.xml
)。
// web.xml 中 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>/WEB-INF/springmvc-config.xml</param-value>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
<servlet-mapping>
// springmvc-config.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/springbeans-4.2.xsd">
<bean name="/hello" class="org.zhisheng.controller.HelloController"/>
<bean class="org.springframework.web.servlet.handler.BeanNameUrlGandlerMapping"/>
<bean class="org.springframework.web.servlet.mvc.SimpleControllerGandlerAdapter"/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"/>
</beans>
2.3.3 基于 Controller 接口的控制器
DispatcherServlet 的核心功能是分发请求,请求会被分发给对应处理的 Java 类,Spring MVC 中称为 Handle。
开发 Handle ,需继承 org.springframework.web.servlet.mvc.Controller
接口,必须实现方法 HandleRequest()
。
方法签名:
ModelAndView handleRequest (HttpServletRequest request, HttpServletResponse response) throws Excption
Controller
接口的实现类只能处理一个单一请求动作。
示例(步骤(xml 配置))
-
增加 Spring 的支持:导包(Spring 包和 commons-logging 包)
-
配置 DispatcherServlet:在 web.xml 中添加(servlet)
-
配置 Spring MVC 的 Controller:springmvc-config.xml(bean)
-
Controller 类的实现:HelloController.java(implements/@override handleRequest)
-
View 页面:welcome.jsp
示例:基于注解的控制器(Spring2.5 后)
-
Controller 的实现:@Controller、@RequestMapping(value="/hello")
-
修改 Spring MVC 配置文件
2.4 详解 DispatcherServlet
DispatcherServlet 的源码如下:
protected void initStrategies(ApplicationContext context) {
initMultipartResolver(context);
initLocaleResolver(context);
initThemeResolver(context);
initHandlerMappings(context);
initHandlerAdapters(context);
initHandlerExceptionReslvers(context);
initRequestToViewNameTranslator(context);
initViewReslovers(context);
initFalshMapManager(context);
}
initStrategies 方法将在 ApplicationContext 初始化后自动执行,自动扫描上下文的 Bean,根据名称或类型匹配的机制查找自定义的组件。如果没有找到则会配置一套 Spring 的默认组件。
2.5 Spring MVC 执行流程
2.5.1 Spring MVC 应用的开发步骤
-
在 web.xml 中定义 DispatcherServlet
-
POST(定义包含表单数据的 JSP 页面)/GET(则无需这步)
-
定义 Handle 类(实现 Controller 接口或使用 @Controller 注解)
-
配置 Handle(xml 或注解)
-
编写视图资源
2.5.2 Spring MVC 执行流程
-
用户向服务器发送请求,请求被 Spring 的前端控制器 DispatcherServlet 截获。
-
DispatcherServlet 对请求 URL 进行解析,得到 URI。然后根据 URI,调用 HandlerMapping 获得该 Handler 配置的所有相关对象,包括 Handler 对象以及 Handler 对象对应的拦截器,这些对象会被封装到一个 HandlerExecutionChain 对象当中返回。
-
DispatcherServlet 根据获得的 Handler,选择一个合适的 HandlerAdapter。HanlderAdapter 会被用于处理多种 Handler,调用 Handler 实际处理请求的方法。
-
提取请求中的模型数据,开始执行 Handler(Controller)。
-
Handler 执行完成后,向 DispatcherServlet 返回一个 ModelAndView 对象。
-
根据 ModelAndView 对象,选择一个合适的 ViewResolver 返回给 DispatcherServlet。
-
ViewResolver 结合 Model 和 View 来渲染视图。
-
将视图渲染结果返回给客户端。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于