(三)非注解的处理器映射器和适配器
目录
非注解的处理器映射器
处理器映射器,可以配置多个,前端控制器 会去判断,具体使用哪一个 映射器 ;
判断过程我猜测应该是:拿到 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 接口 !
非注解的处理器适配器
SimpleControllerHandlerAdapter适配器,处理实现了controller接口的处理器 ;查看源码可以得知:
public class SimpleControllerHandlerAdapter implements HandlerAdapter { // 处理实现了 Controller 接口的处理器 @Override public boolean supports(Object handler) { return (handler instanceof Controller); } ..... }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);
}

浙公网安备 33010602011771号