您的位置 首页 java

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 提供了一个 Dispatcher servlet 作为前端控制器来分配请求。通过策略接口,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文件,文件配置如下:

<web-app xmlns=””

xmlns:xsi=” org /2001/XMLSchema-instance”

xsi:schemaLocation=”

version=”3.0″>

<display-name>Spring MVC Application</display-name>

< Servlet >

<servlet-name>HelloWeb</servlet-name>

<servlet-class>

org.springframework.web.servlet.DispatcherServlet

</servlet-class>

<load-on-startup>1</load-on-startup>

</servlet>

<servlet-mapping>

<servlet-name>HelloWeb</servlet-name>

<url-pattern>/</url-pattern>

</servlet-mapping>

</web-app>

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

定义HelloWeb-servlet.xml文件

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

<beans xmlns=””

xmlns:context=””

xmlns:xsi=””

xsi:schemaLocation=”

“>

<context:component-scan base-package=”com.liangwei.learning” />

<bean class=”org.springframework.web.servlet.view.InternalResourceViewResolver”>

<property name=”prefix” value=”/WEB-INF/jsp/” />

<property name=”suffix” value=”.jsp” />

</bean>

</beans>

如上所示,该配置文件与以前学习到的Spring配置文件相同,这里值得一提的是,Spring 3.0 增加了@Controller等注解,使得我们可以直接使用注解的方式进行定义配置控制器,而Spring MVC也提供一种配置方式,使得Spring MVC在加载时自动扫描所有有@Controller和@RequestMapping注解的类,并将其注册为控制器(bean)。我们使用该配置<context:component-scan base-package=”com.liangwei.learning” />,并制定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,由于我们前面已经配置了<context:component-scan>标签,框架会自动扫描并注册控制器。我们使用@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″ %>

<html>

<head>

<title>Hello World</title>

</head>

<body>

<h2>${message}</h2>

</body>

</html>

该文件存储在/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 验证码:头条(06 必过)欢迎大家的加入哟!

文章来源:智云一二三科技

文章标题:Java开发大型互联网Spring MVC项目实战之Spring MVC原理剖析

文章地址:https://www.zhihuclub.com/186535.shtml

关于作者: 智云科技

热门文章

网站地图