在上一章節Spring學習筆記1——IOC: 儘可能使用註解以及java代碼中,已經搭建了項目的總體框架,介紹了IOC以及mybatis。第二節主要介紹SpringMVC中的表單數據驗證以及文件上傳。css
1、表單數據驗證html
用戶註冊時,須要填寫帳號、密碼、郵箱以及手機號,均爲必填項,而且須要符合必定的格式。好比帳號須要32位之內,郵箱必須符合郵箱格式,手機號必須爲11位號碼等。能夠採用在註冊時驗證信息,或者專門寫一個工具類用來驗證;來看下在SpringMVC中如何經過簡單的註釋實現表單數據驗證。java
在javax.validation.constraints包下面,定義了多個註解。好比:git
@NotNull: 所註解元素的值必須不能爲null。注:表單中不填寫任何數據直接提交,並不意味着爲null,而是空字符串。web
@Size: 所註解的元素必須爲String、集合或者數組,而且長度要符合給定的範圍。正則表達式
@Past: 所註解的元素的值必須是一個過去的時間。spring
@Digits: 所註解的元素必須是數字,而且它的值必須有指定的位數。api
@Pattern: 所註解的元素的值必須匹配給定的正則表達式數組
另外,在org.hibernate.validator.constraints包下面,定義了更多的註解。好比:session
@Email: 匹配email格式。
@URL: 匹配url格式。
下面看一下在SpringMVC中如何使用。
一、首先在pom.xml文件中載入須要的
<dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>1.1.0.Final</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>5.2.4.Final</version> </dependency>
須要注意的是,javax.validation只是定義了校驗API,必須添加API的實現才行,好比org.hibernate.validator,不然會報錯。
二、在類的屬性上添加註解,以User.java爲例。
public class User implements Serializable { @Size(min = 32, max = 32, message = "uuid應該爲32位字符串") private String id; @Size(min = 1, max = 32, message = "帳號長度應該在1-32位之間") private String username; @NotEmpty(message = "密碼不能爲空") private String password; @NotEmpty(message = "email不能爲空") @Email(message = "email格式不正確") private String email; @Size(min = 11, max = 11, message = "手機號長度爲11位") private String cellphone; }
message: 若是表單數據驗證失敗,能夠顯示的錯誤信息。
三、在UserController中應用校驗功能,添加@Valid註解便可。以UserController.java爲例:
@Controller @RequestMapping("/user") public class UserController { private UserService userService; @Autowired public UserController(UserService userService) { this.userService = userService; } @RequestMapping(value = "/register", method = RequestMethod.POST) public String processRegistration(@Valid User user, Errors errors) { //@Valid,user對象應用校驗功能 if (errors.hasErrors()) { //若是表單驗證失敗,返回註冊頁面 return "register"; } if (user.getId() == "") user.setId(UUID.randomUUID().toString().replaceAll("-", "")); if (user.getRegDate() == 0) user.setRegDate(new Date().getTime()); userService.addUser(user); return "redirect:/user/" + user.getUsername(); } }
四、編寫jsp文件,展現頁面,以register.jsp爲例:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="sf" uri="http://www.springframework.org/tags/form" %> <%@ page session="false" %> <html lang="en"> <head> <title>Register</title> <link rel="stylesheet" type="text/css" href="<c:url value="/resources/style.css" />" > </head> <body> <sf:form method="POST" action="/register/user/register" commandName="user"> <%-- 若是表單數據驗證失敗,顯示錯誤信息 --%> <sf:errors path="*" element="div" cssClass="errors"/><br /> <table align="center"> <tr> <td>UserName: </td> <td><sf:input path="username" cssErrorClass="errors"/></td> </tr> <tr> <td>Password: </td> <td><sf:password path="password" cssErrorClass="errors"/></td> </tr> <tr> <td>Email: </td> <td><sf:input path="email" cssErrorClass="errors"/></td> </tr> <tr> <td>CellPhone: </td> <td><sf:input path="cellphone" cssErrorClass="errors"/></td> </tr> </table><br /> <input type="submit" value="Register"/> </sf:form> </body> </html>
最終效果以下:
2、文件上傳
在Spring中,文件上傳很簡單,只須要3步便可。
一、若是咱們配置的DispartcherServlet繼承了AbstractAnnotationConfigDispatcherServletInitializer的話,重載customizeRegistration()方法來配置multipart的具體細節。
@Override protected void customizeRegistration(ServletRegistration.Dynamic registration) { //限制上傳文件的大小不超過2MB,整個請求不超過4M,全部上傳的文件都要寫到磁盤中 registration.setMultipartConfig(new MultipartConfigElement("/tmp/uploads", 2097152, 4194304, 0)); }
二、配置multipart解析器。
//配置multipart解析器 @Bean public MultipartResolver multipartResolver() throws IOException { return new StandardServletMultipartResolver(); }
三、處理multipart請求。對於用戶上傳的文件等信息,能夠用byte[]數組來表示,但更推薦Spring提供的MultipartFile接口。它提供了更多功能,好比獲取文件名、文件大小、文件類型等。
@RequestMapping(value = "/{username}", method = RequestMethod.POST) public String showUserInfo(@RequestPart("icon") MultipartFile icon) throws IOException { icon.transferTo(new File("/Users/pingping/Projects/IdeaProjects/spring/register/src/main/webapp/uploads/" + icon.getOriginalFilename())); return "user"; }
transferTo(File dest)方法: 將文件寫入到系統中。
寫個頁面測試,看指定的文件目錄下文件是否已上傳成功。
<form method="post" enctype="multipart/form-data"> <label>上傳頭像圖片?</label> <input type="file" name="icon" accept="image/jpeg, image/png" value="選擇文件"/> <button type="submit">肯定</button> </form>
一、參考文獻:Spring實戰(第4版)。