• SpringMVC之HandlerMapping的使用


    上篇博客在了解SpringMVC的工作流程时留了一些疑问,今天先学习下HandlerMapping,在HandlerMapping中可以通过HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception;方法来获取HandlerExecutionChain,那它到底是什么东西呢?我们可以先看下日志.

     日志中用的例子还是JavaWeb之Eclipse中使用Maven构建SpringMVC项目 ,其实看日志能看出好多信息,在日志中可以找到黑框的信息。一个是通过AbstractHandlerMethodMapping将{[/index/hello.do]}映射到com.cyw.web.controller.IndexController.getTest方法上,第二个是通过AbstractUrlHandlerMapping将URL path [/**] 映射到handler 'org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler。这只是列了两种映射方法,我们可以查看api文档来找(百度出来好多教程,可能是版本原因,在找对应的类时有的找不到,还是看api文档准确一些)。

     从api可以看到,实现HandlerMapping接口的还挺多的,大部分的几个mapping都能在org.springframework.web.servlet.handler这个包中找到.如果不知道这些都是在哪使用可以直接选中右键->references->project,查看哪些地方有引用到它,至于这几个类之间的关系,可以看api介绍.下图是我自己画的UML类图(UNL好久没看了,今天在回来的路上看xml的内容突然意识到好像这博客画的有问题,回来又重新画了一个,箭头方向反了,不知道这个对不对,也希望不要误人子弟).

     下面就分别介绍这几个mapping的使用。

     1.RequestMappingHandlerMapping

    在上面的日志图中的第一个黑框中可以看到是通过AbstractHandlerMethodMapping来映射的,RequestMappingInfoHandlerMapping和AbstractHandlerMethodMapping都是抽象类,实际上最终还是用的RequestMappingHandlerMapping,它是用作使用注解的时候,通过注解将url映射到对应的Controller上。

    @Controller
    @RequestMapping("/index")
    public class IndexController {
        @RequestMapping(value="/index.do")
        
        public ModelAndView getTest(HttpServletRequest request,HttpServletResponse response){
            ModelAndView modelAndView = new ModelAndView("Index");
            String name=request.getQueryString();
            System.out.println(name);
            request.setAttribute("name", name+"abc");
            return modelAndView;
            
            }
    View Code

    2.BeanNameUrlHandlerMapping

    需要在spring-mvc.xml中配置BeanNameUrlHandlerMapping以及bean对应的Controller.Controller要实现AbstractController,通过bean将url映射的对应的Controller.

        <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
        <bean id="/hello" class="com.cyw.web.controller.HelloController"></bean>
    package com.cyw.web.controller;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.springframework.web.servlet.ModelAndView;
    import org.springframework.web.servlet.mvc.AbstractController;
    
    public class HelloController extends AbstractController {
    
        @Override
        protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response)
                throws Exception {
            
            return new ModelAndView("Hello");
        }
    
    }
    View Code

    3.SimpleUrlHandlerMapping

    顾名思义就是通过url直接映射。它有两种配置方式,还是用上面的hello.它通过url直接映射到对应的Controller上。

    1.prop key

        <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
           <property name="mappings">
            <props>
               <prop key="/hello.htm">helloController</prop>
             </props>
           </property>
        </bean>
        
        <bean id="helloController" 
            class="com.cyw.web.controller.HelloController" />

    2.value

        <bean id="helloController" 
            class="com.cyw.web.controller.HelloController" />
        <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
           <property name="mappings">
            <value>
               /*/welcome.htm=helloController
            </value>
           </property>
        </bean>

    上面只是简单了解了HandlerMapping的使用,其实里面还有好多,比如这几个mapping是怎么查找的,这个需要读源码来进一步学习。

  • 相关阅读:
    Android学习进程 Java引用 Rxjava MVP
    小试 Xcode 逆向:App 内存监控原理初探
    春招路上孤独的iOSer的心路历程(面经)
    【译】4个你需要知道的Asset Catalog的秘密
    超全!iOS 面试题汇总
    整理 iOS 9 适配中出现的坑(图文)
    旧版Xcode下载地址
    xcode 自动添加注释,生成文档
    NDK_ROOT找不到的解决方法 MACOS
    13个小技巧帮你征服Xcode
  • 原文地址:https://www.cnblogs.com/5ishare/p/8697240.html
Copyright © 2020-2023  润新知