Java开发大型互联网Spring MVC项目实战之Spring MVC原理剖析

引言

Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的SpringMVC框架或集成其他MVC开发框架,如Struts1,Struts2等。

什么是 Spring MVC

Spring MVC 属于 SpringFrameWork 的后续产品,已经融合在 Spring Web Flow 里面,是一个强大灵活的 Web 框架。Spring MVC 提供了一个 DispatcherServlet 作为前端控制器来分配请求。通过策略接口,Spring 框架是高度可配置的。Spring MVC 还包含多种视图技术,如 Java Server Pages(JSP)、Velocity、Tiles、iText 和 POI 等。Spring MVC 分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。Spring MVC 框架主要由 DispatcherServlet、处理器映射器、处理器适配器、处理器(控制器)、视图解析器、视图组成。

Spring MVC备用配置

通过继承AbstractAnnotationConfigDispatcherServletInitializer来快速地对Spring MVC进行了设置。该类假设你想要一个基础的DispatcherServlet和ContextLoaderListener设置,并且通过Java而不是XML文件来配置Spring。

尽管这样配置对大多数Spring应用都是适用的,但是总有意外,比如你想要除了DispatcherServlet之外的servlet和filter,或者你想对DispatcherServlet做一些进一步的配置,再或者,你想在Servlet3.0之前的版本上部署应用,那么你就要使用传统的web.xml文件对DispatcherServlet进行配置了。

幸运的是,在(garden-variety)普通的AbstractAnnotationConfigDispatcherServletInitializer不适用于你的需求时,还有其他的一些方式供你使用。下面,我们就开始如何定制化的配置DispatcherServlet吧。

Spring MVC实战

配置DispatcherServlet(定义web.xml)

在webapp/WEB-INF文件夹下(若不存在WEB-INF文件夹则创建)下创建web。xml文件,文件配置如下:

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="

http://java.sun.com/xml/ns/javaee

http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"

version="3.0">

Spring MVC Application

HelloWeb

org.springframework.web.servlet.DispatcherServlet

1

HelloWeb

/

如上所示,我们使用标签配置DispatcherServlet并且使用标签为该servlet命名为HelloWeb。接下来我们使用标签为该servlet配置映射关系,如上所示,所有路径以/开始的都会被名为HelloWeb的servlet进行处理。

定义HelloWeb-servlet.xml文件

我们在web.xml文件里定义了名为HelloWeb的servlet,Spring MVC框架启动是会初始化该Servlet,默认情况下框架使用[servlet-name]-servlet.xml的文件格式查找该servlet的配置信息。为简便起见,我们使用该约束方式创建HelloWeb-servlet.xml并配置,该文件内容如下:

xmlns:context="http://www.springframework.org/schema/context"

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-3.0.xsd

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context-3.0.xsd">

如上所示,该配置文件与以前学习到的Spring配置文件相同,这里值得一提的是,Spring 3.0 增加了@Controller等注解,使得我们可以直接使用注解的方式进行定义配置控制器,而Spring MVC也提供一种配置方式,使得Spring MVC在加载时自动扫描所有有@Controller和@RequestMapping注解的类,并将其注册为控制器(bean)。我们使用该配置,并制定base-package,框架会自动在该包名下扫描并注册控制器。

除上述配置外,我们需要配置为该Servlet配置ViewResolver,这里我们使用InternalResourceViewResolver,并且配置前缀为/WEB-INF/jsp/,后缀为.jsp,这样当控制器返回一个hello的String类型实例时,框架会将其解析为/WEB-INF/jsp/hello.jsp,然后查找该视图文件并使用渲染器渲染视图。

定义控制器(HelloController)

前面我们定义了Servlet并且完成了其配置工作,接下来我们定义一个控制器:HelloController:

@Controller

@RequestMapping("/hello")

public class HelloController {

@RequestMapping(method = RequestMethod.GET)

public String printHello(ModelMap model) {

model.addAttribute("message", "Hello Spring MVC Framework!");

return "hello";

}

}

如上所示,我们使用@Controller注解注解HelloController,由于我们前面已经配置了标签,框架会自动扫描并注册控制器。我们使用@RequestMapping注解并设置"/hello"值,这是的所有的请求路径为/hello的请求被分发到该控制器。这里我们将@RequestMapping路径设置在类上,当然我们也可以将该注解设置在具体方法上,我们会在后面的文章讲解它们之间的区别。我们的控制器类提供了printHello方法,该方法签名拥有一个ModelMap类型参数,并且返回String类型值。该方法使用@RequestMapping(method = RequestMethod.GET)设置只接受GET方法。这样的配置使得我们的控制器会接受/hello路径的GET请求。

定义视图文件hello.jsp

我们配置好了Servlet,且定义了控制器,接下来我们需要配置视图文件hello.jsp

<%@ page contentType="text/html; charset=UTF-8" %>

Hello World

${message}

该文件存储在/WEB-INF/jsp路径下,命名为hello.jsp:这跟我们前面的HelloWeb-servlet.xml的配置有关。该文件为简单的JSP视图文件,它会从模型中获取名为message的信息,并交给渲染器进行渲染。以上我们就完成了Hello Spring MVC项目的开发和配置工作。

SpringMVC运行原理

(1) Http请求:客户端请求提交到DispatcherServlet。

(2) 寻找处理器:由DispatcherServlet控制器查询一个或多个HandlerMapping,找到处理请求的Controller。

(3) 调用处理器:DispatcherServlet将请求提交到Controller。

(4)(5)调用业务处理和返回结果:Controller调用业务逻辑处理后,返回ModelAndView。

(6)(7)处理视图映射并返回模型: DispatcherServlet查询一个或多个ViewResoler视图解析器,找到ModelAndView指定的视图。

(8) Http响应:视图负责将结果显示到客户端。

3.SpringMVC接口解释

(1)DispatcherServlet接口:

Spring提供的前端控制器,所有的请求都有经过它来统一分发。在DispatcherServlet将请求分发给Spring Controller之前,需要借助于Spring提供的HandlerMapping定位到具体的Controller。

(2)HandlerMapping接口:

能够完成客户请求到Controller映射。

(3)Controller接口:

需要为并发用户处理上述请求,因此实现Controller接口时,必须保证线程安全并且可重用。

Controller将处理用户请求,这和Struts Action扮演的角色是一致的。一旦Controller处理完用户请求,则返回ModelAndView对象给DispatcherServlet前端控制器,ModelAndView中包含了模型(Model)和视图(View)。

从宏观角度考虑,DispatcherServlet是整个Web应用的控制器;从微观考虑,Controller是单个Http请求处理过程中的控制器,而ModelAndView是Http请求过程中返回的模型(Model)和视图(View)。

(4)ViewResolver接口:

Spring提供的视图解析器(ViewResolver)在Web应用中查找View对象,从而将相应结果渲染给客户。

4.DispatcherServlet:

是整个Spring MVC的核心。它负责接收HTTP请求组织协调Spring MVC的各个组成部分。其主要工作有以下三项:

(1)截获符合特定格式的URL请求。

(2)初始化DispatcherServlet上下文对应WebApplicationContext,并将其与业务层、持久化层的WebApplicationContext建立关联。

(3)初始化Spring MVC的各个组成组件,并装配到DispatcherServlet中。

总结

以 上就是我对Java开发大型互联网Spring MVC项目实战之Spring MVC原理剖析  问题及其优化总结,分享给大家,觉得收获的话可以点个关注收藏转发一波喔,谢谢大佬们支持!

最后,每一位读到这里的网友,感谢你们能耐心地看完。希望在成为一名更优秀的Java程序员的道路上,我们可以一起学习、一起进步!都能赢取白富美,走向架构师的人生巅峰!

想了解学习Java方面的技术内容以及Java技术视频的内容可加群:722040762 验证码:(666 必过)欢迎大家的加入哟!

你可能感兴趣的:(Java开发大型互联网Spring MVC项目实战之Spring MVC原理剖析)