【SpringMVC框架】非注解的处理器映射器和适配器

来源:互联网 发布:移动网络投诉处理 编辑:程序博客网 时间:2024/04/27 07:11
非注解的处理器映射器和适配器

1.非注解的处理器映射器
之前的处理器映射器:
org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping
[html] view plain copy
  1. <!-- 配置Handler -->  
  2.     <bean name="/queryItems_test.action" class="cn.edu.hpu.ssm.controller.ItemsController1" />  
  3.     <!-- 配置另外一个Handler -->  
  4.       
  5.     <!-- 处理器映射器 将bean的name作为url进行查找 ,需要在配置Handler时指定beanname(就是url)   
  6.     所有的映射器都实现 HandlerMapping接口。  
  7.     -->  
  8.     <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />  

介绍另一个映射器:
org.springframework.web.servlet.handler.SimpleUrlHandlerMapping
[html] view plain copy
  1. <!-- 配置Handler -->  
  2.     <bean id="itemsController1" name="/queryItems_test.action" class="cn.edu.hpu.ssm.controller.ItemsController1" />  
  3.     <!-- 配置另外一个Handler -->  
  4.       
  5.     <!-- 处理器映射器 将bean的name作为url进行查找 ,需要在配置Handler时指定beanname(就是url)   
  6.     所有的映射器都实现 HandlerMapping接口。  
  7.     -->  
  8.     <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />  
  9.       
  10.     <!--简单url映射  -->  
  11.     <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">  
  12.         <property name="mappings">  
  13.             <props>  
  14.                 <!-- 对itemsController1进行url映射,url是/queryItems1.action,1个bean可以配多个url -->  
  15.                 <prop key="/queryItems1.action">itemsController1</prop>  
  16.                 <prop key="/queryItems2.action">itemsController1</prop>  
  17.         </property>  
  18.     </bean>  

现在同时存在两个映射器,我们分别进行测试,发现访问/queryItems_test.action与访问/queryItems1.action与/queryItems2.action都可以得到正确视图

说明:
多个映射器可以并存,前端控制器判断url能让哪些映射器映射,就让正确的映射器处理。

2.非注解的处理器适配器
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter
要求编写的Handler实现 Controller接口。
[html] view plain copy
  1. <!-- 处理器适配器   
  2.     所有的处理器适配器都实现HandlerAdapter接口-->  
  3. <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />  

org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter
要求编写的Handler实现 HttpRequestHandler接口。 
[html] view plain copy
  1. <!-- 另一个非注解的适配器 -->  
  2. <bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"/>  
ItemsController2:
[html] view plain copy
  1. package cn.edu.hpu.ssm.controller;  
  2.   
  3. import java.io.IOException;  
  4. import java.util.ArrayList;  
  5. import java.util.List;  
  6.   
  7. import javax.servlet.ServletException;  
  8. import javax.servlet.http.HttpServletRequest;  
  9. import javax.servlet.http.HttpServletResponse;  
  10.   
  11. import org.springframework.web.HttpRequestHandler;  
  12.   
  13. import cn.edu.hpu.ssn.po.Items;  
  14.   
  15. //实现Contorller接口的适配器  
  16. public class ItemsController2 implements HttpRequestHandler{  
  17.   
  18.   
  19.     @Override  
  20.     public void handleRequest(HttpServletRequest request, HttpServletResponse response)  
  21.             throws ServletException, IOException {  
  22.           
  23.         //调用Service查找数据库,查询商品列表,这里使用静态数据模拟  
  24.         List<Items> itemsList=new ArrayList<Items>();  
  25.         //向List中填充静态数据  
  26.         Items items_1 = new Items();  
  27.         items_1.setName("联想笔记本");  
  28.         items_1.setPrice(6000f);  
  29.         items_1.setDetail("ThinkPad T430 联想笔记本电脑!");  
  30.           
  31.         Items items_2 = new Items();  
  32.         items_2.setName("苹果手机");  
  33.         items_2.setPrice(5000f);  
  34.         items_2.setDetail("iphone6苹果手机!");  
  35.           
  36.         itemsList.add(items_1);  
  37.         itemsList.add(items_2);  
  38.           
  39.         //设置模型数据  
  40.         request.setAttribute("itemsList",itemsList);  
  41.           
  42.         //设置转发视图  
  43.         request.getRequestDispatcher("/WEB-INF/jsp/items/itemsList.jsp").forward(request, response);  
  44.     }  
  45. }  

测试:
先别忘记在springmvc.xml中配置Handler和处理器映射器
[html] view plain copy
  1. <!-- 配置另外一个Handler -->  
  2.     <bean id="itemsController2" class="cn.edu.hpu.ssm.controller.ItemsController2" />  
  3.   
  4. <!--简单url映射  -->  
  5.     <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">  
  6.         <property name="mappings">  
  7.             <props>  
  8.                 <!-- 对itemsController1进行url映射,url是/queryItems1.action,1个bean可以配多个url -->  
  9.                 <prop key="/queryItems1.action">itemsController1</prop>  
  10.                 <prop key="/queryItems2.action">itemsController1</prop>  
  11.                 <prop key="/queryItems3.action">itemsController2</prop>  
  12.             </props>  
  13.         </property>  
  14.     </bean>  

测试结果如图

新处理器适配器运行结果



//使用此方法可以通过修改response,设置响应的数据格式,比如响应json数据
[html] view plain copy
  1. <pre name="code" class="java">response.setCharacterEncoding("utf-8");  
  2. response.setContentType("application/json;charset=utf-8");  
  3. response.getWriter().write("json串");  

现在脑子里应该慢慢清晰起来,处理器映射器就是根据URL来找Handler,处理器适配器就是按照它要求的规则(handler instanceof XXX接口)去执行Handler。但是我们发现有些麻烦的就是,一个Handler类中都是一个方法。下次我们就来说注解的映射器和适配器。

4.DispatcherSerlvet.properties

通过以前咱们写的样例,会发现,多个适配器和多个映射器可以并存但是其实你不在springmvc.xml中配置适配器,也可以正常运行程序。因为在SpringMVC的jar包中含有一个默认配置文件,如果没有在springmvc.xml配置,就默认使用DispatcherSerlvet.properties的配置如图

打开DispatcherSerlvet.properties:

[plain] view plain copy
  1. # Default implementation classes for DispatcherServlet's strategy interfaces.  
  2. # Used as fallback when no matching beans are found in the DispatcherServlet context.  
  3. # Not meant to be customized by application developers.  
  4.   
  5. org.springframework.web.servlet.LocaleResolver=org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver  
  6.   
  7. org.springframework.web.servlet.ThemeResolver=org.springframework.web.servlet.theme.FixedThemeResolver  
  8.   
  9. org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\  
  10. org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping  
  11.   
  12. org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\  
  13.     org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\  
  14.     org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter  
  15.   
  16. org.springframework.web.servlet.HandlerExceptionResolver=org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver,\  
  17.     org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver,\  
  18.     org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver  
  19.   
  20. org.springframework.web.servlet.RequestToViewNameTranslator=org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator  
  21.   
  22. org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver  
  23.   
  24. org.springframework.web.servlet.FlashMapManager=org.springframework.web.servlet.support.SessionFlashMapManager  

可以看到,其中BeanNameUrlHandlerMapping和HttpRequestHandlerAdapter咱们之前都用到过,

这些都是非注解的处理器映射器和适配器,那些DefaultAnnotationHandlerMapping、AnnotationMethodHandlerAdapter都是注解的处理器映射器和适配器

前端控制器从上边的文件中加载处理映射器、适配器、视图解析器等组件,如果不在springmvc.xml中配置,使用默认加载的。
0 0