一、文件上傳
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