{"id":21974118,"url":"https://github.com/javaobjects/demo_springmvc_validate","last_synced_at":"2025-07-24T06:33:43.276Z","repository":{"id":105562435,"uuid":"193620190","full_name":"javaobjects/demo_springMVC_validate","owner":"javaobjects","description":"springMVC服务端数据校验如何实现","archived":false,"fork":false,"pushed_at":"2019-06-25T12:10:04.000Z","size":6693,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-01-28T03:17:17.011Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/javaobjects.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-06-25T02:33:54.000Z","updated_at":"2021-04-04T06:31:00.000Z","dependencies_parsed_at":null,"dependency_job_id":"3346d019-fae7-4d1a-a4d3-6c4c72587494","html_url":"https://github.com/javaobjects/demo_springMVC_validate","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/javaobjects%2Fdemo_springMVC_validate","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/javaobjects%2Fdemo_springMVC_validate/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/javaobjects%2Fdemo_springMVC_validate/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/javaobjects%2Fdemo_springMVC_validate/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/javaobjects","download_url":"https://codeload.github.com/javaobjects/demo_springMVC_validate/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245033763,"owners_count":20550328,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-29T15:38:19.651Z","updated_at":"2025-03-22T23:25:39.229Z","avatar_url":"https://github.com/javaobjects.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 64-Java-springMVC服务端数据校验如何实现?\r\n\r\n1. 新建一个动态web工程 命名 **demo_springMVC_validate**\r\n\r\n![](64-Images/1.png)\r\n\r\n2. 导入对应的jar包并添加到内路径\r\n\r\n![](64-Images/2.png)\r\n\r\n![](64-Images/3.png)\r\n\r\n3. 导入对应的配置文件\r\n\r\n![](64-Images/4.png)\r\n\r\n**springmvc-servlet.xml**\r\n\r\n```\r\n\u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\r\n\r\n\u003cbeans xmlns=\"http://www.springframework.org/schema/beans\"\r\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:context=\"http://www.springframework.org/schema/context\"\r\n\txmlns:mvc=\"http://www.springframework.org/schema/mvc\" xmlns:aop=\"http://www.springframework.org/schema/aop\"\r\n\txsi:schemaLocation=\"http://www.springframework.org/schema/beans\r\n           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd\r\n           http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd\r\n           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd\r\n           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd\"\u003e\r\n\r\n\t\u003cbean\r\n\t\tclass=\"org.springframework.web.servlet.view.InternalResourceViewResolver\"\u003e\r\n\t\t\u003cproperty name=\"prefix\" value=\"/\"\u003e\u003c/property\u003e\r\n\t\t\u003cproperty name=\"suffix\" value=\".jsp\"\u003e\u003c/property\u003e  \u003c!-- /WEB-INF/index.jsp --\u003e\r\n\t\u003c/bean\u003e\r\n\r\n\t\u003cmvc:annotation-driven conversion-service=\"conversionService\" validator=\"validator\"\u003e\u003c/mvc:annotation-driven\u003e\r\n\r\n\t\u003c!-- 定义校验器bean --\u003e\r\n\t\u003cbean id=\"validator\"\r\n\t\tclass=\"org.springframework.validation.beanvalidation.LocalValidatorFactoryBean\"\u003e\r\n\t\t\u003cproperty name=\"providerClass\" value=\"org.hibernate.validator.HibernateValidator\"\u003e\u003c/property\u003e\r\n\t\t\u003cproperty name=\"validationMessageSource\" ref=\"messageSource\"\u003e\u003c/property\u003e\r\n\t\u003c/bean\u003e\r\n\r\n\u003c!-- 定义校验出错的信息提示文件 --\u003e\r\n\t\u003cbean id=\"messageSource\"\r\n\t\tclass=\"org.springframework.context.support.ReloadableResourceBundleMessageSource\"\u003e\r\n\t\t\u003cproperty name=\"basenames\"\u003e\r\n\t\t\t\u003clist\u003e\r\n\t\t\t\t\u003cvalue\u003eclasspath:customerValidationMessages\u003c/value\u003e\r\n\t\t\t\u003c/list\u003e\r\n\t\t\u003c/property\u003e\r\n\t\t\u003cproperty name=\"fileEncodings\" value=\"utf-8\"\u003e\u003c/property\u003e\r\n\t\u003c/bean\u003e\r\n\r\n\r\n\t\u003cbean id=\"conversionService\"\r\n\t\tclass=\"org.springframework.format.support.FormattingConversionServiceFactoryBean\"\u003e\r\n\t\t\u003cproperty name=\"converters\"\u003e\r\n\t\t\t\u003clist\u003e\r\n\t\t\t\t\u003cbean class=\"net.neuedu.demo.converter.CustomerDateConverter\"\u003e\u003c/bean\u003e\r\n\t\t\t\u003c/list\u003e\r\n\t\t\u003c/property\u003e\r\n\r\n\t\u003c/bean\u003e\r\n\r\n\t\u003ccontext:component-scan base-package=\"net.neuedu.demo.controller\"\u003e\u003c/context:component-scan\u003e\r\n\u003c/beans\u003e\r\n```\r\n\r\n**web.xml**\r\n\r\n```\r\n\u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\r\n\u003cweb-app xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://xmlns.jcp.org/xml/ns/javaee\" xsi:schemaLocation=\"http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd\" version=\"3.1\"\u003e\r\n  \u003cdisplay-name\u003edemo_springMVC_helloworld\u003c/display-name\u003e\r\n  \u003cservlet\u003e\r\n    \u003cservlet-name\u003espringmvc\u003c/servlet-name\u003e\r\n    \u003cservlet-class\u003eorg.springframework.web.servlet.DispatcherServlet\u003c/servlet-class\u003e\r\n  \u003c/servlet\u003e\r\n  \u003cservlet-mapping\u003e\r\n    \u003cservlet-name\u003espringmvc\u003c/servlet-name\u003e\r\n    \u003curl-pattern\u003e*.do\u003c/url-pattern\u003e\r\n  \u003c/servlet-mapping\u003e\r\n  \u003cwelcome-file-list\u003e\r\n    \u003cwelcome-file\u003eindex.html\u003c/welcome-file\u003e\r\n    \u003cwelcome-file\u003eindex.htm\u003c/welcome-file\u003e\r\n    \u003cwelcome-file\u003eindex.jsp\u003c/welcome-file\u003e\r\n    \u003cwelcome-file\u003edefault.html\u003c/welcome-file\u003e\r\n    \u003cwelcome-file\u003edefault.htm\u003c/welcome-file\u003e\r\n    \u003cwelcome-file\u003edefault.jsp\u003c/welcome-file\u003e\r\n  \u003c/welcome-file-list\u003e\r\n\u003c/web-app\u003e\r\n```\r\n\r\n4. 新建包 **net.ptcs.demo.controller**\r\n\r\n![](64-Images/5.png)\r\n\r\n\r\n5. 新建Jsp页面 **add_book.jsp**\r\n\r\n![](64-Images/6.png)\r\n\r\n```\r\n\u003c%@ page language=\"java\" contentType=\"text/html; charset=UTF-8\"\r\n\tpageEncoding=\"UTF-8\"%\u003e\r\n\u003c%@taglib prefix=\"c\" uri=\"http://java.sun.com/jsp/jstl/core\"%\u003e\r\n\u003c!DOCTYPE html\u003e\r\n\u003chtml\u003e\r\n\u003chead\u003e\r\n\u003cmeta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"\u003e\r\n\u003ctitle\u003e添加图书页面\u003c/title\u003e\r\n\u003c/head\u003e\r\n\u003cbody\u003e\r\n\t\u003cform action=\"\u003c%=request.getContextPath()%\u003e/book/addBook.do\"\r\n\t\tmethod=\"post\"\u003e\r\n\r\n\t\t\u003cc:if test=\"${errors!=null}\"\u003e\r\n\t\t\t\u003cc:forEach items=\"${errors}\" var=\"e\"\u003e\r\n\t\t\t\t${e.defaultMessage}\u003cbr\u003e\r\n\t\t\t\u003c/c:forEach\u003e\r\n\t\t\u003c/c:if\u003e\r\n\r\n\r\n\t\tbookId:\u003cinput type=\"text\" name=\"bookId\" /\u003e\u003cbr\u003e bookName:\u003cinput\r\n\t\t\ttype=\"text\" name=\"bookName\" /\u003e\u003cbr\u003e intoStoreTime:\u003cinput\r\n\t\t\ttype=\"text\" name=\"intoStoreTime\" /\u003e\u003cbr\u003e publishName:\u003cinput\r\n\t\t\ttype=\"text\" name=\"publishName\" /\u003e\u003cbr\u003e price:\u003cinput type=\"text\"\r\n\t\t\tname=\"price\" /\u003e\u003cbr\u003e \u003cinput type=\"submit\" value=\"添加\" /\u003e\r\n\r\n\t\u003c/form\u003e\r\n\u003c/body\u003e\r\n\u003c/html\u003e\r\n```\r\n此时报错信息如下：\r\n\r\n![](64-Images/7.png)\r\n\r\n```\r\nMultiple annotations found at this line:\r\n\t- The superclass \"javax.servlet.http.HttpServlet\" was not found on the Java \r\n\t Build Path\r\n\t- Line breakpoint:add_book.jsp [line: 1]\r\n```\r\n**解决方法：**\r\n项目右键 ----\u003e Configure Build Path -----\u003e Java Build Path ---\u003e Add Library ---\u003e Server RunTime ----\u003e Next ---\u003e Apache Tomcat v8.0 ---\u003e Finish ---\u003e Apply ---\u003e Apply and close \r\n\r\n![](64-Images/8.png)\r\n![](64-Images/9.png)\r\n![](64-Images/10.png)\r\n\r\n最后成功解决咯报错，如图所示\r\n\r\n![](64-Images/11.png)\r\n\r\n6. 新建一个 **Book** 实体类\r\n\r\n![](64-Images/12.png)\r\n\r\n```\r\npackage net.ptcs.demo.entity;\r\n\r\nimport java.util.Date;\r\n\r\nimport javax.validation.constraints.DecimalMin;\r\nimport javax.validation.constraints.Digits;\r\nimport javax.validation.constraints.NotBlank;\r\nimport javax.validation.constraints.NotNull;\r\nimport javax.validation.constraints.Pattern;\r\nimport javax.validation.constraints.Size;\r\n\r\npublic class Book {\r\n\t/*bookId:非空校验，整数校验，大于0的校验\r\n\t * bookName:非空校验，不能有非法字符（符合书名的正则表达式规范）\r\n\t * intoStoreTime：非空校验\r\n\t * publishName：非空校验，不能有非法字符（符合出版社名的正则表达式规范）\r\n\t * price：非空校验，大于0，小数校验*/\r\n\t\r\n\t@NotNull(message=\"{book.bookId.isNull}\")\r\n\tprivate Integer bookId;\r\n\t@NotBlank(message=\"{book.bookName.isNull}\")\r\n\t@Size(min=3,max=40,message=\"{book.bookName.size}\")\r\n\tprivate String bookName;\r\n\t@NotNull(message=\"{book.intoStoreTime.isNull}\")\r\n\tprivate Date intoStoreTime;\r\n\t@NotBlank(message=\"{book.publishName.isNull}\")\r\n\tprivate String publishName;\r\n\t\r\n\t\r\n\t@Pattern(regexp = \"^1(3|4|5|7|8)\\\\d{9}$\",message = \"手机号码格式错误\")\r\n\t@NotBlank(message = \"手机号码不能为空\")\r\n\tprivate String phone;\r\n\t\r\n\t\r\n\t@NotNull(message=\"{book.price.isNull}\")//对于数字校验是否为空使用@NotNull,String类型使用@NotBlank list类型使用@NotEmpty\r\n\t@Digits(fraction = 2, integer = 100, message=\"{book.price.error}\")//对于小数进行校验，限定整数数位integer和小数数位fraction\r\n\t@DecimalMin(value = \"0\", message=\"{book.price.value}\")//对值进行校验，必须大于等于value的值\r\n\tprivate Double price;\r\n\r\n\tpublic Book() {\r\n\t\tsuper();\r\n\t}\r\n\r\n\tpublic String getPhone() {\r\n\t\treturn phone;\r\n\t}\r\n\r\n\tpublic void setPhone(String phone) {\r\n\t\tthis.phone = phone;\r\n\t}\r\n\r\n\t@Override\r\n\tpublic String toString() {\r\n\t\treturn \"Book [bookId=\" + bookId + \", bookName=\" + bookName\r\n\t\t\t\t+ \", intoStoreTime=\" + intoStoreTime + \", publishName=\"\r\n\t\t\t\t+ publishName + \", price=\" + price + \"]\";\r\n\t}\r\n\r\n\tpublic Book(Integer bookId, String bookName, Date intoStoreTime,\r\n\t\t\tString publishName, Double price) {\r\n\t\tsuper();\r\n\t\tthis.bookId = bookId;\r\n\t\tthis.bookName = bookName;\r\n\t\tthis.intoStoreTime = intoStoreTime;\r\n\t\tthis.publishName = publishName;\r\n\t\tthis.price = price;\r\n\t}\r\n\r\n\tpublic Integer getBookId() {\r\n\t\treturn bookId;\r\n\t}\r\n\r\n\tpublic void setBookId(Integer bookId) {\r\n\t\tthis.bookId = bookId;\r\n\t}\r\n\r\n\tpublic String getBookName() {\r\n\t\treturn bookName;\r\n\t}\r\n\r\n\tpublic void setBookName(String bookName) {\r\n\t\tthis.bookName = bookName;\r\n\t}\r\n\r\n\tpublic Date getIntoStoreTime() {\r\n\t\treturn intoStoreTime;\r\n\t}\r\n\r\n\tpublic void setIntoStoreTime(Date intoStoreTime) {\r\n\t\tthis.intoStoreTime = intoStoreTime;\r\n\t}\r\n\r\n\tpublic String getPublishName() {\r\n\t\treturn publishName;\r\n\t}\r\n\r\n\tpublic void setPublishName(String publishName) {\r\n\t\tthis.publishName = publishName;\r\n\t}\r\n\r\n\tpublic Double getPrice() {\r\n\t\treturn price;\r\n\t}\r\n\r\n\tpublic void setPrice(Double price) {\r\n\t\tthis.price = price;\r\n\t}\r\n}\r\n```\r\n7. 在 net.ptcs.demo.controller 内下新建 BookController类\r\n\r\n```\r\npackage net.ptcs.demo.controller;\r\n\r\nimport java.util.List;\r\n\r\nimport org.springframework.stereotype.Controller;\r\nimport org.springframework.ui.Model;\r\nimport org.springframework.validation.BindingResult;\r\nimport org.springframework.validation.ObjectError;\r\nimport org.springframework.validation.annotation.Validated;\r\nimport org.springframework.web.bind.annotation.RequestMapping;\r\n\r\nimport net.ptcs.demo.entity.Book;\r\n\r\n/**\r\n * 图书管理模块的控制器，也叫做处理器\r\n* \u003cp\u003eTitle: BookController\u003c/p\u003e  \r\n* \u003cp\u003eDescription: \u003c/p\u003e  \r\n* @author xianxian \r\n* @date 2019年6月25日\r\n*/\r\n\r\n@Controller\r\n@RequestMapping(\"book\")\r\npublic class BookController {\r\n\t/**\r\n\t * use:处理页面添加图书的请求\r\n\t * \r\n\t * 今天我们的需求：\r\n\t * 1.在处理添加图书请求前对book对象中的属性进行校验：\r\n\t * bookId:非空校验，整数校验，大于0的校验\r\n\t * bookName:非空校验，不能有非法字符（符合书名的正则表达式规范）\r\n\t * intoStoreTime：非空校验\r\n\t * publishName：非空校验，不能有非法字符（符合出版社名的正则表达式规范）\r\n\t * price：非空校验，大于0，小数校验\r\n\t * \r\n\t * 2.校验的时机：addBook方法调用之前校验，如果校验通过那么继续，没有通过那么返回页面，提示出错信息\r\n\t * \r\n\t * @param book\r\n\t * @return\r\n\t */\r\n\t@RequestMapping(\"addBook.do\")\r\n\tpublic String addBook(@Validated Book book,BindingResult bindingResult,Model model)\r\n\t{\r\n\t\tList\u003cObjectError\u003e errors=bindingResult.getAllErrors();\r\n\t\t\r\n\t\tif(errors.size()\u003e0)\r\n\t\t{\r\n\t\t\t//校验失败\r\n//\t\t\t把出错信息传给页面\r\n\t\t\tmodel.addAttribute(\"errors\", errors);\r\n\t\t\tmodel.addAttribute(\"book\", book);\r\n\t\t\treturn \"add_book\";//   /+add_book+.jsp\r\n\t\t}else\r\n\t\t{\r\n\t\t\t//校验成功\r\n\t\t\tSystem.out.println(\"into addBook()方法。。。。。\");\r\n\t\t\tSystem.out.println(\"book:\"+book);\r\n\t\t\treturn \"\";\r\n\t\t}\r\n\t}\r\n}\r\n```\r\n\r\n8. **src** 目录下新建一个 **customerValidationMessages.properties**\r\n\r\n```\r\nbook.bookId.isNull=\\u56FE\\u4E66\\u7F16\\u53F7\\u4E0D\\u80FD\\u4E3A\\u7A7A\r\nbook.bookName.isNull=\\u56FE\\u4E66\\u540D\\u79F0\\u4E0D\\u80FD\\u4E3A\\u7A7A\r\nbook.intoStoreTime.isNull=\\u5165\\u5E93\\u65F6\\u95F4\\u4E0D\\u80FD\\u4E3A\\u7A7A\r\nbook.publishName.isNull=\\u51FA\\u7248\\u793E\\u540D\\u79F0\\u4E0D\\u80FD\\u4E3A\\u7A7A\r\nbook.price.isNull=\\u4EF7\\u683C\\u4E0D\\u80FD\\u4E3A\\u7A7A\r\nbook.bookName.size=\\u56FE\\u4E66\\u540D\\u79F0\\u957F\\u5EA6\\u6700\\u5C0F\\u662F3\\uFF0C\\u6700\\u5927\\u662F40\r\nbook.price.isNull=\\u4E66\\u7684\\u4EF7\\u683C\\u4E0D\\u80FD\\u4E3A\\u7A7A\r\nbook.price.error=\\u4E66\\u7684\\u4EF7\\u683C\\u683C\\u5F0F\\u9519\\u8BEF\r\nbook.price.value=\\u4E66\\u7684\\u4EF7\\u683C\\u5FC5\\u987B\\u5927\\u4E8E0\r\n```\r\n9. 新建 net.ptcs.demo.converter 包下的 CustomerDateConverter 类\r\n\r\n```\r\npackage net.ptcs.demo.converter;\r\n\r\nimport java.text.ParseException;\r\nimport java.text.SimpleDateFormat;\r\nimport java.util.Date;\r\n\r\nimport org.springframework.core.convert.converter.Converter;\r\n\r\npublic class CustomerDateConverter implements Converter\u003cString,Date\u003e {\r\n\t@Override\r\n\tpublic Date convert(String source) {\r\n\t\tDate date=null;\r\n\t\tif(source!=null \u0026\u0026 !\"\".equals(source))\r\n\t\t{\r\n\t\t\tSimpleDateFormat sdf=new SimpleDateFormat(\"yyyy-MM-dd\");\r\n\t\t\ttry {\r\n\t\t\t\tdate=sdf.parse(source);\r\n\t\t\t} catch (ParseException e) {\r\n\t\t\t\te.printStackTrace();\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn date;\r\n\t}\r\n}\r\n```\r\n10. 运行并测试\r\n\r\n出现如下报错：\r\n\r\n![](64-Images/13.png)\r\n\r\n**原因：** \r\n\r\nspringmvc-servlet.xml 中的 value 值与配置文件名不一致\r\n\r\n![](64-Images/14.png)\r\n\r\n**解决：**\r\n\r\n```\r\n将这两名字更改为统一\r\n```\r\n**如图所示，测试成功**\r\n\r\n![](64-Images/15.png)\r\n\r\n\r\n**以就就是我关于 Java-springMVC服务端数据校验如何实现?  知识点的整理与总结的全部内容 [另附源码链接](https://github.com/javaobjects/demo_springMVC_validate)**\r\n\r\n==================================================================\r\n#### 分割线\r\n==================================================================\r\n\r\n**博主为咯学编程：父母不同意学编程，现已断绝关系;恋人不同意学编程，现已分手;亲戚不同意学编程，现已断绝来往;老板不同意学编程,现已失业三十年。。。。。。如果此博文有帮到你欢迎打赏，金额不限。。。**\r\n\r\n![](https://upload-images.jianshu.io/upload_images/5227364-0824589594f944c7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjavaobjects%2Fdemo_springmvc_validate","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjavaobjects%2Fdemo_springmvc_validate","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjavaobjects%2Fdemo_springmvc_validate/lists"}