SpringMVC教程3
一、文件上传
1.引入相关jar包

maven坐标
<!-- fileUpload 解析上传的文件用到的jar -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
2.页面表单信息
表单提交方式必须是post方式提交,enctype必须是multipart/form-data
<form action="upload" method="post" enctype="multipart/form-data">
<table>
<tr>
<td>用户名</td>
<td><input type="text" name="username"></td>
</tr>
<tr>
<td>用户密码</td>
<td><input type="password" name="password"></td>
</tr>
<tr>
<td>用户图像</td>
<td><input type="file" name="userface"></td>
</tr>
<tr>
<td><input type="submit" value="注册"></td>
</tr>
</table>
</form>

3.Controller中接收数据
/**
* 文件上传案例
* @author dpb【波波烤鸭】
*
*/
@Controller
public class UserController {
/**
* 上传的数据通过MultipartFile对象接收
* @param username
* @param password
* @param userface
* @throws Exception
* @throws IOException
*/
@RequestMapping("/upload")
@ResponseBody
public void upload(String username,String password
,MultipartFile userface) throws Exception, IOException{
System.out.println(username+","+password);
userface.transferTo(new File("c:/tools/","123.png"));
}
}
4.配置文件中修改
<bean class="org.springframework.web.multipart.commons.CommonsMultipartResolver"
id="multipartResolver" >
<!-- 设置上传文件信息参数 -->
<!-- 设置文件上传的最大尺寸 -->
<property name="maxUploadSize">
<value>5242880</value>
</property>
</bean>
注意:
CommonsMultipartResolver这个Bean的id必须为multipartResolver,
原因:CommonsMultipartResolver Bean是在DispatcherServlet中加载的,而DispatcherServlet是通过名字来查找这个Bean的。而其他的,则是按照类型查找。
二、文件下载
1.方式一:基于ResponseEntity实现
@RequestMapping("/testHttpMessageDown")
public ResponseEntity<byte[]> download(HttpServletRequest request) throws IOException {
// 需要下载的文件
File file = new File("E://123.jpg");
byte[] body = null;
InputStream is = new FileInputStream(file);
body = new byte[is.available()];
is.read(body);
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Disposition", "attchement;filename=" + file.getName());
HttpStatus statusCode = HttpStatus.OK;
ResponseEntity<byte[]> entity = new ResponseEntity<byte[]>(body, headers, statusCode);
return entity;
}
方式二:通用下载实现
@RequestMapping("/exportExcel")
public void exportExcel(HttpServletRequest request,HttpServletResponse response) throws IOException{
File file = new File("d://owned.xls");
//设置响应头和客户端保存文件名
response.setCharacterEncoding("utf-8");
response.setContentType("multipart/form-data");
response.setHeader("Content-Disposition", "attachment;fileName=" + file.getName());
try {
//打开本地文件流
InputStream inputStream = new FileInputStream(file);
//激活下载操作
OutputStream os = response.getOutputStream();
//循环写入输出流
byte[] b = new byte[2048];
int length;
while ((length = inputStream.read(b)) > 0) {
os.write(b, 0, length);
}
// 这里主要关闭。
os.close();
inputStream.close();
} catch (Exception e){
throw e;
}
}
三、静态资源处理
在SpringMVC中,默认情况下,所有的静态资源都会被拦截(js,css。html,图片、视频、音频),对于静态资源,需要手动配置静态资源过滤。
解决这个问题的方式有两种:
3.1 在web.xml中配置default servlet
<!-- 防止资源文件被spring MVC拦截 -->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.jpg</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.css</url-pattern>
</servlet-mapping>
3.2在配置文件中通过标签设置
<!-- 防止资源文件被spring MVC拦截-->
<mvc:resources mapping="/images/**" location="/images/" cache-period="31556926"/>
<mvc:resources mapping="/js/**" location="/js/" cache-period="31556926"/>
<mvc:resources mapping="/css/**" location="/css/" cache-period="31556926"/>
例如,浏览器发送http://localhost:8080/static/img/01.png请求,该请求符合/static/img/,此时,代表01.png,那么springmvc会将01.png补充到对应的location后面,进而查找到文件。
这里需要注意:
* 表示一层路径
** 表示多层路径映射
四、数据校验
1. 为什么需要服务端校验?
最早的校验,就是服务端校验。早期的网站,用户输入一个邮箱地址,校验邮箱地址需要将地址发送到服务端,服务端进行校验,校验成功后,给前端一个响应。有了JavaScript,校验工作可以放在前端去执行。那么为什么还需要服务端校验呢? 因为前端传来的数据不可信。前端很容易获取都后端的数据接口,如果有人绕过页面,就会出现非法数据,所以服务端也要数据校验,总的来说:
1.前端校验要做,目的是为了提高用户体验
2.后端校验也要做,目的是为了数据安全
2.普通校验
Springmvc本身没有校验功能,它使用hibernate的校验框架,hibernate的校验框架和orm没有关系
2.1创建项目
2.2引入相关jar包

如果是maven项目对应的maven坐标是:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.3.0.Alpha1</version>
</dependency>
2.3创建properties文件
属性文件用来声明错误提示信息

如果属性文件乱码的解决办法:
在Eclipse主界面下,打开Window->Perferences->General->ContentTypes:

2.4在springmvc的配置文件中配置如下
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<mvc:annotation-driven validator="validator"></mvc:annotation-driven>
<context:component-scan base-package="com.dpb.controller"></context:component-scan>
<!--添加对JSR-303验证框架的支持 -->
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<property name="providerClass" value="org.hibernate.validator.HibernateValidator"/>
<!--不设置则默认为classpath下的 ValidationMessages.properties -->
<property name="validationMessageSource" ref="validatemessageSource"/>
</bean>
<bean id="validatemessageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basename" value="classpath:ValidateMessages"/>
<property name="fileEncodings" value="utf-8"/>
<property name="cacheSeconds" value="120"/>
</bean>
</beans>

2.5Bean对象中配置校验规则
@NotBlank(message="{user.username.empty}")
@Size(max=6,min=3,message="{user.username.size}")
private String username;
@Size(max=6,min=3,message="{user.password.size}")
private String password;
校验规则
| 注解 | 说明 |
|---|---|
| @Null | 被注解的元素必须为 null |
| @NotNull | 被注解的元素必须不为 null |
| @AssertTrue | 被注解的元素必须为 true |
| @AssertFalse | 被注解的元素必须为 false |
| @Min(value) | 被注解的元素必须是一个数字,其值必须大于等于指定的最小值 |
| @Max(value) | 被注解的元素必须是一个数字,其值必须小于等于指定的最大值 |
| @DecimalMin(value) | 被注解的元素必须是一个数字,其值必须大于等于指定的最小值 |
| @DecimalMax(value) | 被注解的元素必须是一个数字,其值必须小于等于指定的最大值 |
| @Size(max=, min=) | 被注解的元素的大小必须在指定的范围内 |
| @Digits (integer, fraction) | 被注解的元素必须是一个数字,其值必须在可接受的范围内 |
| @Past | 被注解的元素必须是一个过去的日期 |
| @Future | 被注解的元素必须是一个将来的日期 |
| @Pattern(regex=,flag=) | 被注解的元素必须符合指定的正则表达式 |
| @NotBlank(message =) | 验证字符串非null,且长度必须大于0 |
| 被注解的元素必须是电子邮箱地址 | |
| @Length(min=,max=) | 被注解的字符串的大小必须在指定的范围内 |
| @NotEmpty | 被注解的字符串的必须非空 |
| @Range(min=,max=,message=) | 被注解的元素必须在合适的范围内 |
2.6Controller中校验
/**
* 数据校验案例
*
* @author dpb【波波烤鸭】
*
*/
@Controller
public class UserController {
/**
* @Validated book 表示book接收的数据需要根据指定的规则进行校验
* BindingResult 封装验证结果,必须紧跟在验证变量之后,
* 如果有多个信息需要验证那么就有多个BindingResult参数
*
*/
@RequestMapping("/add")
public String add(@Validated Book book,BindingResult br,Model m){
System.out.println(book);
// 获取验证信息
List<ObjectError> allErrors = br.getAllErrors();
for (ObjectError objectError : allErrors) {
System.out.println(objectError.getDefaultMessage());
}
// 将验证信息保存到作用域中
m.addAttribute("errors", allErrors);
return "/index.jsp";
}
}
2.7jsp页面中获取错误信息
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
hello world<br/>
<c:if test="${errors ne null }">
<c:forEach items="${errors}" var="e">
${e.defaultMessage}<br>
</c:forEach>
</c:if>
</body>
</html>
2.8测试



3.分组校验
为什么需要分组校验?
因为一个对象有多个属性,而不同的controller校验的需求是不一样的,必须c1只需要校验对象的账号是否为空就可以了,而c2不光要校验账号为空还需要校验手机号必须不能为空,这时分组校验就能解决这个问题了。实现步骤如下:
3.1定义分组

package com.dpb.group;
/**
* 定义的两个接口什么都没定义为标志接口
* @author dpb【波波烤鸭】
*
*/
public interface GroupInferface1 {
}
3.2使用分组
@NotBlank(message="{user.username.empty}"
,groups={GroupInferface2.class})
@Size(max=6,min=3,message="{user.username.size}"
,groups={GroupInferface1.class})
private String username;
@Size(max=6,min=3,message="{user.password.size}"
,groups={GroupInferface1.class})
private String password;
3.3controller中使用
/**
* @Validated book 表示book接收的数据需要根据指定的规则进行校验
* BindingResult 封装验证结果,必须紧跟在验证变量之后,
* 如果有多个信息需要验证那么就有多个BindingResult参数
*
*/
@RequestMapping("/add1")
public String add1(@Validated(value=GroupInferface1.class) Book book,BindingResult br,Model m){
System.out.println(book);
// 获取验证信息
List<ObjectError> allErrors = br.getAllErrors();
for (ObjectError objectError : allErrors) {
System.out.println(objectError.getDefaultMessage());
}
// 将验证信息保存到作用域中
m.addAttribute("errors", allErrors);
return "/index.jsp";
}

3.4测试
第一种情况

第二种情况:

上一篇:SpringMVC教程2
下一篇:SpringMVC教程4
SpringMVC教程3的更多相关文章
- SpringMVC教程4
SpringMVC教程3 一.数据回写 数据回写:在做数据更新的时候服务端查询的数据自动填充到表单中. 1.1默认方式 通过前面讲解的 Map Mode ModelMap绑定数据 @RequestMa ...
- SpringMVC教程1
一.SpringMVC介绍 1.MVC介绍 ==模型-视图-控制器(MVC== 是一个众所周知的以设计界面应用程序为基础的设计模式.它主要通过分离模型.视图及控制器在应用程序中的角色将业务逻辑从界面中 ...
- SpringMVC教程2
接上篇文章-SpringMVC教程1 五.基本操作 1.响应请求的方式 1.1ModeAndView /** * 查询方法 * @return */ @RequestMapping("/qu ...
- Java系列教程-SpringMVC教程
SpringMVC教程 1.SpringMVC概述 1.回顾MVC 1.什么是MVC MVC是模型(Model).视图(View).控制器(Controller)的简写,是一种软件设计规范. 是将业务 ...
- SpringMVC教程--Idea中使用Maven创建SpringMVC项目
1.新建项目 参照idea教程中的创建maven项目https://www.cnblogs.com/daxiang2008/p/9061653.html 2.POM中加入依赖包 (1)指定版本 (2) ...
- myeclipse配置springmvc教程
之前一直是使用Eclipse创建Web项目,用IDEA和MyEclipse的创建SpringMVC项目的时候时不时会遇到一些问题,这里把这个过程记录一下,希望能帮助到那些有需要的朋友.我是用的是MyE ...
- springmvc教程(1)
idea搭建springmvc maven项目 jdk:1.8 maven:Bundled (Maven 3) idea版本: 开始搭建第一个springmvc maven项目 1.点击File-&g ...
- SpringMVC教程--eclipse中使用maven创建springMVC项目
一.在eclipse中创建maven-archetype-webapp项目: 1.新建项目选择maven项目 2.默认,下一步 3.选择maven-archetype-webapp,其他保持默认即可 ...
- SpringMVC 教程 - Controller
原文地址:https://www.codemore.top/cates/Backend/post/2018-04-10/spring-mvc-controller 声明Controller Contr ...
随机推荐
- oracle 为什么没有权限的用户也可以用sysdba登录
我随便创建了一个用户,create user lisi identified by lisi; 当我用sqlplus登录的时候: cmd -> sqlplus lisi/lisi 进不去 ...
- 消息模式Toast.makeText的几种常见用法
Toast 是一个 View 视图,快速的为用户显示少量的信息. Toast 在应用程序上浮动显示信息给用户,它永远不会获得焦点,不影响用户的输入等操作,主要用于 一些帮助 / 提示. Toast 最 ...
- spring-boot json数据交互
SpringBoot学习之Json数据交互 最近在弄监控主机项目,对javaweb又再努力学习.实际的项目场景中,前后分离几乎是所以项目的标配,全栈的时代的逐渐远去,后端负责业务逻辑处理,前端负责数据 ...
- 64位版本为什么叫amd64,而不是intel64
64位版本为什么叫amd64,而不是intel64? 首先了解下常见的几个架构: X86是一个指令集,是刚有个人电脑时候的什么8086,286,386的那个兼容的指令集. “x86-64”,有时会 ...
- Python语言中的按位运算
(转)位操作是程序设计中对位模式或二进制数的一元和二元操作. 在许多古老的微处理器上, 位运算比加减运算略快, 通常位运算比乘除法运算要快很多. 在现代架构中, 情况并非如此:位运算的运算速度通常与加 ...
- Unity3D中播放视频的方法
播放视频其实和贴图非常相像,因为播放视频用到的 MovieTexture 属于贴图 Texture 的子类.Unity3D 支持的视频格式有很多,但是还是建议使用 ogv 格式的视频,使用其他格式依然 ...
- java易错题
(选择二项) 8 A: B: C: D: (选择一项) 9 A: B: C: D: 正确答案是 A 您回答的是 B 回答错误 正确答案是 B,D 您回答的是 A,C 回答错误 (选择一项) 18 A: ...
- 使用 Resharper 快速做适配器
如果需要做一个类的重写,需要重新写这个类的所有属性和函数,本文提供一个简单的方法让大家快速重写一个类的所有属性和函数. 在有 Resharper 之后,对一个比较长的类进行重构.例如有这个类 clas ...
- LCA(最近公共祖先)——Tarjan
什么是最近公共祖先? 在一棵没有环的树上,每个节点肯定有其父亲节点和祖先节点,而最近公共祖先,就是两个节点在这棵树上深度最大的公共的祖先节点. 换句话说,就是两个点在这棵树上距离最近的公共祖先节点. ...
- JS应用实例6:二级联动
本案例很常用,应用场景:注册页面填写籍贯,省市二级联动 总体思想:创建一个二维数组存入省市,获取选中的省份并比较,创建标签遍历添加 代码: <!DOCTYPE html> <html ...