Spring MVC系统学习(二)——Spring MVC的核心类和注解

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请求方法(如GETPOSTPUTDELETE等)。
  • 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方法(如GETPOST)的请求。
示例 - 路径参数:
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的核心,用来将请求分发到对应的控制器。
相关推荐
汤姆和杰瑞在瑞士吃糯米粑粑3 分钟前
【C++学习篇】AVL树
开发语言·c++·学习
J不A秃V头A8 分钟前
IntelliJ IDEA中设置激活的profile
java·intellij-idea
DARLING Zero two♡10 分钟前
【优选算法】Pointer-Slice:双指针的算法切片(下)
java·数据结构·c++·算法·leetcode
虾球xz15 分钟前
游戏引擎学习第58天
学习·游戏引擎
小池先生21 分钟前
springboot启动不了 因一个spring-boot-starter-web底下的tomcat-embed-core依赖丢失
java·spring boot·后端
CodeClimb25 分钟前
【华为OD-E卷-木板 100分(python、java、c++、js、c)】
java·javascript·c++·python·华为od
odng28 分钟前
IDEA自己常用的几个快捷方式(自己的习惯)
java·ide·intellij-idea
CT随36 分钟前
Redis内存碎片详解
java·开发语言
brrdg_sefg1 小时前
gitlab代码推送
java
奶香臭豆腐1 小时前
C++ —— 模板类具体化
开发语言·c++·学习