SpringMVC的简介、工作原理和文件上传


SpringMVCspringMVC简介

springMVC即Spring Web MVC,是spring web模块的一部分,是spring自己的web框架。
springMVC对Servlet API 进行了完善的封装,极大的简化了开发人员的编程工作。同时springMVC也提供了友好
简便的方式让开发人员可以使用Servlet API,十分灵活。

tomcat服务器

springMVC的操作方式: 使用maven管理的web项目

核心控制器——DispatcherServlet
springMVC提供了一个核心控制器(大总管)——DispatcherServlet,负责统一调用springMVC提供的其他组件,
按照固定步骤处理请求,生成响应。
主要内容就是DispatcherServlet的调度过程(处理流程)、其他组件的作用、以及如何实现自己的handler
(处理器)。

DispatcherServlet结构:
DispatcherServlet:HandlerMapping(URL—拦截器 映射表;URL—handler 映射表);HandlerAdapter(类型
转换器;校验器);文件上传解析器;视图解析器;异常解析器。
HandlerExecutionChain:interceptors;handler

springMVC的核心配置文件
springMVC是spring的一部分,需要spring上下文的支持,所以需要一个像beans.xml一样的配置文件,我们把
这个配置文件命名为dispatcher-servlet.xml(其他名称也可以)。

除了以bean的方式配置、管理springMVC的组件外,springMVC的其他内容也需要在这个文件中配置。
springMVC还提供了一个字符编码过滤器,可以对POST请求和响应设置编码(tomcat8会自动对GET请求进行编码)

DispatcherServlet处理时序图:
DispatcherServlet处理时序图

URL——handler映射

springMVC通过封装,替开发人员做了很多事情,对于那些必须由开发人员来实现的部分,也提供了一整套机制让
开发人员实现起来更加简单。

开发人员通过实现自己的handler,对请求进行具体的业务处理。实现方式:
声明一个普通类并使用@Controller(不能使用其他方式)把该类标注成spring的bean
使用@RequestMapping把该类的方法标注为handler
@RequestMapping有两个常用的属性:value和method
value指定匹配的请求路径,单独使用时可省略此属性名
method 指定匹配的请求方法(GETPOST),值为枚举类型RequestMethod
@RequestMapping也可以标注在类上,为此类所有的handler统一指定"父路径"。

handler方法的参数类型
handler方法的参数支持很多类型,不同的类型会有不同的用法和效果
1、支持ServletAPI
即HttpServletRequest、HttpServletResponse、HttpSession等
如果handler方法声明了以上类型的参数,方法执行时springMVC会把和当前请求相关的这些对象注入到方法参数
其实只要拿到了request、response对象,完全可以按照普通的Servlet方式处理当前请求,这也体现了springMVC
高度的灵活性
还可以通过RequestContextHolder工具类在任何springMVC环境下访问Servlet API
2、支持常用类型
包括基本类型及其包装类型、String、Date等
如果handler方法有以上类型的参数,再配合使用相关的注解,springMVC可以自动从请求中获取相应的值,并且进
行类型转换等

常用注解:
	* @RequestParam 获取指定请求参数,相当于request.getParameter()
	* @RequestHeader 获取指定请求头,相当于request.getHeader()
	* @CookieValue 获得指定cookie的value值
	* @SessionAttribute 获取指定session域的属性值,相当于session.getAttribute()

注意:这几个注解的required属性默认为true,即值不能为null
新版本的springMVC(比如当前使用的版本),@RequestParam可以省略,springMVC会根据参数名称尝试操作,
且允许值为null。
对于Date类型的参数,由于springMVC在简体中文环境下默认的日期格式不太适用,可自定义日期格式。
3、支持pojo类
如果handler方法的参数是pojo类型,可以配合使用@ModelAttribute,springMVC会自动创建此pojo类对象,并
尝试从请求参数中获取pojo字段相应的值、类型转换、数据绑定等。
可以省略@ModelAttribute; 可以配合使用@Valid、BindingResult,对pojo类的字段进行有效性校验。
4、支持Map、Model、ModelMap
这三个实际上是一样的。即使不在handler方法中声明Model参数,springMVC内部也会对每个请求创建一个Model
对象,而且持有pojo参数(如果有)的引用。
Model中可以存入一些键值对数据,最终Model中的数据会被添加到request中,所以也可以直接把键值对存入
request。这么看来Model似乎是多余的,其实Model可以和spring自定义标签配合使用,为其提供pojo对象
此外,handler方法还支持其他类型,如RedirectAttributes、MultipartFile等

handler方法的返回值类型
1、支持String、ModelAndView
String类型的返回值表示视图名称
ModelAndView就相当于方法参数Model + 返回值String,比较常用
视图名称使用redirect: 前缀表示重定向到另一个handler(不使用视图解析器),配合使用RedirectAttrbutes
方法参数,springMVC会生成带参数的重定向URL
视图名称使用forward: 前缀表示转发到另一个handler(不使用视图解析器)
2、支持pojo类
对于ajax请求来说,一般需要返回json格式的字符串数据。springMVC提供了@ResponseBody注解,当标注在
handler方法的返回值之前时,可以自动把返回对象转换为json格式的字符串并发送到客户端
springMVC把对象转换为json格式字符串使用的是Jackson工具包
对于Date类型的字段,可以使用Jackson提供的@JsonFormat指定日期格式(标注在字段上)
3、支持void
如果handler方法的返回值类型是void,则springMVC会认为开发人员已经使用Servlet API 生成了响应,就不再
继续处理了。
无论返回值类型是什么,return nullvoid含义是一样的。

视图层
可以使用JSP页面作为视图层,常用的技术组合为JSP + EL + JSTL+ spring form标签库)。

spring form标签库
spring提供了两个标签库,主要的是form标签库,常用的有<form><input><checkboxes><radiobuttons><select><errors>等。
在使用这些标签时,要求handler方法需要有pojo参数,并且其他标签需要放到<form>标签内部
	* <form>会生成HTML的form标签,主要用来为其他spring标签提供Model中的pojo对象。modelAttribute
	 属性值需要和pojo参数名一致
	* <input> 默认生成HTML的input(text)标签,path属性值为pojo类的某个字段名
	* <checkboxes> 使用数组、集合生成一组input(checkbox)标签;如: <form:checkboxes 
	 items="${allRoleList }" path="roleList" itemLabel="name" itemValue="id" />
	* <radiobuttons><checkboxes>用法相似
	* <select><checkboxes>用法相似,可以使用multiple="false"属性指定不允许多选
	* <errors>可以输出某个字段的验证失败信息,也可以输出全部字段的验证失败信息

<form>的action属性不支持JSP表达式<%= %>,可以使用${pageContext.request.contextPath}的方式取得
项目路径。
这里对于日期字段来说,可以使用@DateTimeFormat标注在字段上指定日期格式
在实际使用时,既可以使用springMVC提供的这套标签,也可以使用EL+JSTL的方式。如果对页面样式要求较高,
可能并不适合使用这些spring form标签。

数据校验
当handler方法的参数是pojo类时,就可以使用spring提供的一套数据校验方案对pojo类中的字段值进行有效性
校验。

使用hibernate提供的校验实现
把校验器配置为bean,id需要指定为validator

校验相关注解
@Valid 标注在handler方法的pojo参数前面,相当于此pojo对象的校验开关
pojo参数后面需要紧跟BindingResult参数,记录校验结果
可以使用spring form标签库的<errors>标签把校验失败信息输出在页面上
下面的注解都标注在字段上,表示对标注的字段应用某种校验规则,可以直接在注解上指定校验失败时的错误信息
(不指定时使用默认的)。
@NotEmpty 此字段不能为null,也不能为空字符串
@Length 可以指定字符串的最小、最大长度
@Min 指定数值的最小值
@Max 指定数值的最大值
@Range 指定数值的范围
@Size 指定数组、集合的元素范围
@AssertTrue 断定boolean值为true
@AssertFalse 断定boolean值为false
@Email 指定字符串符合email格式
@Pattern 字符串符合指定的正则表达式
在实际使用时,既可以采用这种校验方式,也可以使用普通的校验方式,即手动对需要校验的字段进行校验,然后
向request中添加校验失败的信息,然后在页面中使用EL表达式把失败信息输出到页面上,普通校验方式大家比较
熟悉,而且非常灵活。

springMVC拦截器
springMVC的interceptor和Servlet的filter非常相似,可以拦截请求进行预处理和后处理
	* 实现HandlerInterceptor接口编写自己的拦截器(或者继承HandlerInterceptorAdapter)
	* 在dispatcher-servlet.xml文件中配置此拦截器

可以使用若干个<mvc:mapping>指定拦截的请求,支持 * 通配符。
也可以使用<mvc:exclude-mapping>指定不拦截的请求,一般和<mvc:mapping>配合使用从拦截的请求中排除某些
请求。

servlet的filter调用链和springMVC的interceptor调用链执行时候的差别:
servlet的filter调用链和springMVC的interceptor调用链执行时候的差别

文件上传
springMVC封装了Commons FileUpload 普通文件上传方式,简化了文件上传操作。(此外还支持servlet3.0方式
的文件上传)

普通文件上传方式
文件上传解析器,id需要指定为multipartResolver
接下来在handler方法上使用MultipartFile类型的参数即可(@RequestParam 注解可省略)。

MultipartFile 常用方法:
getContentType() 获得上传文件的类型
getOriginalFilename() 获得文件原始名称
getSize() 获得上传文件的大小
getInputStream() 获得上传文件的读取流
transferTo(dest) 把上传的文件复制到目标文件
当然,还对页面的form表单有要求:<form method="post" enctype="multipart/form-data">。

异常解析器
通过实现HandlerExceptionResolver接口可以编写自己的异常解析器,注册为bean后可以捕获服务器运行时抛出
的异常。
通常会在异常解析器中记录异常日志信息,还可以根据请求的类型(普通请求、ajax请求)生成合适的错误提示

springMVC+spring+mybatis整合
springMVC+spring整合
整合时依赖的jar包和单独使用springMVC时没有变化
在项目启动的时候,需要初始化两个spring上下文对象:spring的上下文和springMVC的上下文
同时还需要提供两个spring配置文件:dispatcher-servlet.xml和beans.xml

这两个spring上下文关系如下:
spring上下文关系

为了方便描述,我们称spring的上下文为父容器,springMVC的上下文为子容器。

子容器主要管理Controller、ViewResolver等和web有关的内容,父容器主要管理service、dao等其他内容
当程序需要从子容器获得bean时,会先从子容器查找,如果没找到,就到父容器查找。但当程序需要从父容器
获得bean时,就只会从父容器查找。

如果项目较小,可以把所有的东西都配置在dispatcher-servlet.xml中,这样更简单省事一些。如果项目较大,
还是推荐采用传统的使用两个上下文的方式,对内容分类管理。

在springMVC + spring整合的基础上,再整合mybatis
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值