• (三)非注解的处理器映射器和适配器


    目录


    非注解的处理器映射器

    处理器映射器,可以配置多个,前端控制器 会去判断,具体使用哪一个 映射器

    判断过程我猜测应该是:拿到 url 的时候,先去找 BeanNameUrlHandlerMapping 看看有没有处理器的名字,是这个 url 的;没有的话,就去找 SimpleUrlHandlerMapping ,看它那里有没有 key 是这个 url 的 ;

    这里就配置了 2个,其中 SimpleUrlHandlerMapping 、BeanNameUrlHandlerMapping 都是 非注解的处理器映射器

    BeanNameUrlHandlerMapping 映射器,是根据注册处理器的时候,配置的 name 属性进行映射的 ;

    SimpleUrlHandlerMapping 映射器,是根据统一管理处理器的时候,配置的 key 属性进行映射的 ;使用 SimpleUrlHandlerMapping,一个处理器,可以配置多个 url ;

    
        <!--配置适配器映射器-->
        <!--bean的名字,就是映射 map 中的键 -->
        <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
    
        <!--可以配置多个映射器-->
        <!--这个映射器可以对处理器进行集中管理-->
        <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
            <property name="mappings">
                <props>
                    <!--key 就是url地址 ; 后面是处理器的id-->
                    <prop key="/queryItems.action">itemsController</prop>
                </props>
            </property>
        </bean>
    

    坑点:使用 SimpleUrlHandlerMapping 在里面进行配置 处理器 的时候,当新增加处理器的时候,服务器必须进行重启,热部署不行!!

    所有的 映射器 都实现了 HandlerMapping 接口 !


    非注解的处理器适配器

    1. SimpleControllerHandlerAdapter 适配器,处理实现了 controller 接口的处理器 ;

      查看源码可以得知:

      public class SimpleControllerHandlerAdapter implements HandlerAdapter {
      
          // 处理实现了 Controller 接口的处理器
          @Override
          public boolean supports(Object handler) {
              return (handler instanceof Controller);
          }
          .....
      }
      

    2. HttpRequestHandlerAdapter 适配器,处理实现了 HttpRequestHandler 接口的处理器 ;

      查看源码可以得知:

      public class HttpRequestHandlerAdapter implements HandlerAdapter {
      
          // 处理实现了 HttpRequestHandler 接口的处理器
          @Override
          public boolean supports(Object handler) {
              return (handler instanceof HttpRequestHandler);
          }
      

    前端控制器,去调用 处理器适配器,执行具体 处理器,过程应该是根据这些 接口 来判断调用请求哪一个 处理器适配器 的 ;

    所有的 适配器 都实现了 HandlerAdapter 接口 !


    自定义处理器(HttpRequestHandler

    前面讲过实现 Controller 接口的处理器,现在说下实现 HttpRequestHandler 接口的处理器 ;

    跟我们之前学的原始的 servlet 差不多写法 ;

    public class ItemsController2 implements HttpRequestHandler {
    
        @Override
        public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
            List<Item> items = new ArrayList<>() ;
            Item item1 = new Item();
            item1.setId(1);
            item1.setName("锋麦笔记本");
            Item item2 = new Item();
            item2.setId(999);
            item2.setName("牛奶");
    
            items.add(item1) ;
            items.add(item2) ;
    
    //        下面跟学servlet时候一样,进行转发给 jsp
    //        使用这种方法,虽然了看着不如使用 ModelAndView 但是可以进行控制返回数据格式
    //        比如返回 json ;
    
            request.getRequestDispatcher("/WEB-INF/jsp/Item/ItemController.jsp").forward(request,response);
        }
  • 相关阅读:
    暑假周总结02
    音乐播放器
    setInterval、控制停止和继续
    暑假周总结01
    ul li、a标签的下划线
    innerHTML、document获取对象、className修改样式
    领扣(LeetCode)N叉树的层序遍历 个人题解
    领扣(LeetCode)两句话中的不常见单词 个人题解
    领扣(LeetCode)二叉树的中序遍历 个人题解
    领扣(LeetCode)用队列实现栈 个人题解
  • 原文地址:https://www.cnblogs.com/young-youth/p/11665662.html
Copyright © 2020-2023  润新知