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

目录


非注解的处理器映射器

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

判断过程我猜测应该是:拿到 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);
    }
原文地址:https://www.cnblogs.com/young-youth/p/11665662.html