• 处理器映射器(HandlerMapping)及处理器适配器(HandlerAdapter)详解(一)


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

      处理器映射器:

      第一种: BeanNameUrlHandlerMapping

    <!-- 配置Handler -->
    <bean id="userController1" name="/queryUsers.action" class="com.bjxb.ssm.controller.UserController" />
    
    <!-- 处理器映射器 将bean的name作为url进行查找, bean就是我们写的Handler,所以我们需要在配置Handler时指定beanname(就是url) -->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />

      第二种:SimpleUrlHandlerMapping

    <!-- 配置Handler 实现 Controller 接口 的 Handler
      既有 name 属性 可以让 BeanNameUrlHandlerMapping 处理器映射器 映射到,
      又有 id
    属性 可以在 SimpleUrlHandlerMapping 处理器映射器 中进行映射-->
    <bean id="userController1" name="/queryUsers.action" class="com.bjxb.ssm.controller.UserController" />
    
    <!-- 配置Handler,实现 HttpRequestHandlerAdapter 接口 的 Handler -->
    <bean id="userController2" class="com.bjxb.ssm.controller.UserController2"/>
    
    <!-- 简单URL映射 -->
    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <!-- 对userController1进行URL映射,URL是/queryUsers.action
                    同一个Bean可以有多个URL与之映射
                 -->
                <prop key="/queryUsers1.action">userController1</prop>
                <prop key="/queryUsers2.action">userController1</prop>
                <prop key="/queryUsers3.action">userController2</prop>
            </props>
        </property>
    </bean> 

      

      注意:上面两种处理器映射器,我们是在同一个 xml 文件中配置,并且根据不同的 URL 都能正常访问。

      结论:多个处理器映射器可以并存,前端控制器判断 URL 能让哪些映射器映射,从中选择正确的映射器处理。

      非注解的适配器:

      第一种:SimpleControllerHandlerAdapter

    <!-- 处理器适配器 所有的处理器适配器都实现 HandlerAdapter接口 
                  这里我们使用SimpleControllerHandlerAdapter 处理器适配器
     -->
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />

       

       注意:这款适配器要求我们编写的 Handler 实现 Controller 接口

      

      Handler如下:

    public class UserController implements Controller{
    
        @Override
        public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
            
            ArrayList<User> userlist = new ArrayList<User>();
            User user1 = new User("腾博","123456");
            User user2 = new User("小兵","123456");
            System.out.println("我来了");
            userlist.add(user1);
            userlist.add(user2);
            
            // 返回ModelAndView
            ModelAndView modelAndView = new ModelAndView();
            // 相当于request的setAttribute,在jsp页面中通过userlist取数据
            modelAndView.addObject("userlist", userlist);
            
            // 指定视图
            modelAndView.setViewName("/WEB-INF/jsp/users/user.jsp");
            
            return modelAndView;
        }
        
    }

      第二种:HttpRequestHandlerAdapter

    <!-- 另一个非注解的处理器适配器 HttpRequestHandlerAdapter -->
    <bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"/>

       注意:这款适配器要求我们编写的 Handler 实现 HttpRequestHandler 接口

     

        

        Handler如下

    public class UserController2 implements HttpRequestHandler{
    
        @Override
        public void handleRequest(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            ArrayList<User> userlist = new ArrayList<User>();
            User user1 = new User("腾博","123456");
            User user2 = new User("小兵","123456");
            System.out.println("我来了");
            userlist.add(user1);
            userlist.add(user2);
            
            // 设置模型数据
            request.setAttribute("userlist", userlist);
            
            // 设置转发的视图
            request.getRequestDispatcher("/WEB-INF/jsp/users/user.jsp").forward(request, response);
            
            // 使用此接口,我们可以通过修改response,设置响应的数据格式,比如响应json数据
            // response.setCharacterEncoding("utf-8");
            // response.setContentType("application/json;charset=utf-8");
            // response.getWriter().write("json串");
        }
        
    }

      经过上面的分析我们发现:

        处理器映射器就是:根据我们的 URL 寻找 Handler
        处理器适配器就是:按照它要求的规则去执行 Handler

        而且我们发现:非注解形式的 HandlerMapping 和 HandlerAdapter 所对应的 Handler,一个类中只有一个方法,处理能力有限,比较繁琐

  • 相关阅读:
    【设计模式】6.模板方法模式
    【设计模式】5.原型模式
    【设计模式】4.工厂模式
    【设计模式】3.代理模式
    zookeeper集群的搭建
    zookeeper实现分布式锁的原理和一个小例子
    zookeeper配置管理实现原理----监听事件watch
    zookeeper的javaAPI操作(基于Curator的CRUD)
    java.lang.IllegalArgumentException: A HostProvider may not be empty!
    Zookeeper的安装和基本操作
  • 原文地址:https://www.cnblogs.com/xb1223/p/10185280.html
Copyright © 2020-2023  润新知