本篇文章主要分享下自己在学习Spring MVC数据转换、格式化和数据校验、Spring MVC文件上传和下载以及Spring MVC拦截器遇到的一些问题和读书笔记,希望对你有所帮助。

@Component、@Repository、@Service、@Controller的区别

在应用的分层模型中,大致上都可以分为如下几层:表现层、控制器层、业务逻辑层、DAO层、Domain Object层,了解了应用的分层模型,再来看注解之间的区别就很简单了。@Controller对应于控制器层,@Service对应于业务逻辑层,@Repository对应于持久化层(也就是DAO层),@Component对应于哪些比较中立的类(就是不属于任何一层的类)。

注意:有这样一个问题,我把控制器类放在com.dodonew.controller包下面,把持久化层类放在com.dodonew.dao包下面,控制器类使用@Controller进行注解,持久化类使用@Repository进行注解,以前项目中扫码包配置如下所示:

<context:component-scan base-package="com.dodonew.controller"/>

还是这样配置的话就会出现一个问题,@Repository注解没有办法进行识别,因为没有被扫描到,所以包的扫描范围就要进行扩大,这点特别要注意,配置如下:

<context:component-scan base-package="com.dodonew"/>

@Resource、@Autowired、@Qualifier区别

@Resource注解(该注解属于J2EE)

该注解默认是按名称来装配注入的,如果Spring找不到与名称相匹配的bean时,该注解才会按照类型来装配注入。@Resource有两个重要的属性,name和type,Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。当使用name属性时,Spring则使用byName的自动注入策略,使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,Spring将通过反射机制使用byName自动注入策略。

装配顺序:

  1. 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则会抛出异常。
  2. 如果指定了name,则从上下文中查找名称匹配的bean进行装配,找不到抛出异常。
  3. 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或找到多个都会抛出异常。
  4. 如果既没有指定name,也没有指定type,则自动按照byName方式进行装配;如果没有找到匹配,则会回退到一个原始类型进行匹配,如果匹配则自动装配,否则抛出异常。

@Autowired注解(该注解属于Spring)

该注解默认是按照类型装配注入的,在默认情况下,它要求依赖对象必须存在,如果允许null值,可以设定它的required属性为false,如下所示:

@Autowired(required=false)
public IUserService userService;

@Qualifier注解

该注解配合@Autowired使用,因为会存在这样一种情况,当你创建了多个具有相同类型的bean时,怎么进行区分呢?在这种情况下,可以使用@Qualifier注解和@Autowired注解来进行区分,如下所示:

@Autowired
@Qualifier("userServiceImpl")
public IUserService userService;

Spring MVC的数据绑定流程

Spring MVC通过反射机制对目标处理方法的签名进行分析,并将请求消息绑定到处理方法的参数中,数据绑定的核心部件是DataBinder,其运行机制如下图所示:

Spring MVC框架将ServletRequest对象及处理方法的参数对象实例传递给DataBinder,DataBinder调用装配在Spring Web上下文中的ConversionService组件进行数据类型转换,数据格式化工作,并将ServletRequest中的消息填充到参数对象中,然后再调用Validator组件对已经绑定了请求消息数据的参数对象进行数据合法性校验,并最终生成数据绑定到BindingResult对象。BindingResult包含已经完成数据绑定的参数对象,还包含相应的校验错误对象,Spring MVC抽取BindingResult中的参数对象及校验错误对象,将它们赋值给处理方法的相应参数。

从图中我们可以看出在请求消息到达真正调用处理方法的这一段时间内,Spring MVC还会完成很多其他的工作,包括请求信息转换、数据转换、数据格式化及数据校验等。我们先来看下数据转换。

数据转换、数据格式化、数据校验

数据转换

数据转换的实现有两种方法,第一种方法是java.beans包中提供了一个ProperyEditor接口来进行数据转换,ProperyEditor的核心功能是将一个字符串转换为一个Java对象,但是存在以下不足:

  • 只能用于字符串和Java对象的转换,不适用于任意两个Java类型直接的转换。
  • 对源对象及目标对象所在的上下文信息(如注解等)不敏感,在类型转换时不能利用这些上下文信息进行高级转换逻辑。

第二种方法是Spring添加了一个通用的类型转换模块,该类型转换模块位于org.springframework.core.convert包中,这种方法可以实现任意两种类型之间的转换,弥补了ProperyEditor类型转换的缺陷。

在Spring上下文配置文件中,使用了mvc:annotation-driven标签,该标签会注册一个默认的ConversionService,即FormattingConversionServiceFactoryBean,以满足大多数类型转换的需求。在实际项目开发中,一般使用默认的转换器即可满足我们日常的开发需求了,实际中使用比较多的是数据格式化。

数据格式化

Spring使用Converter转换器进行源类型对象到目标类型对象的转换,但是Spring的转换器并不承担输入以及输出信息格式化的工作。这个时候就需要用到Spring提供的数据格式化了,格式化框架位于org.springframework.format包。实现数据的格式化,有两种方法,第一种方法是手工代码实现Formatter接口,但是这种硬编码的格式化方式现在已经过时了。第二种方法是用Spring提供的注解驱动的属性对象格式化功能。在org.springframework.format.annotation包下面定义了两个格式化的注解类型:

  • DateTimeFormat

@DateTimeFormat注解可以对java.util.Date、java.util.Calendar等时间类型的属性进行注解。

  • NumberFormat

@NumberFormat可对类似数字类型的属性进行注解。

数据校验

Spring MVC提供了强大的数据校验功能,有两种方法可以实现校验,一种方法是利用Spring自带的Validation校验框架,另一种方法是利用JSR 303(Java验证规范)。但是Validation框架通过硬编码完成数据校验,比较麻烦,所以现在项目开发一般都使用JSR 303完成数据校验。

Spring MVC上传文件与下载文件

Spring MVC为文件上传提供了直接的支持,这种支持是用即插即用的MultipartResolver实现的,Spring MVC使用Apache Commons FileUpload技术实现了一个MultipartResolver实现类:CommonsMultipartResolver,因为Spring MVC的文件上传还需要依赖Apache Commons FileUpload的组件。具体的使用在这里就不做介绍了,这里主要介绍下在实现下载文件时遇到的一个问题。先看下如下配置:

<!-- 启动注解功能 -->
<mvc:annotation-driven><!-- 设置不使用默认的消息转换器 --><mvc:message-converters register-defaults="false"<!-- 配置fastjson中实现HttpMessageConvert接口的转换器 --><bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter"><property name="supportedMediaTypes"><list><!-- 这里顺序不能反,一定先写text/html,不然IE下会出现下载提示 --><value>text/html;charset=UTF-8</value><value>application/json;charset=UTF-8</value></list></property><property name="features"><array><!-- 是否输出值为null的字段,默认为false --><value>WriteMapNullValue</value><value>WriteNullStringAsEmpty</value></array></property><property name="charset"><value>UTF-8</value></property></bean></mvc:message-converters>
</mvc:annotation-driven>

从上面的配置可以看到,设置了不使用默认的消息转换器。但是图片在下载的过程中是以二进制数据方式在传输的,因为没有对应的消息转换器进行处理,所以下载后的图片打开的时候就提示该图片已经被损坏了。解决这个问题只需要在添加一个ByteArrayHttpMessageConverter消息转换器就可以了,它的主要作用就是读写二进制数据,添加后的配置如下所示:

<!-- 启动注解功能 -->
<mvc:annotation-driven><!-- 设置不使用默认的消息转换器 --><mvc:message-converters register-defaults="false"><!-- mvc:annotation-driven默认会装配四个信息转换器,分别为StringHttpMessageConverterByteArrayHttpMessageConverterSourceHttpMessageConverterXmlAwareFormHttpMessageConverter,所以需要把这四种也给添加上去--><bean class="org.springframework.http.converter.StringHttpMessageConverter"/><bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/><bean class="org.springframework.http.converter.BufferedImageHttpMessageConverter"/><!-- 配置fastjson中实现HttpMessageConvert接口的转换器 --><bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter"><property name="supportedMediaTypes"><list><!-- 这里顺序不能反,一定先写text/html,不然IE下会出现下载提示 --><value>text/html;charset=UTF-8</value><value>application/json;charset=UTF-8</value></list></property><property name="features"><array><!-- 是否输出值为null的字段,默认为false --><value>WriteMapNullValue</value><value>WriteNullStringAsEmpty</value></array></property><property name="charset"><value>UTF-8</value></property></bean></mvc:message-converters>
</mvc:annotation-driven>

如果使用的是mvc: annotation-driven,就不需要额外添加ByteArrayHttpMessageConverter,因为默认会装配这个消息转换器的。

Spring MVC拦截器

Interceptor拦截器是Spring MVC中相当重要的功能,它的主要作用是拦截用户的请求并进行相应的处理,比如通过拦截器来进行用户权限验证,或者用来判断用户是否已经登录等。Spring MVC拦截器是可拔插式的设计,如果需要使用某个拦截器,只需要在配置文件中应用该拦截器即可。如果不需要使用该拦截器,只需要在配置文件中取消应用该拦截器。不管是否应用某个拦截器,对Spring MVC框架不会有任何影响。拦截器的拦截机制如下图所示:

从图中可以看到发送一个请求,首先要经过拦截器的,拦截器通过之后,才会到对应的Controller的。不过需要注意的是,在实际的项目开发中,我们是会根据业务需求设置拦截范围的,不是所有的请求都要进行拦截,比如只拦截/api/*这样的请求。

欢迎关注国士梅花

Spring MVC数据转换、格式化、校验、文件上传和下载相关推荐

  1. Spring MVC更多家族成员----文件上传---06

    Spring MVC更多家族成员----文件上传---06 本节导读 文件上传与MultipartResolver 使用MultipartResolver进行文件上传的简单分析 StandardSer ...

  2. ASP.NET MVC实现简单的文件上传与下载

    使用ASP.NET MVC实现简单的文件上传与下载. 1.上传文件HTML <form action='@Url.Action("Upload", "File&qu ...

  3. Spring MVC 高级技术之文件上传(multipart)

    目录 1.所需 jar 包 2.配置文件上传解析器 3.前端 Form 4.后台接收 Handler 文件上传,即处理 multipart 形式的数据. 原生 servlet 处理上传的文件数据的,s ...

  4. Mr.张小白(案例:基于Spring MVC实现文件上传和下载)

    基于Spring MVC实现文件上传和下载 一.步骤 1.引入相关依赖pom.xml <?xml version="1.0" encoding="UTF-8&quo ...

  5. Spring MVC环境中的文件上传功能实现

    在实际开发过程中,尤其是web项目开发,文件上传和下载的需求的功能非常场景,比如说用户头像.商品图片.邮件附件等等.其实文件上传下载的本质都是通过流的形式进行读写操作,而在开发中不同的框架都会对文件上 ...

  6. java spring文件下载_SpringMVC实现文件上传和下载的工具类

    本文主要目的是记录自己基于SpringMVC实现的文件上传和下载的工具类的编写,代码经过测试可以直接运行在以后的项目中. 开发的主要思路是对上传和下载文件进行抽象,把上传和下载的核心功能抽取出来分装成 ...

  7. 全栈开发实战|Spring Boot文件上传与下载

    文件上传与下载是Web应用开发中常用的功能之一.接下来我们将讨论如何在Spring Boot的Web应用开发中,如何实现文件的上传与下载. 01.Spring Boot文件上传与下载 在实际的Web应 ...

  8. Spring Boot 2.X 实现文件上传(三)

    使用 SpringBoot 项目完成单个.多个文件的上传处理,并将上传的文件保存到指定目录下. 代码演示案例 所有的 HTML 页面文件 index.html <!DOCTYPE html> ...

  9. 超详细的文件上传和下载(Spring Boot)

    超详细的文件上传和下载 前言Ⅰ:@RequestParam和@RequestPart的区别 @RequestPart @RequestPart这个注解用在multipart/form-data表单提交 ...

最新文章

  1. 在linux下部署安装Tomact并运行javaWeb工程
  2. python 打包egg_将Python程序打包到egg或WHL安装包或exe包中,把,python,成,或者,whl
  3. python 之GUI设计:Entry组件
  4. C#中获取指定路径下特定开头和后缀的所有文件
  5. [BZOJ1177][Apio2009]Oil
  6. MySQL count()函数
  7. django 返回ajax html,Django 前台通过json 取出后台数据
  8. 一行python代码查找中文同义词(synonyms)
  9. matlab2016数模a,2016年全国数学建模竞赛A题国家一等奖.pdf
  10. W3School JavaScript教程日记
  11. stemming与lemmatization
  12. 代码在线执行工具(PHP,Java,C++ 等)
  13. 题解 P2504 【[HAOI2006]聪明的猴子】
  14. 自旋玻璃(spin glass)、自旋冰(spin ice)和量子自旋液体(quantum spin liquid)(之二)
  15. 联想T440怎么把原装Win8或Win10换成Win7系统
  16. 【思考】人脸认证真的准确吗?通过身份证的人脸对比有哪些问题?
  17. 计算机要执行一条指令,cpu所涉及的操作应该包括下列的,计算机一级填空选择题与答案.doc...
  18. Git拉取指定的远程分支
  19. linux使用命令重命名_如何在Linux上使用重命名命令
  20. 零售行业常见数据分析简介

热门文章

  1. 2021海南高考成绩电话查询,2021年海南省高考成绩查询时间高招录取名单结果查询网址页面及电话.docx...
  2. C++写的mfc架构的企业级股票行情软件源码
  3. 几种开源java绘图组件介绍
  4. Python turtle库改变海龟速度的几种方法
  5. Spring Cloud 如何选择分布式配置中心
  6. 前馈神经网络原理与实现
  7. 网络与新媒体专业有前途吗
  8. 系统之家win7 32位+64位iso旗舰版系统 v12.1
  9. javaweb JAVA JSP玩具销售系统购物系统jsp购物系统购物商城系统源码(jsp电子商务系统)儿童玩具在线销售
  10. 【移动服务】快速掌握阿里云移动测试平台