1.基本概念:
Spring MVC(Model-View-Controller)是Spring Framework中的一个重要模块,用于构建基于Java的Web应用程序。它是一个强大且灵活的Web框架,遵循经典的MVC设计模式,将Web应用程序分为三个主要组件:模型(Model)、视图(View)和控制器(Controller)。这些组件分别负责不同的功能,有助于分离关注点,提高代码的可维护性和可测试性。
2.核心组件:
(1).DispatcherServlet
DispatcherServlet
是Spring MVC的前端控制器(Front Controller)。所有的HTTP请求都首先到达DispatcherServlet
,它负责协调不同组件的工作。DispatcherServlet
的主要职责包括:
- 接收并拦截所有的请求。
- 根据请求URL调用
HandlerMapping
,找到对应的Controller
。- 调用对应的
Controller
处理请求。- 将
Controller
返回的ModelAndView
对象传递给ViewResolver
。- 使用
ViewResolver
解析视图(View),并将响应返回给客户端。
(2).Controller
Controller
是处理用户请求的主要组件。它包含请求处理逻辑、调用服务层(Service Layer),并返回ModelAndView
对象。Controller
通过注解(如@Controller
和@RequestMapping
)来定义和映射请求路径。
@Controller
:将类标记为Spring MVC的控制器。@RequestMapping
:用于映射URL到特定的类或方法。
示例:
@Controller
@RequestMapping("/example")
public class ExampleController {
@RequestMapping("/greeting")
public ModelAndView greeting() {
ModelAndView modelAndView = new ModelAndView("greeting");
modelAndView.addObject("message", "Hello, World!");
return modelAndView;
}
}
(3).Model
Model
负责在视图与控制器之间传递数据。它通常是一个包含应用程序数据的对象,可以在控制器中创建并传递给视图进行渲染。Model
通常通过ModelAndView
对象或@ModelAttribute
注解来使用。
(4).View
View
是用户界面的表现层,负责显示Model
中的数据。Spring MVC支持多种视图技术,如JSP、Thymeleaf、FreeMarker、Velocity等。视图是通过ViewResolver
来解析和渲染的。
(5).HandlerMapping
HandlerMapping
是一个接口,用于根据请求的URL找到适当的控制器。Spring MVC提供了多种HandlerMapping
实现,如RequestMappingHandlerMapping
、SimpleUrlHandlerMapping
等。HandlerMapping
的配置可以基于注解或XML文件。
(6).ExceptionResolver
ExceptionResolver
用于处理控制器抛出的异常并返回合适的视图。常见的实现类是SimpleMappingExceptionResolver
,可以将异常类型映射到特定的视图。
3.工作流程:
(1).客户端请求:用户在浏览器中输入URL或单击链接,发起HTTP请求。
(2).请求拦截:请求被前端控制器DispatcherServlet
拦截,DispatcherServlet
是Spring MVC的核心,它是一个Servlet,负责处理所有传入的请求。
(3).处理器映射:DispatcherServlet
查询一个或多个HandlerMapping
,根据请求URL找到对应的Controller
。
(4).调用处理器:找到的Controller
被调用,并执行对应的请求处理方法。该方法处理业务逻辑,可能涉及调用服务层和数据访问层,并将结果封装到一个ModelAndView
对象中。
(5).选择视图解析器:DispatcherServlet
会查询一个或多个ViewResolver
,根据ModelAndView
对象中的视图名称找到对应的视图对象。
(6).渲染视图:ViewResolver
返回视图对象(如JSP文件),视图使用模型数据(Model)来渲染最终的HTML页面。
(7)返回响应:DispatcherServlet
将渲染后的视图返回给客户端,用户在浏览器中看到最终的结果。
4.重要注解:
Spring MVC使用注解驱动的编程模型,常见注解包括:
@Controller
:定义一个类作为控制器。@RequestMapping
:映射请求URL到控制器类或方法。@RequestParam
:将请求参数绑定到控制器方法的参数上。@PathVariable
:将URL中的占位符绑定到控制器方法的参数上。@ModelAttribute
:将方法返回值或方法参数绑定到模型属性上。@ResponseBody
:将控制器方法的返回值转换为HTTP响应体内容(通常用于RESTful API)。@ExceptionHandler
:定义一个方法来处理控制器内的异常。
5.配置方式
Spring MVC的配置方式多种多样,主要包括基于XML的配置和基于Java的配置(Java Config)。
(1).基于xml的配置方式
在WEB-INF
目录下的web.xml
文件中配置DispatcherServlet
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
然后在Spring的配置文件(如dispatcher-servlet.xml
)中配置组件
<context:component-scan base-package="com.example.controller" />
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
(2).基于Java的配置
使用Java类进行配置,可以通过@Configuration
、@EnableWebMvc
等注解来配置Spring MVC:
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.example.controller")
public class WebConfig implements WebMvcConfigurer {
@Bean
public InternalResourceViewResolver viewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
return resolver;
}
}
5.优点:
- 分离关注点(Separation of Concerns):通过MVC模式将数据处理、逻辑处理和视图处理分离,提高代码的可维护性和可读性。
- 灵活性:支持多种视图技术和配置方式(XML、Java Config)。
- 可扩展性:提供多种扩展点(如
HandlerInterceptor
、ExceptionResolver
)以满足各种需求。- 强大的社区支持:Spring社区庞大,文档丰富,支持不断更新和扩展
6.总结:
Spring MVC是企业级Java Web开发的一个强大框架,它不仅提供了灵活的配置和易于扩展的特性,还能够很好地集成Spring生态系统中的其他模块(如Spring Security、Spring Data等),使得开发过程更加高效和便捷。