Spring MVC : SimpleControllerHandlerAdapter

本文深入探讨SpringMVC框架中HandlerAdapter的工作原理,重点介绍了SimpleControllerHandlerAdapter如何处理实现了Controller接口的控制器类,以及其在请求处理流程中的角色。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述

Spring MVC的一个HandlerAdapter实现,用于支持实现了接口Controller的控制器类,如下例子所示 :

// Controller 实现类例子
public class WelcomeController implements Controller {

    @Override
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)   {
        ModelAndView mav = new ModelAndView("welcome");
        mav.addObject("now", LocalDateTime.now().toString());
        String name = request.getParameter("name");
        mav.addObject("name", name == null ? "欢迎 " : name);
        return mav;
    }
}

// 配置类
@Configuration
public class ControllerBeanConfig {
    /**
     * 这里定义一个 web controller bean, 注意 :
     * 1. 该 bean 实现了接口 Controller,
     * 2. 该 bean 没有使用注解 @Controller,
     * (如果使用了注解@Controller,会被RequestMappingHandlerMapping接管,而不是由BeanNameUrlHandlerMapping接管)
     * 3. 映射到匹配 welcome* 的url
     * @return
     */
    @Bean(name = "/welcome*")
    public WelcomeController beanWelcomeController() {
        return new WelcomeController();
    }
}

Spring MVC配置机制的bean组件BeanNameUrlHandlerMapping beanNameHandlerMapping初始化时会检测到如上例子所示的控制器类配置并登记管理。

然后当客户请求到达时,DispatcherServlet会根据请求的URL寻找能处理它的Handler,比如对于/welcome.html这样一个URL来讲,按照上面例子所示,目标Handler就会是WelcomeController bean组件,而真正的Handler调用,DispatcherServlet会使用SimpleControllerHandlerAdapter来进行,实际上就是执行目标控制器bean组件的方法handleRequest

源代码

源代码版本 Spring Web MVC 5.1.5.RELEASE

package org.springframework.web.servlet.mvc;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.lang.Nullable;
import org.springframework.web.servlet.HandlerAdapter;
import org.springframework.web.servlet.ModelAndView;

/**
 * Adapter to use the plain Controller workflow interface with
 * the generic org.springframework.web.servlet.DispatcherServlet.
 * Supports handlers that implement the LastModified interface.
 *
 * This is an SPI class, not used directly by application code.
 *
 */
public class SimpleControllerHandlerAdapter implements HandlerAdapter {

    // 仅仅支持实现了接口 Controller 的Handler
	@Override
	public boolean supports(Object handler) {
		return (handler instanceof Controller);
	}

	@Override
	@Nullable
	public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {

       // 调用目标 Handler 的处理逻辑,因为目标 Handler 实现了接口  Controller,所以这里只是简单地调用目标
       // Handler 的方法 handleRequest
		return ((Controller) handler).handleRequest(request, response);
	}

    // 对 LastModified 机制的支持
	@Override
	public long getLastModified(HttpServletRequest request, Object handler) {
		if (handler instanceof LastModified) {
			return ((LastModified) handler).getLastModified(request);
		}
		return -1L;
	}

}

参考文章

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值