zoukankan      html  css  js  c++  java
  • Spring MVC 入门笔记

    主要名词解释

    DispatcherServlet 前端控制器  相当于一个转发器

    入口:

    protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception

    HandlerMapping 处理器映射器  

    核心方法HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception;

    对HandlerExecutionChain稍微解释下,并不是我一开始理解的由很多个Handler组成的链,而是一个Hanler和多个拦截器interceptor

    源码为证:

    public class HandlerExecutionChain {

     

    private static final Log logger = LogFactory.getLog(HandlerExecutionChain.class);

     

    private final Object handler;

     

    private HandlerInterceptor[] interceptors;

     

    private List<HandlerInterceptor> interceptorList;

     

    private int interceptorIndex = -1;

     

     

     

    HandlerAdapter 处理器适配器

    核心方法:

    ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;

     

    ViewResolver    视图解析器

    核心方法

    View resolveViewName(String viewName, Locale locale) throws Exception;

     

     

    ModelAndView  模型和视图的结合体  是一个底层对象

    部分源码方便理解

    public class ModelAndView {

     

    /** View instance or view name String */

    private Object view;

    /** Model Map */

    private ModelMap model;

     

     

     

    View           视图

    核心方法:渲染

    void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws Exception;

     

    Handler处理器也就是Controller

    源码如下:

    public interface Controller {

    ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception;

     

    }

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    非注解的处理器映射器(多个处理器映射器可共存)

    1、BeanNameUrlHandlerMapping

     

    Bean的Name作为URL 的处理器映射器

    示范:

    <bean name="/queryItems.action" class="com.study.controller.ItemsController" />

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

    1. SimpleUrlHandlerMapping

        

    简单URL处理器映射器

    示范:

    <bean id="id1" class="com.study.controller.ItemsController1" />

    <bean id="id2" class="com.study.controller.ItemsController2" />

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

    <property name="mapping">

    <props>

    <!-- 在这里面进行配置 -->

    <prop key="/url1">id1</prop>

    <prop key="/url2">id2</prop>

    <!-- 一个id可以对应多个key -->

    <prop key="/url3">id1</prop>

    </props>

    </property>

    </bean>   

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    非注解的处理器适配器

    1. SimpleControllerHandlerAdapter

       简单Controller处理器适配器

      直接实现Controller接口

    <bean

    class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />

    示范创建一个ItemsController处理器:

    public class ItemsController implements Controller {

    /*

     * 自己的Controller实现Controller接口中handleRequest方法

     */

    @Override

    public ModelAndView handleRequest(HttpServletRequest request,

    HttpServletResponse response) throws Exception {

    // 此处采用代码方式建对象提供测试,实际中通过和MyBatis等框架整合查询数据库得到数据并由ORM(对象关系映射)转换成对象进行操作

    // 像商品列表中添加三条数据

    List<Item> itemlist = new ArrayList<Item>();

    itemlist.add(new Item("苹果", 5.2));

    itemlist.add(new Item("香蕉", 1.5));

    itemlist.add(new Item("梨子", 3.4));

    // ModelAndView 是模型和视图的结合体

    // model中添加的Object会被添加到request请求域,使用addObject(String,Object)相当于request.setAttribute(String,Object)

    ModelAndView mav = new ModelAndView();

    // 将商品列表对象放入ModelAndView

    mav.addObject("itemlist", itemlist);

    // 设置逻辑视图名

    mav.setViewName("ListItems.jsp");

    return mav;

    }

     

    }

     

     

     

     

     

     

     

     

     

     

    1. HttpRequestHandlerAdapter

       实现HttpRequestHandler接口

    示范创建一个处理器ItemsController2

    使用此方法可以针对于返回JSON数据的情况可以操response

    res.setCharacterEncoding("utf-8");

    res.setContentType("application/json;charset=utf-8");

    res.getWriter().write("你的JSON字符串");

     

    public class ItemsController2 implements HttpRequestHandler {

     

    /*

     * 自己的Controller实现Controller接口中handleRequest方法

     */

    @Override

    public void handleRequest(HttpServletRequest req, HttpServletResponse res)

    throws ServletException, IOException {

    // 此处采用代码方式建对象提供测试,实际中通过和MyBatis等框架整合查询数据库得到数据并由ORM(对象关系映射)转换成对象进行操作

    // 像商品列表中添加三条数据

    List<Item> itemlist = new ArrayList<Item>();

    itemlist.add(new Item("苹果", 5.2));

    itemlist.add(new Item("香蕉", 1.5));

    itemlist.add(new Item("梨子", 3.4));

    //Model填充

    req.setAttribute("itemlist", itemlist);

    //ViewResolver

    req.getRequestDispatcher("ListItems.jsp").forward(req, res);

    //可以针对只需要返回JSON字符串的情况

    // res.setCharacterEncoding("utf-8");

    // res.setContentType("application/json;charset=utf-8");

    // res.getWriter().write("你的JSON字符串");

    }

     

    }

     

     

     

     

     

     

     

     

     

     

    基于注解的处理器映射器

    版本区别

    注意点:Spring MVC 3.1版本之前使用org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping

    3.1版本之后使用

    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping

     

    基于注解的处理器适配器

     

    版本区别

    注意点:Spring MVC 3.1版本之前使用org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter

    3.1版本之后使用

    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter

     

    <!--

    注解方式配置第二种做法 使用mvc:annotation-driven

    两种方式任选其一

    区别点在于

    mvc:annotation-driven方式默认加载了很多参数绑定方法,比如JSON解析器就默认加载了

    实际开发中使用mvc:annotation-driven这种方式

     

     

    -->

    <!-- <mvc:annotation-driven></mvc:annotation-driven> -->

     

     

    注解的处理器映射器需要搭配注解的处理器适配器同时使用

    注解方式和非注解方式同时使用并抢占同一个URL的时候按照xml中配置的先后顺序,先配置的处理器映射器被使用

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    注解语法

    1、@Controller

    使用@Controller注解标志该类为一个Controller

    2、@RequestMapping(url)

    使用@RequestMapping(/myurl.action)注解标志下面的方法映射到/myurl.action

    示范如下

    @Controller

    public class ItemsController3 {

    /*

     * 注解开发Handler

     */

    @RequestMapping("/queryItems.action")

    public ModelAndView queryItems() throws Exception{

    // 此处采用代码方式建对象提供测试,实际中通过和MyBatis等框架整合查询数据库得到数据并由ORM(对象关系映射)转换成对象进行操作

    // 像商品列表中添加三条数据

    List<Item> itemlist = new ArrayList<Item>();

    itemlist.add(new Item("苹果", 5.2));

    itemlist.add(new Item("香蕉", 1.5));

    itemlist.add(new Item("梨子", 3.4));

    // ModelAndView 是模型和视图的结合体

    // model中添加的Object会被添加到request请求域,使用addObject(String,Object)相当于request.setAttribute(String,Object)

    ModelAndView mav = new ModelAndView();

    // 将商品列表对象放入ModelAndView

    mav.addObject("itemlist", itemlist);

    // 设置逻辑视图名

    mav.setViewName("ListItems.jsp");

    return mav;

    }

     

    }

    开发完Handler需要将Handler配置到springmvcconfig.xml

    单个配置方式如下

    <bean class="com.study.controller.ItemsController3" />

    扫描包内组件的方式如下

    <context:component-scan base-package="com.study.controller"></context:component-scan>

     

    深入源码分析Spring MVC框架

    只复制了关键步骤代码其他代码省略

    1. 请求到达Spring MVC框架
      入口如下
      类名:DispatcherServlet

    方法名:
    protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception

    1. 上述方法中执行
      HandlerExecutionChain mappedHandler = null;
      ...
      mappedHandler = getHandler(processedRequest);
      根据Request拿到HandlerExecutionChain

    2. HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
      通过HandlerExecutionChain中的getHandler()方法拿到Handler

    3. ModelAndView mv = null;

    .....
    mv = ha.handle(processedRequest, response, mappedHandler.getHandler());

    1. 通过HandlerAdapter中的handle方法执行处理器中的处理并返回ModelAndView

     

     

     

     


    1. processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);

    调用该方法来执行转发结果、也就是进行最后一步视图渲染

    processDispatchResult方法中调用render(mv, request, response);方法

    在render方法中调用了view.render(mv.getModelInternal(), request, response);
    View对象中的render方法并没有处理,只是个接口

    然后AbstractView这个抽象类实现了View接口
    如下图

    然后AbstractUrlBasedView 继承了AbstractView

    public abstract class AbstractUrlBasedView extends AbstractView implements InitializingBean {

     

    然后内置解析器 InternalResourceView继承了 AbstractUrlBasedView

    public class InternalResourceView extends AbstractUrlBasedView {

    我们的JSP页面最终调用的是InternalResourceView内置的视图解析器
    项目包已压缩为ZIP文件,大小8M地址
    http://xingxunxinxi.com/source/SpringMVC_Study.zip

     

  • 相关阅读:
    Freedur为什么会免费?
    Cocos2d-x中使用音频CocosDenshion引擎介绍与音频文件的预处理
    AssetManager asset的使用
    Android AsyncHttpClient
    UI标签库专题十三:JEECG智能开发平台 ckfinder(ckfinder插件标签)
    UBUNTU 下如何升级 gcc, g++
    java 泛型深入之Set有用工具 各种集合泛型深入使用演示样例,匿名内部类、内部类应用于泛型探讨
    最新Connectify注冊码(序列号) Connectify3.7序列号 破解版
    简单单元測试思想
    Dijkstra算法
  • 原文地址:https://www.cnblogs.com/HumorChen/p/10550186.html
Copyright © 2011-2022 走看看