在Spring MVC框架中,DispatcherServlet是处理所有进入的HTTP请求并将其路由到适当控制器的核心分发器。它是管理Spring MVC应用程序整个请求生命周期的中央调度器。
DispatcherServlet作为Spring MVC应用程序中每个请求的入口点。它拦截请求,确定要委派给哪个控制器,然后将请求转发到视图层进行渲染。
DispatcherServlet的工作流程如下:
为了更好地理解DispatcherServlet,让分解它与关键组件的交互:
当在web.xml中定义DispatcherServlet或通过Java配置时,Spring会自动将其注册为前端控制器,并用必要的bean(如HandlerMapping、ViewResolver等)初始化它。
<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>
<url-pattern>/</url-pattern>
</servlet-mapping>
现在,让看看如何在Spring应用程序中配置DispatcherServlet。
如果使用的是基于XML的配置,可以在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/dispatcher-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<url-pattern>/</url-pattern>
</servlet-mapping>
此配置告诉Spring使用DispatcherServlet作为前端控制器,并在启动时加载它。
使用基于Java的配置,可以使用WebApplicationInitializer注册DispatcherServlet:
public class MyWebAppInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext container) {
AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
context.register(AppConfig.class);
ServletRegistration.Dynamic dispatcher = container.addServlet("dispatcher", new DispatcherServlet(context));
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/");
}
}
在Spring MVC应用程序中,DispatcherServlet有自己的应用程序上下文,它是根应用程序上下文的子上下文。这种层次结构允许将特定于Web的bean与其他应用程序范围的bean分开。
让创建一个简单的Spring MVC应用程序,看看DispatcherServlet在实际中是如何工作的。
使用Maven或Gradle设置一个基本的Spring MVC项目。确保有必要的依赖项:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.10</version>
</dependency>
创建一个简单的控制器来处理请求:
@Controller
public class HelloController {
@RequestMapping("/hello")
public String hello(Model model) {
model.addAttribute("message", "Hello, DispatcherServlet!");
return "hello";
}
}
在WEB-INF/views中创建一个名为hello.jsp的JSP文件:
<html>
<body>
<h2>${message}</h2>
</body>
</html>
运行应用程序并导航到http://localhost:8080/your-app-context/hello。应该看到控制器中配置的消息“Hello, DispatcherServlet!”显示出来。