Spring學習筆記2——表單數據驗證、文件上傳

来源:http://www.cnblogs.com/everSeeker/archive/2016/07/18/5680753.html
-Advertisement-
Play Games

在上一章節Spring學習筆記1——IOC: 儘量使用註解以及java代碼中,已經搭建了項目的整體框架,介紹了IOC以及mybatis。第二節主要介紹SpringMVC中的表單數據驗證以及文件上傳,歡迎訪問https://github.com/everseeker0307/register。 一、表 ...


    在上一章節Spring學習筆記1——IOC: 儘量使用註解以及java代碼中,已經搭建了項目的整體框架,介紹了IOC以及mybatis。第二節主要介紹SpringMVC中的表單數據驗證以及文件上傳,歡迎訪問https://github.com/everseeker0307/register

 

一、表單數據驗證

    用戶註冊時,需要填寫賬號、密碼、郵箱以及手機號,均為必填項,並且需要符合一定的格式。比如賬號需要32位以內,郵箱必須符合郵箱格式,手機號必須為11位號碼等。可以採用在註冊時驗證信息,或者專門寫一個工具類用來驗證;來看下在SpringMVC中如何通過簡單的註釋實現表單數據驗證。

    在javax.validation.constraints包下麵,定義了多個註解。比如:

    @NotNull: 所註解元素的值必須不能為null。註:表單中不填寫任何數據直接提交,並不意味著為null,而是空字元串。

    @Size: 所註解的元素必須為String、集合或者數組,並且長度要符合給定的範圍。

    @Past: 所註解的元素的值必須是一個過去的時間。

    @Digits: 所註解的元素必須是數字,並且它的值必須有指定的位數。

    @Pattern: 所註解的元素的值必須匹配給定的正則表達式

    另外,在org.hibernate.validator.constraints包下麵,定義了更多的註解。比如:

    @Email: 匹配email格式。

    @URL: 匹配url格式。

 

    下麵看一下在SpringMVC中如何使用。

    1、首先在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,否則會報錯。

    2、在類的屬性上添加註解,以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: 如果表單數據驗證失敗,可以顯示的錯誤信息。

    3、在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();
    }
}

    4、編寫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>

    最終效果如下:

 

二、文件上傳

    在Spring中,文件上傳很簡單,只需要3步即可。

    1、如果我們配置的DispartcherServlet繼承了AbstractAnnotationConfigDispatcherServletInitializer的話,重載customizeRegistration()方法來配置multipart的具體細節。

    @Override
    protected void customizeRegistration(ServletRegistration.Dynamic registration) {
        //限制上傳文件的大小不超過2MB,整個請求不超過4M,所有上傳的文件都要寫到磁碟中
        registration.setMultipartConfig(new MultipartConfigElement("/tmp/uploads", 2097152, 4194304, 0));
    }

  2、配置multipart解析器。

    //配置multipart解析器
    @Bean
    public MultipartResolver multipartResolver() throws IOException {
        return new StandardServletMultipartResolver();
    }

    3、處理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>

 

1、參考文獻:Spring實戰(第4版)。

2、github地址:https://github.com/everseeker0307/register


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.TreeSet原理: /* * TreeSet存儲對象的時候, 可以排序, 但是需要指定排序的演算法 * * Integer能排序(有預設順序), String能排序(有預設順序), 自定義的類存儲的時候出現異常(沒有順序) * * 如果想把自定義類的對象存入TreeSet進行排序, 那麼必須實現 ...
  • 一、在 Spring Config 文件中,在 <bean> 元素的 scope 屬性里設置 Bean 的作用域。預設為 singleton ,單例的。 二、在不引入 spring-web-4.0.0.RELEASE.jar 包的情況下,scope 屬性只有兩個值:singleton 和 proto ...
  • 1. Critical Warning (332012): Synopsys Design Constraints File file not found: 'led_test.sdc'. A Synopsys Design Constraints File is required by the T... ...
  • 首先下載所需軟體: Vc2015:https://www.microsoft.com/zh-CN/download/details.aspx?id=48145 Vc2012:http://www.microsoft.com/zh-CN/download/details.aspx?id=30679 A ...
  • 今天下了好大的雨。 這兩天總算把第二章過了。第二章主要是 指針。 算是重點吧,這也是C語言的特色啊,直接訪問物理存儲。 重點: 指針就是一個存放它指向變數地址的變數,好繞口。 區分*在定義是與引用是的作用。 區分*、&的不同。 指針是可以指向另一個指針的。 數組名也是一個存放地址,換句話說,也可以當 ...
  • 一、在 Spring IOC 容器中 Bean 之間存在繼承和依賴關係。 需要註意的是,這個繼承和依賴指的是 bean 的配置之間的關係,而不是指實際意義上類與類之間的繼承與依賴,它們不是一個概念。 二、Bean 之間的繼承關係。 1.被繼承的 ban 稱為父 bean,繼承這個父 bean 的 b ...
  • 1.php利用mysqldump備份資料庫,代碼如下: 2.通過bat運行以上php文件,bat文件內容如下: 其中: e:/wamp/php5.4.44/php.exe :php安裝路徑; e:/wamp/backup.php :要運行的php文件; zzy :要備份的資料庫; 30 :備份數據保 ...
  • 添加Jedis依賴 我們可以使用以下三種方式來添加Jedis依賴。 1、下載jar文件 從http://search.maven.org/下載最近的jedis包和Apache Commons Pool 2 2.0依賴包。 2、從源碼中構建 以下方式會構建最新的Jedis版本。 首先、克隆GitHub ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...