• springmvc(2)处理器设配器和映射器


     非注解的处理器 映射器 和 适配器

    一.处理器映射器

     1.BeanNameUrlHandlerMapping

    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>

    Handler的实现:

    <!-- 配置Handler -->
    <bean name="/queryItems.action" class="com.MrChengs.controller.ItemsController"></bean>

     

     2.SimpleUrlHandlerMapping

    <!-- 处理器映射器2 -->
    <bean id="itemsController" class="com.MrChengs.controller.ItemsController"></bean>
    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <prop key="/queryItems1.action">itemsController</prop> <prop key="/queryItems2.action">itemsController</prop> </props> </property> </bean>

      

    此时可以访问一下两个都可以得到结果

    queryItems1.action
    queryItems2.action

     注意:   多个映射器可以并存,前端控制器判断能让那些映射器映射,就让正确的映射器处理。

     二.处理器适配器

     1.SimpleControllerHandlerAdapter

    <!-- 处理器适配器 -->
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>

    注意: 要求是编写的Handler必须实现Controller接口

    public class ItemsController implements Controller {
    ...
    }
    

      

    2.HttpRequestHandlerAdapter

    <!-- 处理器适配器2 -->
    <!-- 要求编写的Handler实现 HttpRequestHandler接口。 -->
    <bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"></bean>
    

      

     看源码:

     

    可以看出这个类需要实现 HttpRequestHandler 接口

    public class ItemsController2 implements HttpRequestHandler {
         @Override
         public void handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
               
               List<Items> itemsList = new ArrayList<Items>();
               //向list中填充静态数据
               
               Items items_1 = new Items();
               items_1.setName("手机");
               items_1.setPrice(6000f);
               items_1.setDetail("这是一个新的手机");
    //设置模型数据
               arg0.setAttribute("itemsList", itemsList);
               
               //设置转发视图
               arg0.getRequestDispatcher("/WEB-INF/jsp/items/itemsList.jsp").forward(arg0, arg1);
         }
    }

     在springmvc.xml

    <!-- 处理器适配器2 -->
    <!-- 要求编写的Handler实现 HttpRequestHandler接口。 -->
    <bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"></bean>
    <bean id="itemsController2" class="com.MrChengs.controller.ItemsController2"></bean>
    
    
    <bean  class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
         <property name="mappings">
               <props>
                    <prop key="/queryItems1.action">itemsController</prop>
                    <prop key="/queryItems2.action">itemsController</prop>
                    <prop key="/queryItems3.action">itemsController2</prop>
               </props>
         </property>
    </bean>

    访问上面红色的地址即可得到正确的答案!!

    使用此方法可以通过修改response,设置响应的数据格式,比如响应json数据
    response.setCharacterEncoding("utf-8");
    response.setContentType("application/json;charset=utf-8");
    response.getWriter().write("json串");

    关于DispatcherServlet.properties

    在springmvc中去除这些代码依然可以执行

    <!-- 处理器适配器 -->
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
    <!-- 处理器适配器2 -->
    <!-- 要求编写的Handler实现 HttpRequestHandler接口。 -->
    <bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"></bean>

    # Default implementation classes for DispatcherServlet's strategy interfaces.
    # Used as fallback when no matching beans are found in the DispatcherServlet context.
    # Not meant to be customized by application developers.
    org.springframework.web.servlet.LocaleResolver=org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver
    org.springframework.web.servlet.ThemeResolver=org.springframework.web.servlet.theme.FixedThemeResolver
    org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,
         org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping
    org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,
         org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,
         org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter
    org.springframework.web.servlet.HandlerExceptionResolver=org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver,
         org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver,
         org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver
    org.springframework.web.servlet.RequestToViewNameTranslator=org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator
    org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver
    org.springframework.web.servlet.FlashMapManager=org.springframework.web.servlet.support.SessionFlashMapManager
    在spring3.1之前使用org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping注解映射器。
     
    在spring3.1之后使用org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping注解映射器。
     
    在spring3.1之前使用org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter注解适配器。
     
    在spring3.1之后使用org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter注解适配器。

     注解的处理器映射器和适配器

     1.配置注解映射器/适配器

     在springmvc.xml文件

    <!-- 注解映射器 -->
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean>
    <!-- 注解适配器 -->
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean>
    <!--
    mvc:annotation-driven:
    代替上面注解映射器&注解适配器的配置
    其默认加载很多的参数绑定方法
    实际开发使用mvc:annotation-driven
    -->
    <mvc:annotation-driven></mvc:annotation-driven>

    2.Handler

    @Controller
    写在类的上面,标注其是一个注解
    @Controller
    public class ItemsController3{
         //商品查询
         @RequestMapping("/queryItemsByMapping")
         public ModelAndView queryItems() throws Exception{
               List<Items> itemsList = new ArrayList<Items>();
               //向list中填充静态数据
               
               Items items_1 = new Items();
               items_1.setName("手机");
               items_1.setPrice(6000f);
               items_1.setDetail("这是一个手机");
    
               itemsList.add(items_1);
    
               ModelAndView modelAndView = new ModelAndView();
               //相当于request的setAttribute
               modelAndView.addObject("itemsList", itemsList);
               
               //指定视图
               modelAndView.setViewName("/WEB-INF/jsp/items/itemsList.jsp");
               return modelAndView;
         }
    }
    //@RequestMapping实现 对queryItems方法和url进行映射,一个方法对应一个url
    //一般建议将url和方法写成一样

    3.在容器中加载Handler

    <!-- 对于注解的Handler可以单独配置 -->
    <!-- 建议使用组建扫描...... -->
    <context:component-scan base-package="com.MrChengs"></context:component-scan>

    测试时访问@RequestMapping("/queryItemsByMapping")中的queryItemsByMapping

    源码追踪一探究竟:

    小结:

    前端控制器配置:
    第一种:*.action,访问以.action结尾 由DispatcherServlet进行解析
    第二种:/,所以访问的地址都由DispatcherServlet进行解析,对于静态文件的解析需
          要配置不让DispatcherServlet进行解析使用此种方式可以实现 RESTful风格的url
    <mvc:annotation-driven></mvc:annotation-driven>可以代替下边的配置:
     
    <!--注解映射器 -->
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
    <!--注解适配器 -->
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/> 
    实际开实际开发使用:mvc:annotation-driven

    视图解析器配置前缀和后缀:

    <!-- 视图显示器 -->
    <!-- 解析jsp视图 -->
    <!-- 默认使用jstl的包 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
         <property name="prefix" value="/WEB-INF/jsp/items"></property>
         <property name="suffix" value=".jsp"></property>
    </bean>
    @Controller
    public class ItemsController3{
    
         @RequestMapping("/queryItemsByMapping")
         public ModelAndView queryItems() throws Exception{
        
    ...... //指定视图 modelAndView.setViewName("/itemsList"); return modelAndView; } }

      

    到这里基本的就结束了...

  • 相关阅读:
    枚举与常量需要注意的一个问题
    parted分区用法
    Linux下常用服务的端口号
    NFS服务
    mount用法
    Rsync服务部署
    常见的RAID级别
    SQL注入语句 (很全)
    数据库被注入daxia123或cn.jxmmtv.com原因及解决办法
    StringTemplate.net模板技术用法
  • 原文地址:https://www.cnblogs.com/Mrchengs/p/9940491.html
Copyright © 2020-2023  润新知