Spring MVC通过一系列组件和步骤来将不同的HTTP请求路由到对应的Controller中。这个过程主要涉及到以下几个关键组件:DispatcherServlet
,HandlerMapping
,Controller
,以及ViewResolver
。以下是Spring MVC处理请求的大致流程和代码解析:
-
DispatcherServlet:
DispatcherServlet
是Spring MVC的核心,它充当前端控制器,负责接收所有的HTTP请求,并委派给适当的处理程序。 -
HandlerMapping:
HandlerMapping
负责根据请求的URL查找相应的Controller。Spring MVC提供了多种HandlerMapping实现,如BeanNameUrlHandlerMapping
、SimpleUrlHandlerMapping
等。 -
Controller:
一旦确定了Controller,DispatcherServlet
会委派请求给该Controller。Controller是一个用于处理用户请求并返回模型和视图的组件。 -
ViewResolver:
最后,ViewResolver
负责将逻辑视图名称解析为具体的视图实现,如JSP、Thymeleaf等。
以下是一个简单的例子来说明这个过程:
配置DispatcherServlet
在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-servlet.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>
配置Controller和路由
在spring-mvc-servlet.xml
中配置Controller和路由信息:
<beans ...>
<!-- 启用注解驱动的Controller -->
<mvc:annotation-driven />
<!-- 配置组件扫描 -->
<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>
</beans>
创建Controller
创建一个使用@Controller
注解的Java类,并使用@RequestMapping
来定义路由:
package com.example.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class MyController {
@GetMapping("/hello")
public String hello() {
return "hello"; // 返回视图名称,视图解析器会将其解析为/WEB-INF/views/hello.jsp
}
}
在这个例子中,当用户访问/hello
路径时,请求会被DispatcherServlet
捕获,并通过HandlerMapping
找到对应的MyController
中的hello()
方法。该方法返回一个视图名称"hello"
,然后ViewResolver
会将其解析为具体的JSP页面路径/WEB-INF/views/hello.jsp
,最终展示给用户。