天天看点

Spring MVC入门第1天--框架说明与快速入门

文档版本 开发工具 测试平台 工程名字 日期 作者 备注
V1.0 2016.06.29 lutianfei none
    • springmvc框架
      • springmvc业务流程框架
        • springmvc框架组件说明
      • Spring MVC入门程序
        • 配置前端控制器
        • 配置处理器适配器
        • 开发Handler
        • 视图编写
        • 配置Handler
        • 配置处理器映射器
        • 配置视图解析器
        • 部署调试
      • 非注解的处理器映射器 和 适配器
        • 非注解的处理器映射器
        • 非注解的处理器适配器
        • springmvc的默认加载
      • 注解的处理器映射器和适配器
        • 配置注解映射器和适配器
        • 开发注解Handler
        • 在spring容器中加载Handler
        • 视图解析器配置前缀和后缀
      • 源码分析了解
      • 入门程序小结
  • 内容安排:
    • 第一天:springmvc的基础知识
      • 什么是springmvc?
      • springmvc框架原理(掌握)
        • 前端控制器、处理器映射器、处理器适配器、视图解析器
      • springmvc入门程序
        • 目的:对前端控制器、处理器映射器、处理器适配器、视图解析器学习
        • 非注解的处理器映射器、处理器适配器
        • 注解的处理器映射器、处理器适配器(掌握)
      • springmvc和mybatis整合(掌握)
      • springmvc注解开发:(掌握)
        • 常用的注解学习
        • 参数绑定(简单类型、pojo、集合类型(明天讲))
        • 自定义参数绑定(掌握)
      • springmvc和struts2区别
    • 第二天:springmvc的高级应用
      • 参数绑定(集合类型)
      • 数据回显
      • 上传图片
      • json数据交互
      • RESTful支持
      • 拦截器

springmvc框架

  • springmvc是spring框架的一个模块,springmvc和spring无需通过中间整合层进行整合。
  • springmvc是一个基于mvc的web框架。
Spring MVC入门第1天--框架说明与快速入门

springmvc业务流程框架

Spring MVC入门第1天--框架说明与快速入门
  • 第一步:用户发送请求至

    DispatcherServlet前端控制器

  • 第二步:

    DispatcherServlet前端控制器

    收到请求调用

    HandlerMapping处理器映射器

    查找

    Handler处理器

    • 可以根据xml配置、注解进行查找
  • 第三步:

    HandlerMapping处理器映射器

    根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(即

    HandlerExecutionChain执行链

    )并返回给

    DispatcherServlet前端控制器

  • 第四步:

    DispatcherServlet前端控制器

    通过

    HandlerAdapter处理器适配器

    调用

    Handler处理器

  • 第五步:

    HandlerAdapter处理器适配器

    去执行

    Handler处理器

    (Controller,也叫后端控制器)。
  • 第六步:

    Handler处理器

    执行完成给

    HandlerAdapter处理器适配器

    返回ModelAndView
  • 第七步:

    HandlerAdapter处理器适配器

    Handler处理器

    执行结果ModelAndView返回给

    DispatcherServlet前端控制器

    • ModelAndView

      是springmvc框架的一个底层对象,包括 Model和view
  • 第八步:

    DispatcherServlet前端控制器

    将ModelAndView传给

    ViewReslover视图解析器

    • 根据逻辑视图名解析成真正的视图(jsp)
  • 第九步:

    ViewReslover视图解析器

    DispatcherServlet前端控制器

    返回View
  • 第十步:

    DispatcherServlet前端控制器

    对View进行渲染视图(即将模型数据填充至视图中)。
    • 视图渲染将模型数据(在ModelAndView对象中)填充到request域
  • 第十一步:

    DispatcherServlet前端控制器

    向用户响应结果

springmvc框架组件说明

  • 1、

    前端控制器DispatcherServlet

    (不需要程序员开发)
    • 用户请求到达前端控制器,它就相当于mvc模式中的c,dispatcherServlet是整个流程控制的中心,由它调用其它组件处理用户的请求,dispatcherServlet的存在降低了组件之间的耦合性。
  • 2、

    处理器映射器HandlerMapping

    (不需要程序员开发)
    • HandlerMapping负责根据用户请求找到Handler即处理器,springmvc提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。
  • 3、

    处理器Handler

    (需要程序员开发)
    • Handler是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。需要程序员根据业务需求开发Handler。
    • 注意:编写Handler时按照HandlerAdapter的要求去做,这样适配器才可以去正确执行Handler
  • 4、

    处理器适配器HandlerAdapter

    • 作用:按照特定规则(HandlerAdapter要求的规则)去执行Handler
    • 通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。
  • 5、

    视图解析器View resolver

    (不需要程序员开发)
    • 作用:进行视图解析,根据逻辑视图名解析成真正的视图(view)
    • View Resolver负责将处理结果生成View视图,View Resolver首先根据

      逻辑视图名

      解析成

      物理视图名

      即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。
  • 6、

    视图View

    (需要程序员开发jsp)
    • View是一个接口,实现类支持不同的View类型(jsp、freemarker、pdf…)
    • springmvc框架提供了很多的View视图类型,包括:jstlView、freemarkerView、pdfView等。
    • 一般情况下需要通过

      页面标签

      页面模版技术

      将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面。

Spring MVC入门程序

  • 需求: springmvc和mybaits使用一个案例(商品订单管理)。
  • 环境准备
    • 数据库环境:mysql5.1
    • java环境:
    • jdk1.7.0_72
    • eclipse indigo
    • springmvc版本:spring3.2
    • 需要spring3.2所有jar(一定包括spring-webmvc-3.2.0.RELEASE.jar)
      Spring MVC入门第1天--框架说明与快速入门

配置前端控制器

  • 在web.xml中配置前端控制器。
    Spring MVC入门第1天--框架说明与快速入门

配置处理器适配器

  • 在classpath下的springmvc.xml中配置处理器适配器
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 
        http://www.springframework.org/schema/mvc 
        http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd 
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-3.2.xsd 
        http://www.springframework.org/schema/aop 
        http://www.springframework.org/schema/aop/spring-aop-3.2.xsd 
        http://www.springframework.org/schema/tx 
        http://www.springframework.org/schema/tx/spring-tx-3.2.xsd ">

    <!-- 处理器映射器 -->
    <!-- 根据bean的name进行查找Handler 将action的url配置在bean的name中 -->
    <bean
        class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
           
Spring MVC入门第1天--框架说明与快速入门

通过查看原代码:

Spring MVC入门第1天--框架说明与快速入门
  • 此适配器能执行实现 Controller接口的Handler并返回ModelAndView类型数据。
Spring MVC入门第1天--框架说明与快速入门

开发Handler

  • 需要实现 controller接口,才能由

    org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter

    适配器执行。
public class ItemsController1 implements Controller {

    @Override
    public ModelAndView handleRequest(HttpServletRequest request,
            HttpServletResponse response) throws Exception {

        //调用service查找 数据库,查询商品列表,这里使用静态数据模拟
        List<Items> itemsList = new ArrayList<Items>();
        //向list中填充静态数据

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

        Items items_2 = new Items();
        items_2.setName("苹果手机");
        items_2.setPrice(f);
        items_2.setDetail("iphone6苹果手机!");

        itemsList.add(items_1);
        itemsList.add(items_2);

        //返回ModelAndView
        ModelAndView modelAndView =  new ModelAndView();
        //相当 于request的setAttribut,在jsp页面中通过itemsList取数据
        modelAndView.addObject("itemsList", itemsList);

        //指定视图
        modelAndView.setViewName("/WEB-INF/jsp/items/itemsList.jsp");

        return modelAndView;
    }

}
           

视图编写

  • 添加itemsList.jsp页面
    Spring MVC入门第1天--框架说明与快速入门

配置Handler

  • 将编写Handler在spring容器加载(springmvc.xml)。
    Spring MVC入门第1天--框架说明与快速入门

配置处理器映射器

  • 在classpath下的springmvc.xml中配置处理器映射器
    Spring MVC入门第1天--框架说明与快速入门

配置视图解析器

  • 需要配置解析jsp的视图解析器。
    Spring MVC入门第1天--框架说明与快速入门

部署调试

  • 访问地址:http://localhost/springmvcfirst1208/queryItems.action
  • 处理器映射器根据url找不到Handler,报下边的错误。说明url访问地址错误。
    Spring MVC入门第1天--框架说明与快速入门
  • 处理器映射器根据url找到了Handler,转发的jsp页面找到,报下边的错误,说明jsp页面地址错误了。
  • 修改

    ItemsController1.java

    文件中的modelAndView指定的视图地址即可。
    Spring MVC入门第1天--框架说明与快速入门

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

非注解的处理器映射器

  • 上面入门所用的处理器映射器:

    org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping

  • 问题:url配置是在bean中完成的
  • url和handler集中配置的映射器(简单映射器):

    org.springframework.web.servlet.handler.SimpleUrlHandlerMapping

    Spring MVC入门第1天--框架说明与快速入门
  • 结论:多个映射器可以并存,前端控制器判断url能让哪些映射器映射,就让正确的映射器处理。
  • handler要加入id属性
<!-- 配置Handler -->
<bean id="itemsController1" name="/queryItems_test.action" class="cn.itcast.ssm.controller.ItemsController1" />
           

非注解的处理器适配器

  • 入门所使用适配器:

    org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter

  • 要求: 编写的Handler实现 Controller接口。
  • 另一种适配器:

    org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter

  • 添加适配器声明 :
<!-- 另一个非注解的适配器 -->
<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"/>
           
  • 要求编写的Handler实现 HttpRequestHandler接口。
Spring MVC入门第1天--框架说明与快速入门
  • 添加handle属性
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="mappings">
        <props>
            <prop key="/queryItems1.action"> itemsController1</prop>
            <prop key="/queryItems2.action"> itemsController2</prop>
        </props>

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

springmvc的默认加载

  • 在 DispatcherSerlvet.properties 中
    Spring MVC入门第1天--框架说明与快速入门
  • 前端控制器从上边的文件中加载处理映射器、适配器、视图解析器等组件,如果不在springmvc.xml中配置,使用默认加载的。

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

  • 在spring**3.1之前使用的注解映射器:org.springframework.web.servlet.mvc.annotation.**DefaultAnnotationHandlerMapping。
  • 在spring3.1之后使用的注解映射器 : org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping。
  • 在spring**3.1之前使用的注解适配器 : org.springframework.web.servlet.mvc.annotation.**AnnotationMethodHandlerAdapter。
  • 在spring3.1之后使用的注解适配器 : org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter。

配置注解映射器和适配器

Spring MVC入门第1天--框架说明与快速入门
  • 开发中使用

    mvc:annotation-driven

    代替上边注解映射器和注解适配器配置
    • mvc:annotation-driven

      默认加载很多的参数绑定方法,比如json转换解析器就默认加载了,如果使用

      mvc:annotation-driven

      不用配置上边的RequestMappingHandlerMapping和RequestMappingHandlerAdapter
//springmvc.xml
<!-- <mvc:annotation-driven></mvc:annotation-driven> -->
           

开发注解Handler

  • 注解的映射器

    注解的适配器

    必须配对使用
  • @RequestMapping(“/queryItems”):这里映射可以不加后缀

    .action

    但是输入网址时必须加。
//使用Controller注解 标识下面的类是一个控制器
@Controller
public class ItemsController3 {
    //商品查询列表
    //@RequestMapping实现 对queryItems方法和url进行映射,一个方法对应一个url
    //一般建议将url和方法写成一样
    @RequestMapping("/queryItems")
    public ModelAndView queryItems()throws Exception{

        //调用service查找 数据库,查询商品列表,这里使用静态数据模拟
        List<Items> itemsList = new ArrayList<Items>();
        //向list中填充静态数据

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

        Items items_2 = new Items();
        items_2.setName("苹果手机");
        items_2.setPrice(f);
        items_2.setDetail("iphone6苹果手机!");

        itemsList.add(items_1);
        itemsList.add(items_2);

        //返回ModelAndView
        ModelAndView modelAndView =  new ModelAndView();
        //相当 于request的setAttribut,在jsp页面中通过itemsList取数据
        modelAndView.addObject("itemsList", itemsList);

        //指定视图
        modelAndView.setViewName("/WEB-INF/jsp/items/itemsList.jsp");


        return modelAndView;

    }
}
           

在spring容器中加载Handler

  • 对于注解的Handler可以单个配置,但实际开发中建议使用组件扫描
    • 组件扫描可以扫描controller、service、…
<!--
    Handler的单个配置
     -->
    <!-- <bean class="cn.itcast.ssm.controller.ItemsController3" /> -->


    <!--
        组件扫描:这里扫描的是controller包
     -->
    <context:component-scan base-package="cn.itcast.ssm.controller"></context:component-scan>
           
  • 部署调试
    • 访问:http://localhost/springmvcfirst1208/queryItems.action

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

<!-- 视图解析器
    解析jsp解析,默认使用jstl标签,classpath下的得有jstl的包
     -->
    <bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 配置jsp路径的前缀 -->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <!-- 配置jsp路径的后缀 -->
        <property name="suffix" value=".jsp"/>
    </bean>
           
  • 此时程序中不用指定前缀和后缀,上述

    ItemsController3.java

    最后可修改如下:
//指定视图
//下边的路径,如果在视图解析器中配置jsp路径的前缀和jsp路径的后缀,修改为
//modelAndView.setViewName("/WEB-INF/jsp/items/itemsList.jsp");
//上边的路径配置可以不在程序中指定jsp路径的前缀和jsp路径的后缀
modelAndView.setViewName("items/itemsList");
           

源码分析(了解)

  • 通过前端控制器源码分析springmvc的执行过程。
  • 第一步:前端控制器接收请求
    • web.xml

      org.springframework.web.servlet.DispatcherServlet

      转到

      DispatcherServlet

    • 找到方法:

      doDispatch

Spring MVC入门第1天--框架说明与快速入门
  • 第二步:前端控制器调用处理器映射器查找 Handler
    • doDispatch

      方法的第896行找到getHandler()函数并进入

      HandlerExcecutionChain

      Spring MVC入门第1天--框架说明与快速入门
    • 继续进入下一层

      getHandler

      函数,找到最终的

      HandlerExcecutionChain

      定义
      Spring MVC入门第1天--框架说明与快速入门
  • 第三步:调用处理器适配器执行Handler,得到执行结果ModelAndView
    • doDispatch

      函数第925行左右
      Spring MVC入门第1天--框架说明与快速入门
  • 第四步:视图渲染,将model数据填充到request域。
    • DispatcherServlet.class

      992行找到

      render

      函数,并点入
      Spring MVC入门第1天--框架说明与快速入门
    • 视图解析,得到view:
      Spring MVC入门第1天--框架说明与快速入门
    • 调用view的渲染方法,将model数据填充到request域
      Spring MVC入门第1天--框架说明与快速入门
    • 渲染方法:
      Spring MVC入门第1天--框架说明与快速入门

入门程序小结

  • 通过入门程序理解springmvc前端控制器、处理器映射器、处理器适配器、视图解析器用法。
  • 前端控制器配置:
    • 第一种:

      *.action

      ,访问以.action结尾 由DispatcherServlet进行解析
    • 第二种:

      /

      ,所以访问的地址都由DispatcherServlet进行解析,对于静态文件的解析需要配置不让DispatcherServlet进行解析,使用此种方式可以实现 RESTful风格的url
  • 处理器映射器:
    • 非注解处理器映射器(了解)
    • 注解的处理器映射器(掌握)
    • 对标记

      @Controller类

      中标识有

      @RequestMapping

      的方法进行映射。在

      @RequestMapping

      里边定义映射的url。使用注解的映射器不用在xml中配置url和Handler的映射关系。
  • 处理器适配器:
    • 非注解处理器适配器(了解)
    • 注解的处理器适配器(掌握)
    • 注解处理器适配器和注解的处理器映射器是配对使用。理解为不能使用非注解映射器进行映射。
    • 实际开发使用:

      mvc:annotation-driven