SpringMVC中的handlerMappings对象用法

yizhihongxing

介绍SpringMVC中的handlerMappings对象用法的完整攻略如下:

什么是handlerMappings对象

handlerMappings对象是Spring MVC中的一个重要组件,负责将请求映射到对应的控制器处理器(handler)上。它是一个接口,定义了获取HandlerExecutionChain对象的方法。

HandlerExecutionChain对象是什么

HandlerExecutionChain对象是包装HandlerMethod对象的容器对象。它包含了处理器的所有拦截器对象,并提供了执行拦截器和执行处理器的方法。

如何使用handlerMappings对象

在SpringMVC中使用handlerMappings对象的过程如下:

第一步:在配置文件中定义handlerMappings对象

在SpringMVC的配置文件中定义handlerMappings对象。可以使用DefaultAnnotationHandlerMapping作为handlerMappings对象的实现,该实现会扫描所有带有@Controller注解的Bean,找到其中带有@RequestMapping注解的方法,并将其注册为处理请求的handler。

例如,在SpringMVC配置文件中进行如下配置:

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>

第二步:将handlerMappings对象注入到DispatcherServlet中

在DispatcherServlet中定义一个handlerMappings属性,并添加@Autowired注解注入handlerMappings对象。

例如,在DispatcherServlet配置文件中进行如下配置:

<bean class="org.springframework.web.servlet.DispatcherServlet">
        <property name="handlerMappings">
            <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
        </property>
</bean>

第三步:使用handlerMappings对象

通过handlerMappings对象的getHandler方法获取对应的HandlerExecutionChain对象。然后,可以使用HandlerExecutionChain对象的getInterceptors方法获取所有的拦截器对象,使用execute方法执行拦截器和处理器对象。

例如,在处理请求时可以进行如下代码编写:

HandlerExecutionChain chain = handlerMappings.getHandler(request);
Object handler = chain.getHandler();

if (handler instanceof HandlerMethod) {
    HandlerMethod handlerMethod = (HandlerMethod) handler;

    // 获取拦截器列表
    List<Object> interceptors = chain.getInterceptors();

    // 执行拦截器
    for (Object interceptor : interceptors) {
        ((HandlerInterceptor) interceptor).preHandle(request, response, handlerMethod);
    }

    // 执行处理器
    ModelAndView mav = handlerAdapter.handle(request, response, handlerMethod);

    // 执行拦截器
    for (Object interceptor : interceptors) {
        ((HandlerInterceptor) interceptor).postHandle(request, response, handlerMethod, mav);
    }
}

示例

下面提供两个示例说明handlerMappings对象的使用:

示例一:全局拦截器

使用handlerMappings对象定义一个全局拦截器,拦截所有请求,并在拦截前后输出日志。

  1. 在SpringMVC配置文件中定义handlerMappings对象
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
  1. 将handlerMappings对象注入到DispatcherServlet中
<bean class="org.springframework.web.servlet.DispatcherServlet">
        <property name="handlerMappings">
            <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
        </property>
        <property name="interceptors">
            <list>
                <bean class="com.example.interceptor.LogInterceptor"/>
            </list>
        </property>
</bean>
  1. 定义一个全局拦截器
public class LogInterceptor implements HandlerInterceptor {

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("before handling request");
        return true;
    }

    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
                           ModelAndView modelAndView) throws Exception {
        System.out.println("after handling request");
    }

}

示例二:动态添加handlerMappings对象

动态添加一些handlerMappings对象,将不同的请求映射到不同的处理器上。

  1. 创建handlerMappings对象
public class TestHandlerMapping extends AbstractUrlHandlerMapping {

    private Map<String, Object> handlerMap;

    public TestHandlerMapping() {
        handlerMap = new HashMap<>();
        handlerMap.put("/test1", new Test1Controller());
        handlerMap.put("/test2", new Test2Controller());
    }

    protected Object getHandlerInternal(HttpServletRequest request) throws Exception {
        String requestUri = getUrlPathHelper().getLookupPathForRequest(request);
        return handlerMap.get(requestUri);
    }

}
  1. 在SpringMVC配置文件中动态添加handlerMappings对象
<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
        <property name="targetObject">
            <bean class="org.springframework.web.servlet.DispatcherServlet"
                  init-method="initServletBean">
                <property name="handlerMappings">
                    <list>
                        <bean class="com.example.handler.TestHandlerMapping"/>
                    </list>
                </property>
            </bean>
        </property>
        <property name="targetMethod" value="onRefresh"/>
    </bean>

这个示例中,我们动态创建了一个TestHandlerMapping对象,并将其添加到DispatcherServlet的handlerMappings列表中。该TestHandlerMapping对象会根据请求的URI动态选择一个处理器进行处理。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringMVC中的handlerMappings对象用法 - Python技术站

(0)
上一篇 2023年6月15日
下一篇 2023年6月15日

相关文章

  • 使用异步controller与jQuery实现卷帘式分页

    下面我来详细讲解如何使用异步controller与jQuery实现卷帘式分页的完整攻略。 什么是卷帘式分页? 卷帘式分页是一种网页分页的效果。就是当我们向下滑动网页的时候,在页面底部会自动加载新的内容,实现不间断的加载效果,类似于卷帘拉开的效果。这种效果可以让用户更加流畅地查看网页内容,提高用户体验。 使用异步controller实现卷帘式分页 异步cont…

    Java 2023年5月19日
    00
  • SpringBoot浅析安全管理之Shiro框架

    SpringBoot浅析安全管理之Shiro框架指南 简介 Shiro 是一个强大且易用的 Java 安全框架,提供身份验证、授权、加密和会话管理等功能,可以相对简单地集成到你的应用中,并提供了灵活的配置选项。在 Spring Boot 应用中使用 Shiro,可以提供全面的安全保护,并为开发人员提供便利的开发体验。 Shiro 核心概念 Shiro 包含以…

    Java 2023年5月20日
    00
  • Mac环境下配置tomcat的步骤详解

    以下是 Mac 环境下配置 Tomcat 的完整攻略步骤: 一、下载 Tomcat 首先,进入 Apache 官网,下载适合你操作系统的 Tomcat 版本。下载地址:http://tomcat.apache.org/download 二、解压 Tomcat 下载完成后,将文件解压到你希望的目录。在这里以解压到 “/Applications/” 目录下为例 …

    Java 2023年5月20日
    00
  • JAVA如何获取客户端IP地址和MAC地址

    获取客户端IP地址和MAC地址是Java开发中经常用到的技巧,下面将详细介绍如何实现。 获取客户端IP地址 在Java中获取客户端IP地址需要先获取请求头中的IP地址,然后通过这个IP地址去判断客户端具体的位置。以下是获取IP地址的代码: // 获取HttpServletRequest对象 HttpServletRequest request = (Http…

    Java 2023年5月26日
    00
  • 教你如何架设个人服务器——全教程

    教你如何架设个人服务器——全教程 介绍 在本文中,我们将教你如何架设个人服务器。为什么要架设个人服务器呢?因为架设个人服务器可以让你自由地管理自己的网络服务,比如搭建自己的网站、文件云存储等等。不仅如此,架设个人服务器还可以帮助你锻炼技术能力,提高自己的技术水平。 步骤 步骤一:选购服务器 首先你需要选购一台服务器,可以考虑云服务器、独立服务器等不同的类型。…

    Java 2023年6月15日
    00
  • Eclipse与MySQL数据库的连接教程(已实操)

    Eclipse与MySQL数据库的连接教程包括以下步骤: 步骤1:下载安装Eclipse 首先需要从Eclipse官方网站下载最新版本的Eclipse IDE包,并进行安装。在安装时需要选择Java开发工具包(JDK)以便进行Java项目的开发。 步骤2:下载安装MySQL数据库 可从MySQL官网下载最新版本的MySQL数据库,并进行安装。在安装时要注意设…

    Java 2023年6月16日
    00
  • Java多线程环境下SimpleDateFormat类安全转换

    Java多线程环境下的SimpleDateFormat类转换是一个非常常见的问题。如果在多线程环境下不正确使用SimpleDateFormat类,可能会导致线程安全问题,例如线程安全问题、SimpleDateFormat线程不安全等等。因此,正确地使用SimpleDateFormat类对于Java程序员来说至关重要。下面是一个完整的攻略,包括示例说明。 1.…

    Java 2023年6月1日
    00
  • JDK、J2EE、J2SE、J2ME四个易混淆概念区分

    JDK、J2EE、J2SE、J2ME 四个概念都指代着Java平台,并且在实际开发中经常被提到,但是这四个概念都涉及到的范围不同。在使用Java进行开发时,理解四者的差异和联系非常重要。下面是对这四个概念的详细讲解: JDK JDK(Java Development Kit)是Java平台的标准开发工具包,包含了Java编程所需的完整的开发环境(JRE、Ja…

    Java 2023年5月24日
    00
合作推广
合作推广
分享本页
返回顶部