Spring MVC核心概念
Spring MVC 是一种基于 Java 的实现了 MVC(Model-View-Controller,模型 - 视图 - 控制器)设计模式的 Web 应用框架,它的核心主要体现在以下几个关键组件和机制上:
核心组件
1. DispatcherServlet(前端控制器)
- 作用:它是 Spring MVC 的核心调度器,是整个请求处理流程的入口。所有的 HTTP 请求都会首先被发送到 DispatcherServlet,由它来统一接收请求并进行分发处理。
- 工作流程:DispatcherServlet会根据请求的信息,如 URL、请求方法等,将请求分发给合适的处理器(Handler)进行处理。它还负责管理请求处理过程中的各个组件,如视图解析器、处理器映射器等。
- 代码示例:在 web.xml中配置DispatcherServlet
<servlet><servlet-name>dispatcher</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/spring-mvc.xml</param-value></init-param><load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping><servlet-name>dispatcher</servlet-name><url-pattern>/</url-pattern>
</servlet-mapping>
2. HandlerMapping(处理器映射器)
- 作用:负责将客户端的请求映射到具体的处理器(Handler)上。它根据请求的 URL、请求方法等信息,查找并返回处理该请求的处理器。
- 常见实现:Spring MVC 提供了多种 HandlerMapping的实现,如BeanNameUrlHandlerMapping、SimpleUrlHandlerMapping和RequestMappingHandlerMapping等。其中,RequestMappingHandlerMapping是最常用的,它支持使用@RequestMapping注解来映射请求。
- 代码示例:使用 @RequestMapping注解
@Controller
public class HelloController {@RequestMapping("/hello")public String hello() {return "hello";}
}
3. HandlerAdapter(处理器适配器)
- 作用:由于处理器的类型可能多种多样,HandlerAdapter的作用就是将不同类型的处理器适配成统一的调用方式,使得DispatcherServlet可以以统一的方式调用处理器。
- 工作流程:DispatcherServlet找到处理器后,会通过HandlerAdapter来调用处理器的处理方法,并返回处理结果。
- 常见实现:Spring MVC 提供了多种 HandlerAdapter的实现,如SimpleControllerHandlerAdapter、HttpRequestHandlerAdapter和RequestMappingHandlerAdapter等。
4. ViewResolver(视图解析器)
- 作用:负责将处理器返回的逻辑视图名解析为实际的视图对象。它根据逻辑视图名和配置信息,查找并返回处理该视图的视图对象。
- 常见实现:Spring MVC 提供了多种 ViewResolver的实现,如InternalResourceViewResolver、FreeMarkerViewResolver和ThymeleafViewResolver等。其中,InternalResourceViewResolver是最常用的,它用于解析 JSP 视图。
- 代码示例:配置 InternalResourceViewResolver
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/views/"/><property name="suffix" value=".jsp"/>
</bean>
5. View(视图)
- 作用:负责将模型数据呈现给用户。它可以是 JSP、FreeMarker、Thymeleaf 等各种视图技术。
- 工作流程:ViewResolver解析出视图对象后,视图对象会根据模型数据生成最终的响应内容,并返回给客户端。
- 代码示例:JSP 视图示例
<!DOCTYPE html>
<html>
<head><title>Hello</title>
</head>
<body><h1>Hello, Spring MVC!</h1>
</body>
</html>
核心机制
1. 依赖注入(DI)和控制反转(IoC)
- 作用:Spring MVC 基于 Spring 框架,继承了 Spring 的依赖注入和控制反转机制。通过依赖注入,组件之间的依赖关系由容器来管理,降低了组件之间的耦合度,提高了代码的可维护性和可测试性。
- 代码示例:使用 @Autowired注解进行依赖注入
@Controller
public class UserController {@Autowiredprivate UserService userService;// 处理请求的方法
}
2. AOP(面向切面编程)
- 作用:AOP 允许在不修改原有代码的情况下,对程序的功能进行增强。在 Spring MVC 中,AOP 可以用于实现日志记录、事务管理、权限验证等功能。
- 代码示例:使用 @Aspect注解实现 AOP
@Aspect
@Component
public class LoggingAspect {@Before("execution(* com.example.controller.*.*(..))")public void beforeMethod() {System.out.println("Before method execution");}
}
综上所述,Spring MVC 的核心在于通过 DispatcherServlet 统一调度,利用 HandlerMapping、HandlerAdapter、ViewResolver 等组件实现请求的处理和视图的渲染,同时借助依赖注入、AOP 等机制提高代码的可维护性和可扩展性。
