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

鹿天斐 鹿天斐     2022-07-31     350

关键词:

文档版本 开发工具 测试平台 工程名字 日期 作者 备注
V1.0 2016.06.29 lutianfei none


  • 内容安排:
    • 第一天:springmvc的基础知识
      • 什么是springmvc?
      • springmvc框架原理(掌握)
        • 前端控制器、处理器映射器、处理器适配器、视图解析器
      • springmvc入门程序
        • 目的:对前端控制器、处理器映射器、处理器适配器、视图解析器学习
        • 非注解的处理器映射器、处理器适配器
        • 注解的处理器映射器、处理器适配器(掌握)
      • springmvc和mybatis整合(掌握)
      • springmvc注解开发:(掌握)
        • 常用的注解学习
        • 参数绑定(简单类型、pojo、集合类型(明天讲))
        • 自定义参数绑定(掌握)
      • springmvc和struts2区别
    • 第二天:springmvc的高级应用
      • 参数绑定(集合类型)
      • 数据回显
      • 上传图片
      • json数据交互
      • RESTful支持
      • 拦截器

springmvc框架

  • springmvc是spring框架的一个模块,springmvc和spring无需通过中间整合层进行整合。
  • springmvc是一个基于mvc的web框架。

技术分享


springmvc业务流程框架

技术分享

  • 第一步:用户发送请求至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)
      技术分享

配置前端控制器

  • 在web.xml中配置前端控制器。
    技术分享

配置处理器适配器

  • 在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" />

技术分享

通过查看原代码:

技术分享

  • 此适配器能执行实现 Controller接口的Handler并返回ModelAndView类型数据。

技术分享


开发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(6000f);
        items_1.setDetail("ThinkPad T430 联想笔记本电脑!");

        Items items_2 = new Items();
        items_2.setName("苹果手机");
        items_2.setPrice(5000f);
        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页面
    技术分享

配置Handler

  • 将编写Handler在spring容器加载(springmvc.xml)。
    技术分享

配置处理器映射器

  • 在classpath下的springmvc.xml中配置处理器映射器
    技术分享

配置视图解析器

  • 需要配置解析jsp的视图解析器。
    技术分享

部署调试

  • 访问地址:http://localhost/springmvcfirst1208/queryItems.action

  • 处理器映射器根据url找不到Handler,报下边的错误。说明url访问地址错误。
    技术分享

  • 处理器映射器根据url找到了Handler,转发的jsp页面找到,报下边的错误,说明jsp页面地址错误了。

  • 修改ItemsController1.java文件中的modelAndView指定的视图地址即可。
    技术分享


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

非注解的处理器映射器

  • 上面入门所用的处理器映射器:org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping
  • 问题:url配置是在bean中完成的

  • url和handler集中配置的映射器(简单映射器):org.springframework.web.servlet.handler.SimpleUrlHandlerMapping
    技术分享

  • 结论:多个映射器可以并存,前端控制器判断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接口

技术分享

  • 添加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 中
    技术分享

  • 前端控制器从上边的文件中加载处理映射器、适配器、视图解析器等组件,如果不在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


配置注解映射器和适配器

技术分享

  • 开发中使用 mvc:annotation-driven代替上边注解映射器和注解适配器配置
    • mvc:annotation-driven默认加载很多的参数绑定方法,比如json转换解析器就默认加载了,如果使用mvc:annotation-driven不用配置上边的RequestMappingHandlerMappingRequestMappingHandlerAdapter
//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(6000f);
        items_1.setDetail("ThinkPad T430 联想笔记本电脑!");

        Items items_2 = new Items();
        items_2.setName("苹果手机");
        items_2.setPrice(5000f);
        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>

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

<!-- 视图解析器
    解析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.xmlorg.springframework.web.servlet.DispatcherServlet转到DispatcherServlet
    • 找到方法:doDispatch

技术分享


  • 第二步:前端控制器调用处理器映射器查找 Handler

    • doDispatch方法的第896行找到getHandler()函数并进入HandlerExcecutionChain
      技术分享
    • 继续进入下一层getHandler函数,找到最终的HandlerExcecutionChain定义
      技术分享
  • 第三步:调用处理器适配器执行Handler,得到执行结果ModelAndView

    • doDispatch函数第925行左右
      技术分享
  • 第四步:视图渲染,将model数据填充到request域。

    • DispatcherServlet.class992行找到render函数,并点入
      技术分享
    • 视图解析,得到view:
      技术分享
    • 调用view的渲染方法,将model数据填充到request域
      技术分享
    • 渲染方法:
      技术分享


入门程序小结

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

  • 前端控制器配置:

    • 第一种:*.action,访问以.action结尾 由DispatcherServlet进行解析
    • 第二种:/,所以访问的地址都由DispatcherServlet进行解析,对于静态文件的解析需要配置不让DispatcherServlet进行解析,使用此种方式可以实现 RESTful风格的url
  • 处理器映射器:

    • 非注解处理器映射器(了解)
    • 注解的处理器映射器(掌握)
    • 对标记@Controller类中标识有@RequestMapping的方法进行映射。在@RequestMapping里边定义映射的url。使用注解的映射器不用在xml中配置url和Handler的映射关系。
  • 处理器适配器:

    • 非注解处理器适配器(了解)
    • 注解的处理器适配器(掌握)
    • 注解处理器适配器和注解的处理器映射器配对使用。理解为不能使用非注解映射器进行映射。
    • 实际开发使用:mvc:annotation-driven















































springmvc入门第3天--注解开发

文档版本开发工具测试平台工程名字日期作者备注V1.02016.07.01lutianfeinone商品修改功能开发一、需求操作流程:1、进入商品查询列表页面2、点击修改,进入商品修改页面,页面中显示了要修改的商品(从数据库查询)要修改的商... 查看详情

mybatis入门第2天--高级映射与查询缓存

文档版本开发工具测试平台工程名字日期作者备注V1.02016.06.28lutianfeinonemybatis框架执行过程:1、配置mybatis的配置文件,SqlMapConfig.xml(名称不固定)2、通过配置文件,加载mybatis运行环境,创建SqlSessionFactory会话工厂SqlSessionFactory... 查看详情

springboot入门第一个项目(代码片段)

...考:https://blog.csdn.net/sanluo11/article/details/54599693springboot跟springmvc没有必然的联系 1、springboot特点化简为繁,简化配置备受关注,是下一代框架微服务的入门级微服务框架 2、第一个springboot应用C:UsersAdministrator>java-versionja 查看详情

spring入门第2天--面向切面编程入门

文档版本开发工具测试平台工程名字日期作者备注V1.02016.06.22lutianfeinoneAOP的概述什么是AOPAOPAspectOrientedPrograming面向切面编程AOP采取横向抽取机制,取代了传统纵向继承体系重复性代码(性能监视、事务管理、安全检查、缓存)Spr... 查看详情

swift快速入门第一个swift程序

1.本系列说明 本系列只是一个Swift快速入门的教程,并没有详尽的介绍Swift,Swift也并不是一个简单的编程语言,所以要想详尽的系统的学习Swift,本系列并不适合你,此系列只是让开发者可以快速的用Swift来进行开发。另外学... 查看详情

springmvc--springmvc介绍快速入门快速入门流程(代码片段)

1.SpringMVC介绍SpringMVC是三层架构(视图层、服务层、持久层)中的视图层框架。SpringMVC是Spring的一个后续产品,是Spring的一个子项目2.快速入门2.1需求客户端发起请求,服务器端接收请求,执行逻辑并进行视图... 查看详情

springmvc入门第三部分(代码片段)

利用SpringMVC做一个CRUD符合Rest风格的网站案例Web环境搭建1.导入相关坐标2.web.xml进行配置Tips:字符编码的Filter配置要在支持REST风格的filter配置之前3.SpringMVC.xml配置数据库环境搭建1.propertise配置文件2.在Spring容器中引入pro配置文件&#x... 查看详情

springmvc入门第二部分(代码片段)

SpringMVC入门第二部分数据带给页面方法1:在方法上传入原生的request和session方法2:在方法里面传入map,model或者modelMap---给request域中带数据map,modelmap,model继承关系图给这些参数里面保存的所有数据最终都会放在请求域中,可... 查看详情

mybatis入门第2天--mybatis与spring整合及逆向工程

文档版本开发工具测试平台工程名字日期作者备注V1.02016.06.28lutianfeinonespring和mybatis整合整合思路需要spring通过单例方式管理SqlSessionFactory。spring和mybatis整合生成代理对象,使用SqlSessionFactory创建SqlSession。(spring和mybatis整合自动... 查看详情

android入门第23天-日历选择组件与时间选择组件(代码片段)

介绍DatePicker日期选择器,自带spinner和calendar两种模式,相关属性:android:calendarTextColor:日历列表的文本的颜色android:calendarViewShown:是否显示日历视图android:datePickerMode:组件外观,可选值:spi 查看详情

android入门第47天-fragment的基本使用(代码片段)

简介我们的Android入门一步步已经进入中级。我们讲完了所有的基本组件的基本使用、Activity、Service、BroadCast。今天我们来到了Fragment篇章。Fragment和Activity比到底是一个什么样的存在呢?我们以一个很小的例子来说通Fragment。F... 查看详情

zookeeper入门第一篇

转载原文地址:ZooKeeper学习总结第一篇:ZooKeeper快速入门ZooKeeper学习总结第二篇:ZooKeeper深入探讨ZooKeeper学习第一期---Zookeeper简单介绍1.概述Zookeeper简单来说就是一个分布式协调技术的具体实现,所谓分布式协调技术就是在集群... 查看详情

android入门第43天-activity与activity间的互相传值(代码片段)

介绍今天的课程会比较好玩,我们在之前的Service篇章中看到了一种putExtras和getExtras来进行activity与service间的传值。而恰恰这种传值其实也是Android里的通用传值法。它同样可以适用在activity与activity间传值。Android中的传值传单... 查看详情

android入门第15天-android各版本号对比

版本号英文名中文名API等级发布时间1无无12008年9月23日1.1无无22009年2月9日1.5Cupcake纸杯蛋糕32009年4月30日1.6Donut甜甜圈42009年9月15日2.1Eclair闪电泡芙72009年10月26日2.2Froyo冻酸奶82010年5月20日2.3Gingerbread姜饼92010年12月7日2.3.3Gingerbread姜... 查看详情

杨老师课堂之javaee三大框架hibernate入门第一课

本篇任务1.使用Hibernate框架完成对客户的增删改查的操作教学导航1.能够说出Hibernate的执行流程2.能够独立使用Hibernate框架完成增删改查的操作框架和CRM项目的整体介绍1.什么是CRM*CRM(CustomerRelationshipManagement)客户关系管理,是利... 查看详情

android入门第48天-静态broadcast之接受开机广播(代码片段)

简介我们在之前的BroadCast章节中写了动态BroadCast。但我们提过一笔BroadCast也有静态之分,而静态的BroadCast主要用于监听一些如:开机广播、SIM卡拨出插入等广播。这些广播都为静态注册广播事件。因此我们今天就以一个Ap... 查看详情

android入门第12天-checkbox的使用(代码片段)

需求要做一个这样的界面。界面里有多选的三种水果,然后点一下【提交】按钮,控制台打印你选择的是哪些?设计我们使用TableRow排局,做上中下三层;由于当中有三个组件即三列,因此第一行和第二行里的组件中使用:android... 查看详情

快速上手serverless|入门第一课

简介: 本文从云计算抛砖引玉,详解Serverless的典型应用场景和一些产品介绍。一、从云计算到Serverless自世界上第一台通用计算机ENIAC(图左)诞生以来,计算机科学与技术的发展就从未停止过前进的脚步。2003年-2006年&... 查看详情