spring-mvc入门之映射处理器

来源:互联网 发布:嵌入式软件培训机构 编辑:程序博客网 时间:2024/04/27 22:55

spring-mvc入门:映射处理器

handlerMapping的工作就是为每个请求找到合适的处理器handler.


一、

BeanNameUrlHandlerMapping: 查找spring容器中和请求的url同名的bean.这个映射器不需要配置,因为spring在找不到handlerMapping的情况下会使用BeanNameUrlHandlerMapping.如果一定要配置,像下面这样就行了:

《bean class=“org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping” /》

比如有一个请求/index.htm, 则就会找到一个名叫/index.htm的bean来处理这个请求; 这种做法让我们可以做出虚拟目录的效果:

《bean name=“/user/index.htm” class=“controller.TestController” /》

《bean name=“/admin/index.htm” class=“controller.TestController” /》

二、

SimpleUrlHandlerMapping: 这个handlerMapping可以配置请求的url和handler的映射关系。

view plaincopy to clipboardprint?

《bean id=“urlMapping” class=“org.springframework.web.servlet.handler.SimpleUrlHandlerMapping”》

《property name=“mappings”》

《props》

《prop key=“/project.htm”》projectController《/prop》

《prop key=“/manage.htm”》managementController《/prop》

《prop key=“/user.htm”》userController《/prop》

《prop key=“/upload.htm”》fileUploadController《/prop》

《/props》

《/property》

《/bean》

《bean id=“urlMapping” class=“org.springframework.web.servlet.handler.SimpleUrlHandlerMapping”》

《property name=“mappings”》

《props》

《prop key=“/project.htm”》projectController《/prop》

《prop key=“/manage.htm”》managementController《/prop》

《prop key=“/user.htm”》userController《/prop》

《prop key=“/upload.htm”》fileUploadController《/prop》

《/props》

《/property》

《/bean》

前面提到了DiapatcherServlet查询handlerMapping获得handler,handlerMapping事实上返回的是HandlerExecutionChain,HandlerExecutionChain里面的interceptor正是在handlerMapping中配置的:


《bean id=“urlMapping” class=“org.springframework.web.servlet.handler.SimpleUrlHandlerMapping”》

《property name=“interceptors”》

《list》

《ref bean=“localeChangeInterceptor”/》

《ref bean=“someOtherCheckInterceptor”/》

《/list》

《/property》

《property name=“mappings”》

《props》

《prop key=“/project.htm”》projectController《/prop》

《prop key=“/manage.htm”》managementController《/prop》

《prop key=“/user.htm”》userController《/prop》

《prop key=“/upload.htm”》fileUploadController《/prop》

《/props》

《/property》

《/bean》

三、

ControllerClassNameHandlerMapping 

使用CoC,惯例优先原则(conventionoverconfiguration)的方式来配置SpringMVC可以帮我们声明Controller的时候省下很多功夫。

只要我们的Controller是以XXXController的方式命名的话就可以使用到CoC带来的好处。

例如,对于普通的Controller(非MultiActionController),CoC帮我们做以下的映射:

HomeController映射到/home*请求URL

DisplayShoppingCartController映射到/displayshoppingcart*请求URL

注意:应该映射成使用全部小写的请求URL

对与MultiActionController,映射规则如下:

例如,我有一个UserInfoController,里面有一个方法valid,那么就会映射成/userinfo/valid.do(.do对应你设置的dispatcher-servlet的url-pattern)。

使用CoC带来的好处就是我们不需要再忍受必须先定义它们,然后还要维护冗长的SimpleUrlHandlerMapping的枯燥。

规则就这么多,以下是配置。

1.dispatcher-servlet.xml配置:


  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4. xmlns:p="http://www.springframework.org/schema/p"  
  5. xmlns:tx="http://www.springframework.org/schema/tx"  
  6. xmlns:context="http://www.springframework.org/schema/context"  
  7. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
  8. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd         
  9. http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">  
  10.   
  11.     <!-- ControllerClassNameHandlerMapping用于匹配我们的Controller -->     
  12. <bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping" />  
  13.   
  14. <!-- 使用annocation创建Controller的bean -->  
  15. <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>       
  16. <!-- Controller的包,使容器启动的时候可以找的并实例化Controller -->  
  17. <context:component-scan base-package="test.controller"/>  
  18.   
  19.     <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"   
  20. p:prefix="/WEB-INF/jsp/" p:suffix=".jsp"/>      
  21. </beans>  


 

2.编写我们的Controller:


  1. package test.controller;  
  2.   
  3. import java.io.PrintWriter;  
  4. import javax.servlet.http.HttpServletRequest;  
  5. import javax.servlet.http.HttpServletResponse;  
  6. import org.springframework.stereotype.Controller;  
  7. import org.springframework.web.bind.annotation.RequestMapping;  
  8. import org.springframework.web.servlet.mvc.multiaction.MultiActionController;  
  9.   
  10. @Controller  
  11. public class MYController extends MultiActionController {  
  12.   
  13. @RequestMapping  
  14. public void test(HttpServletRequest request,   
  15. HttpServletResponse response){  
  16. PrintWriter out = null;  
  17. try {  
  18. out = response.getWriter();              
  19. out.println("ok");  
  20. }catch(Exception e) {  
  21. out.println("not ok");     
  22. }finally {  
  23. out.close();  
  24. }      
  25. }       
  26.   
  27. }  


 

这里我们可以看到,我们只需要在class前面声明@Controller,方法前面声明@RequestMapping就可以了,其他什么都不需要自己配置,最后使用地址/my/test.do就可以调用了。

另外,如果你想对这些使用 ControllerClassNameHandlerMapping匹配的Controller使用拦截器的话,只需要为 ControllerClassNameHandlerMapping bean的interceptors list注入拦截器就可以了:


  1.     <bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping">  
  2. <property name="interceptors">  
  3. <list>  
  4. <ref bean="myInter" />  
  5. </list>  
  6. </property>          
  7. </bean>      
  8. <bean id="myInter" class="test.MyInter" />