02_springmvc处理器映射器和适配器(补充)

一.非注解的处理器映射器

HandlerMapping 负责根据request请求找到对应的Handler处理器及Interceptor拦截器,将它们封装在HandlerExecutionChain 对象中给前端控制器返回。

非注解映射器1:org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping

使用此映射器时:配置handler时,将handler的name属性作为url

非注解映射器2:org.springframework.web.servlet.handler.SimpleUrlHandlerMapping

使用此映射器时,可以在handler中加入id属性作为prop中value,可以配置多个hander。

二 非注解的处理器适配器

非注解处理器适配器1:org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter

要求编写的Handler实现 Controller接口。

非注解处理器适配器2:org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter

要求编写的Handler实现 HttpRequestHandler接口。

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

映射器:在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注解适配器。

注解的处理器映射器:

注解的处理器适配器:

注解的handler配置

使用组件扫描器省去在spring容器配置每个controller类的繁琐。使用<context:component-scan自动扫描标记@controller的控制器类,不需要在springmvc.xml中配置handler,只需要在handle家注解@Controller

<mvc:annotation-driven>

springmvc使用<mvc:annotation-driven>自动加载RequestMappingHandlerMapping和RequestMappingHandlerAdapter,可用在springmvc.xml配置文件中使用<mvc:annotation-driven>替代注解处理器和适配器的配置。

handler:

package com.springmvc.controller;

import com.springmvc.po.Items;
import org.springframework.stereotype.Controller;
import org.springframework.web.HttpRequestHandler;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * Description:注解开发handler
 * User: jiatp
 * Date:2019/9/7 0007 上午 7:42
*/
@Controller
public class ItemsController3 {

    //商品信息查询
    @RequestMapping("/queryItemsByAnnotation.action")
    public ModelAndView queryItems() throws Exception{
        //调用service查找数据库,查询商品列表,这里使用静态模拟
        List<Items> itemsList = new ArrayList<Items>();
        //向list中填充静态数据

        Items items_1 = new Items();
        items_1.setName("联想笔记本");
        items_1.setPrice(6000f);
        items_1.setDetail("联想笔记本电脑!");

        Items items_2 = new Items();
        items_2.setName("苹果手机");
        items_2.setPrice(5000f);
        items_2.setDetail("苹果手机!");
        itemsList.add(items_1);
        itemsList.add(items_2);
        //返回ModelAndView
        ModelAndView modelAndView = new ModelAndView();

        modelAndView.addObject("itemsList",itemsList);//相当于request.setAtttributes
        modelAndView.setViewName("items/itemsList");//指定返回的视图
        return modelAndView;
    }
    //商品其它操作


}

springmvc处理流程源码分析

  1. 用户发送请求到DispatherServlet前端控制器。
  2. DispatherServlet调用HandlerMapping(处理器映射器)根据url查找Handler。
  3. DispatherServlet调用HandlerAdapter(处理器适配器)对HandlerMapping找到Handler进行包装、执行。HandlerAdapter执行Handler完成后,返回了一个ModleAndView(springmvc封装对象)  DispatherServlet 找一个合适的适配器: 适配器执行Hanlder。
  4. DispatherServlet拿着ModelAndView调用ViewResolver(视图解析器)进行视图解析,解析完成后返回一个View(很多不同视图类型的View)。
  5. DispatcherServlet进行视图渲染,将Model中数据放到request域,在页面展示。

 

原文地址:https://www.cnblogs.com/jatpeo/p/11767524.html