SpringMVC中的handlerMappings对象用法

介绍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日

相关文章

  • 手把手带你入门 Spring Security的具体流程

    下面我将详细讲解“手把手带你入门 Spring Security的具体流程”的攻略,包含以下几个步骤: 步骤一:添加依赖 首先,在pom.xml文件中添加Spring Security的依赖,如下所示: <dependency> <groupId>org.springframework.security</groupId>…

    Java 2023年5月20日
    00
  • java实现周期性执行(定时任务)

    实现周期性执行(定时任务)的方法有很多,其中比较常用的方式是使用Java中的ScheduledExecutorService,下面是完整的攻略: 步骤一:引入依赖 在项目中引入ScheduledExecutorService的依赖,可以使用Maven来管理依赖,添加以下依赖到pom.xml文件中: <dependency> <groupId…

    Java 2023年5月20日
    00
  • java 将 list 字符串用逗号隔开拼接字符串的多种方法

    下面是详细讲解“java 将 list 字符串用逗号隔开拼接字符串的多种方法”的完整攻略: 1. 使用 StringJoiner 在 Java 8 中新增了 StringJoiner 类,可以方便地将集合中的元素用指定的分隔符拼接成字符串。示例代码如下: List<String> list = new ArrayList<>(); l…

    Java 2023年5月27日
    00
  • 详解简单基于spring的redis配置(单机和集群模式)

    以下是完整的攻略: 详解简单基于Spring的Redis配置(单机和集群模式) 本文将为你讲解如何在Spring中配置Redis,包括单机和集群模式,帮助你快速上手。 1. 依赖引入 首先,需要在Maven或Gradle中添加Redis的依赖,下面是Maven的配置: <dependency> <groupId>org.springf…

    Java 2023年5月26日
    00
  • Java窗体动态加载磁盘文件的实现方法

    Java窗体动态加载磁盘文件是一种实现动态性的方法,常见于文件管理系统的开发中。下面给出相关的攻略和两个实例供参考。 准备工作 在实现 Java 窗体动态加载磁盘文件之前,需要进行以下准备工作: 在 Java 中使用 Swing 框架创建一个 JFrame 窗体,用于显示所加载的文件内容。 确认所加载的文件的存放位置,例如文件夹的路径为 “D:\test”,…

    Java 2023年5月20日
    00
  • Java如何判断整数溢出,溢出后怎么得到提示

    Java中整数类型(int, long等)变量的范围是有限的,当一个变量的数值超出了它的范围时,就会发生整数溢出。溢出的结果与数值运算的结果不同,可能导致程序运行异常,所以我们需要在程序中判断整数是否溢出,并得到提示以确保程序的正确性。 判断整数溢出的方法是通过与最值的比较来实现的。以int类型的整数为例,最大值为2^31-1(即2147483647),最小…

    Java 2023年5月25日
    00
  • 详解Java中的Lambda表达式

    详解Java中的Lambda表达式完整攻略 概述 Lambda表达式是Java 8的重要特性,它可以让代码更加简洁易懂。它允许我们使用一种新的简洁语法来定义匿名内部类,从而更容易地编写具有函数式风格的代码。 Lambda表达式的语法 Lambda表达式的语法非常简单。它由一个箭头符号“->”(英文的“right arrow”)组成,左边是参数列表,右边…

    Java 2023年5月26日
    00
  • MVC默认路由实现分页(PagerExtend.dll下载)

    我来给你讲解一下“MVC默认路由实现分页(PagerExtend.dll下载)”的完整攻略。 简介 在MVC项目中,实现分页功能是非常常见的需求。PagerExtend.dll是一个实现分页的工具库,它可以帮助我们在MVC项目中快速地实现分页功能。 使用步骤 1. 下载PagerExtend.dll 首先,我们需要从官网或者其他可靠来源下载PagerExte…

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