TA的每日心情  | 开心 2021-12-13 21:45 | 
|---|
 
  签到天数: 15 天 [LV.4]偶尔看看III  
 | 
 
| 
 
 上篇博客在了解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类图(UML大学学了好久没用,不知道画的对不对,不对请指出).  
   
 下面就分别介绍这几个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是怎么查找的,这个需要读源码来进一步学习。 |   
 
 
 
 |