SpringMvc 是如何将不同的request路由到不同的Controller中的?

Spring MVC通过一系列组件和步骤来将不同的HTTP请求路由到对应的Controller中。这个过程主要涉及到以下几个关键组件:DispatcherServletHandlerMappingController,以及ViewResolver。以下是Spring MVC处理请求的大致流程和代码解析:

  1. DispatcherServlet
    DispatcherServlet是Spring MVC的核心,它充当前端控制器,负责接收所有的HTTP请求,并委派给适当的处理程序。

  2. HandlerMapping
    HandlerMapping负责根据请求的URL查找相应的Controller。Spring MVC提供了多种HandlerMapping实现,如BeanNameUrlHandlerMappingSimpleUrlHandlerMapping等。

  3. Controller
    一旦确定了Controller,DispatcherServlet会委派请求给该Controller。Controller是一个用于处理用户请求并返回模型和视图的组件。

  4. 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,最终展示给用户。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值