关键词:
文档版本 | 开发工具 | 测试平台 | 工程名字 | 日期 | 作者 | 备注 |
---|---|---|---|---|---|---|
V1.0 | 2016.06.29 | lutianfei | none |
- 内容安排:
- 第一天:springmvc的基础知识
- 什么是springmvc?
- springmvc框架原理(掌握)
- 前端控制器、处理器映射器、处理器适配器、视图解析器
- springmvc入门程序
- 目的:对前端控制器、处理器映射器、处理器适配器、视图解析器学习
- 非注解的处理器映射器、处理器适配器
- 注解的处理器映射器、处理器适配器(掌握)
- springmvc和mybatis整合(掌握)
- springmvc注解开发:(掌握)
- 常用的注解学习
- 参数绑定(简单类型、pojo、集合类型(明天讲))
- 自定义参数绑定(掌握)
- springmvc和struts2区别
- 第二天:springmvc的高级应用
- 参数绑定(集合类型)
- 数据回显
- 上传图片
- json数据交互
- RESTful支持
- 拦截器
- 第一天:springmvc的基础知识
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的视图解析器。
部署调试
处理器映射器根据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
不用配置上边的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(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.xml
的org.springframework.web.servlet.DispatcherServlet
转到DispatcherServlet
- 找到方法:
doDispatch
- 由
第二步:前端控制器调用处理器映射器查找 Handler
- 在
doDispatch
方法的第896行找到getHandler()函数并进入HandlerExcecutionChain
- 继续进入下一层
getHandler
函数,找到最终的HandlerExcecutionChain
定义
- 在
第三步:调用处理器适配器执行Handler,得到执行结果ModelAndView
- 在
doDispatch
函数第925行左右
- 在
第四步:视图渲染,将model数据填充到request域。
- 在
DispatcherServlet.class
992行找到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配置文件... 查看详情
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年&... 查看详情