目录
非注解的处理器映射器
处理器映射器
,可以配置多个,前端控制器
会去判断,具体使用哪一个 映射器
;
判断过程我猜测应该是:拿到 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);
}