码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2016-07-03 19:59:01      阅读:288      评论:0      收藏:0      [点我收藏+]

标签:

文档版本 开发工具 测试平台 工程名字 日期 作者 备注
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

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

标签:

原文地址:http://blog.csdn.net/lutianfeiml/article/details/51793860

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!