Spring MVC(Model-View-Controller)是Spring框架的一个模块,用于构建基于Web的应用程序。它使用模型、视图和控制器分离的设计模式,使得Web开发更加模块化和灵活。在学习Spring MVC时,有几个核心类和注解是非常关键的,尤其是DispatcherServlet
、@Controller
、@RequestMapping
等。这些知识点是构建Spring MVC应用的基础。接下来我将逐步讲解这些概念,确保详细且易于理解。
1. 核心类 - DispatcherServlet
DispatcherServlet
是Spring MVC的核心类,负责将请求转发到适当的处理器(Controller)。它的职责是拦截所有传入的HTTP请求并分发到相应的控制器类进行处理。DispatcherServlet
是一个前端控制器(Front Controller),负责协调整个请求的处理过程。其作用主要包括:
- 接收并拦截用户请求。
- 解析请求的URL,找到相应的处理器(Controller)。
- 调用处理器进行业务逻辑处理。
- 根据处理结果决定跳转到哪个视图(View)。
- 将处理结果和视图返回给用户。
配置DispatcherServlet
在Spring Boot项目中,DispatcherServlet
自动由Spring Boot配置,无需手动配置。在非Spring Boot项目中,需要在web.xml
中手动配置:
xml
<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>
DispatcherServlet
的配置会拦截所有以/
开头的URL请求,并将它们转发到相关控制器处理。
2. 注解 - @Controller
@Controller
是Spring MVC的一个关键注解,用于标记控制器类。控制器类负责处理HTTP请求,执行业务逻辑,并返回相应的视图(或响应数据)。
示例:
java
@Controller
public class HomeController {
@RequestMapping("/home")
public String home() {
return "home"; // 返回视图名称 "home"
}
}
在这个示例中,HomeController
被@Controller
注解标记为一个控制器类,并且处理来自/home
路径的请求。方法home()
返回一个字符串"home"
,表示要显示的视图名。
3. 注解 - @RequestMapping
@RequestMapping
注解用于定义HTTP请求与处理方法之间的映射关系。可以将其用在类或方法上,来定义路径、HTTP请求方法、请求参数等的映射。
3.1 @RequestMapping
的使用
@RequestMapping
注解可以应用在控制器的类级别和方法级别:
- 类级别:用于为整个控制器类定义基础路径。
- 方法级别:用于定义处理某个特定URL的请求。
示例:
java
@Controller
@RequestMapping("/api")
public class ApiController {
@RequestMapping("/users")
public String getUsers() {
return "users"; // 处理 /api/users 请求
}
}
在这个例子中,类级别的@RequestMapping("/api")
表示该控制器处理所有以/api
开头的请求。getUsers()
方法处理的是/api/users
请求。
3.2 @RequestMapping
的属性
@RequestMapping
注解有多个属性,可以更精确地控制请求映射:
value
:定义URL路径,可以是单个路径或者路径数组。value
属性是默认属性,可以省略名称。method
:指定HTTP请求方法(如GET
、POST
、PUT
、DELETE
等)。params
:限制请求必须包含的参数,或者参数的特定值。headers
:限定请求头信息。consumes
:指定能够处理的请求的Content-Type
。produces
:指定方法返回的响应内容类型。
示例:
java
@Controller
@RequestMapping("/products")
public class ProductController {
// 处理 GET 请求
@RequestMapping(value = "/list", method = RequestMethod.GET)
public String listProducts() {
return "productList"; // 返回视图名
}
// 处理 POST 请求
@RequestMapping(value = "/add", method = RequestMethod.POST)
public String addProduct() {
return "addProduct"; // 返回视图名
}
// 处理包含特定参数的请求
@RequestMapping(value = "/filter", params = "category")
public String filterProducts() {
return "filteredProducts";
}
}
4. 请求映射方式
Spring MVC提供了多种请求映射的方式,使开发者能够灵活定义请求和控制器方法之间的映射关系。常见的映射方式包括:
- 精确匹配URL :直接指定路径,如
@RequestMapping("/home")
。 - 路径参数 :通过路径中的占位符接收参数,如
@RequestMapping("/user/{id}")
。 - 查询参数 :通过
params
属性限制某个请求参数的存在,如@RequestMapping(params = "type=special")
。 - 请求方法 :限制某个特定HTTP方法(如
GET
、POST
)的请求。
示例 - 路径参数:
java
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/{id}")
public String getUserById(@PathVariable("id") int userId, Model model) {
model.addAttribute("userId", userId);
return "userDetail"; // 显示用户详情
}
}
在这个例子中,@RequestMapping("/{id}")
定义了一个占位符{id}
,它会将路径中的id
参数映射到方法的参数userId
上。
5. 小结
Spring MVC提供了灵活的Web开发功能,核心类DispatcherServlet
负责将请求路由到控制器,而控制器通过@Controller
、@RequestMapping
等注解与前端请求建立映射。通过这些注解,我们可以定义路径、请求方式、请求参数等,灵活地处理不同的请求场景。
@Controller
标记类为控制器,处理前端请求。@RequestMapping
定义URL与控制器方法的映射关系,可以限制HTTP方法、请求参数等。DispatcherServlet
是整个Spring MVC的核心,用来将请求分发到对应的控制器。