引言
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程序员的道路上,我们可以一起学习、一起进步!都能赢取白富美,走向架构师的人生巅峰!