JSP+Servlet实现省市区三级联动
1、location.jsp
1 | <%@ page contentType="text/html;charset=UTF-8" language="java" %> |
2、Location.java
1 | package com.huan.entity; |
3、LocationServlet.java
1 | package com.huan.servlet; |
胆小认生,但好相处
1、location.jsp
1 | <%@ page contentType="text/html;charset=UTF-8" language="java" %> |
2、Location.java
1 | package com.huan.entity; |
3、LocationServlet.java
1 | package com.huan.servlet; |
1、input标签的type设置为file
2、form的method设置为post,如果使用get请求会将文件名传给服务端,而不是文件本身。
3、form表单的enctype设置为multipart/form-data。表示以二进制的形式传输数据。
1 | package com.huan.filter; |
1 | <%@ page contentType="text/html;charset=UTF-8" language="java" %> |
1 | package com.huan.servlet; |
注:通过BufferReader按字符整行读取输入数据流会出现:
1、无法读取换行符,导致读取文本文件无法换行;
2、读取图片二进制流内部结构会破坏,图片无法显示
1 | <%@ page contentType="text/html;charset=UTF-8" language="java" %> |
1 | package com.huan.servlet; |
1 | package com.huan.servlet; |
1 | <%@ page contentType="text/html;charset=UTF-8" language="java" %> |
1 | package com.huan.servlet; |
Expression Language 表达式语言,替代JSP页面中数据访问的复杂编码。可以非常便捷的取出域对象中保存的数据,前提是一定要先setAttribute,EL就相当于在简化getAttribute。
语法:${变量名} 变量名就是setAttribute对应的key值。
1、EL对于四种域对象的查找顺序:
pageContext–>request–>session–>application
按照上述顺序进行查找,找到立即返回,如果在application中也无法找到,则返回null值。
2、指定作用域进行查找:
pageContext:${pageScope.name}
request:${requestScope.name}
session:${sessionScope.name}
application:${applicationScope.name}
3、级联
1 | <% |
4、EL执行表达式
1 | &&(and) |
JSP Standard Tag Library–>Jsp标准标签库,JSP为开发者提供的一系列的标签,使用这些标签可以完成一些逻辑处理,比如循环遍历集合,让代码更简洁,不再出现JSP脚本穿插的情况。
实际开发中EL和JSTL结合起来使用,JSTL侧重于逻辑处理,EL负责数据展示。
1、导入jar包。(两个jstl.jar和standard.jar)lib目录必须放在web/WEB-INF
2、在JSP页面开始的地方导入JSTL标签库
1 | <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> |
3、使用
1 | <%@ page import="com.huan.entity.User" %> |
1、set:向域对象中添加数据,相当于setAttribute(key,value)
1 | <c:set var="name" value="TomCat" scope="request"></c:set> |
2、out:输出域对象中的数据,类似于EL,取value值时必须使用EL表达式
1 | <c:set var="name" value="TomCat" scope="request"></c:set> |
3、remove:删除域对象的数据
1 | <c:set var="name" value="TomCat" scope="request"></c:set> |
4、catch:用来捕获异常,并且在页面展示(类似于try-catch,用标签将可能会抛出异常的代码包裹起来)
1 | <c:catch var="error"> |
5、条件标签
1 | <c:set var="num1" value="1"></c:set> |
6、迭代标签 forEach
begin设置开始元素,从0开始
end设置结束位置
step设置步长
varStatus设置状态,可以取出类似下标(index从0开始、count从1开始)
1 | <c:forEach items="${list}" var="str" begin="2" end="6" step="3" varStatus="stu"> |
JSP引入:
1 | <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> |
1 | <% |
User.java
1 | package com.huan.entity; |
index.jsp
1 | <%@ page contentType="text/html;charset=UTF-8" language="java" %> |
add.jsp
1 | <%@ page contentType="text/html;charset=UTF-8" language="java" %> |
update.jsp
1 | <%@ page contentType="text/html;charset=UTF-8" language="java" %> |
UserServlet.java
1 | package com.huan.servlet; |
JSP本质上是一个Servlet,JSP主要负责与用户交互,将最终界面呈现给用户。
当服务器接收到一个后缀是jsp的请求时,将该请求将给jsp引擎去处理,每一个jsp页面第一次访问的时候,jsp引擎会将它翻译成一个Servlet文件,再由web容器调用Servlet完成响应。
1、JSP脚本,执行java逻辑代码
1 | <% java代码 %> |
2、JSP声明:定义java方法
1 | <%! |
3、JSP表达式:把java对象直接输出到HTML页面中
1 | <%=Java变量%> |
4、示例1
1 | <%! |
5、示例2
com.huan.entity.User
1 | package com.huan.entity; |
index.jsp
1 | <%@ page import="com.sun.xml.internal.messaging.saaj.packaging.mime.util.LineInputStream" %> |
1、request:表示一次请求,HttpServletRuquest
2、response:表示一次响应,HttpservletResponse
3、pageContext:页面上下文,获取页面信息,PageContext
4、session:表示一次会话,保存用户信息,HttpSession
5、application:表示当前的Web应用,全局对象,保存所有用户共享信息,ServletContext
6、config:当前jsp对应的Servlet的ServletConfig对象,获取当前Servlet信息
7、out:向浏览器输出数据,JspWriter
8、page:当前jsp对应的Servlet对象,Servlet
9、exception:表示JSP页面产生的异常,Exception
1、String getParameter(String key)获取客户端传来的参数。
1 | String name = servletRequest.getParameter("name"); |
2、void setAttribute(String key,Object value)通过键值对形式来保存数据。
3、Object getAttribute(String key)通过key取出value。(服务器内部获取,通过getRequestDispatcher传输)
1 | //将请求存入到request中 |
4、RequestDispatcher getRequestDispatcher(String path) 返回一个RequestDispatcher对象,该对象forward方法用于请求转发。
5、String[] getParameterValues(String key)获取客户端传来的多个同名参数。
6、void setCharacterEncoding(“UTF-8”)指定请求的编码。
1、response.sendRedirect(String path) 重定向方法
转发getRequestDispatcher和重定向sendRedirect区别:
转发是将同一个请求转发给下一个页面;重定向是创建一个新的请求传给下一个页面,之前的请求结束生命周期。
转发:同一个请求在服务器之间传递,地址栏不变,也叫服务器跳转。
重定向:由客户端发送一次新的请求来访问跳转后的目标资源,地址栏改变,也叫客户端跳转。
如果两个页面之间需要通过request来传值,则必须使用转发,不能使用重定向。
举例:用户登录,如果用户名和密码正确,则跳转到首页(转发),并且展示用户名,否则重新回到登录页面(重定向)。
login.jsp
1 | <%@ page contentType="text/html;charset=UTF-8" language="java" %> |
check.jsp
1 | <%@ page contentType="text/html;charset=UTF-8" language="java" %> |
welcom.jsp
1 | <%@ page contentType="text/html;charset=UTF-8" language="java" %> |
用户会话:服务器无法识别每一次HTTP请求来自哪个终端,它只会接收到一个请求信号,所以存在服务器将用户的响应发送给其他人,必须有一种技术来实现让服务器识别请求具体来自哪一个终端,这就是会话技术。
会话:就是客户端和服务器之间发生的一系列连续的请求和响应的过程,打开浏览器进行操作到关闭浏览器的过程。
会话状态:指服务器和浏览器在会话过程中产生的状态信息,借助于会话状态,服务器能够把属于同一次会话的一系列请求和响应关联起来。
实现会话有两种方式:
属于同一次会话请求都有一个相同的标识符,sessionID
1、String getId() 获取当前sessionID
2、void setMaxInactiveInterval(int interval) 设置session失效时间,单位为秒
3、int getMaxInactiveInterval() 获取当前session的失效时间
4、void invalidate() 设置session立即失效,一般退出登录场景使用
5、void setAttribute(String,Object) 通过键值对的形式来存储数据
6、Object getAttribute(String key) 通过键获取对应的数据
7、void removeAttribyite(String key) 通过键值移除对应的数据
web.xml
1 | <servlet> |
LoginServlet.java
1 | package com.huan.servlet; |
LogoutServlet.java
1 | package com.huan.servlet; |
login.jsp
1 | <%@ page contentType="text/html;charset=UTF-8" language="java" %> |
welcome.jsp
1 | <%@ page contentType="text/html;charset=UTF-8" language="java" %> |
Cookie是服务端在HTTP响应中附带传给浏览器的一个小文本文件,一旦浏览器保存了某个Cookie,在之后请求和响应过程中,会将此cookie来回传递,这样就可以通过Cookie这个载体完成客户端和服务端的数据交互。
1 | Cookie cookie = new Cookie("name","张三"); |
1 | Cookie[] cookies = request.getCookies(); |
1、void setMaxAge(int age) 设置Cookie的有效时间,单位为秒
2、int getMaxAge() 获取Cookie有效时间
3、String getName() 获取Cookie的name
4、String getValue() 获取Cookie的vlaue
1、保存在服务器
2、保存的数据是Object
3、会随着会话的结束而销毁
4、保存重要的信息(密码)
1、保存在浏览器
2、保存的数据是文本
3、可以长期保存在浏览器,与会话无关,默认关闭浏览器销毁
4、保存不重要的信息(因为可以从本地浏览器安装路径获取,造成信息泄露,视频观看记录,上次看到位置通过Cookie存储,下次打开直接定位播放)
page、request、session、appllication
1、page:只在当前页面有效。–>pageContext
2、request:在一次请求内有效(通过转发可以生效,重定向不可以,不关闭浏览器重新发起请求也不可以)。–>request
3、session:在一次会话内有效(浏览器不关闭都生效,转发,重定向)。–>session
4、application:对整个web应用生效。–>application
1 | <%@ page contentType="text/html;charset=UTF-8" language="java" %> |
注:如果服务器关闭,则application作用域失效,下次重启服务器会从1开始计数,要解决只需将count存入数据库即可,从数据库获取
Spring MVC 是目前主流的实现 MVC 设计模式的企业级开发框架,Spring 框架的一个子模块,无需整合,开发起来更加便捷。
将应用程序分为 Controller、Model、View 三层,Controller 接收客户端请求,调用 Model 生成业务数据,传递给 View。
Spring MVC 就是对这套流程的封装,屏蔽了很多底层代码,开放出接口,让开发者可以更加轻松、便捷地完成基于 MVC 模式的 Web 开发。
Spring MVC 流程非常复杂,实际开发中很简单,因为大部分的组件不需要开发者创建、管理,只需要通过配置文件的方式完成配置即可,真正需要开发者进行处理的只有 Handler 、View。
1 | <dependencies> |
1 | <!DOCTYPE web-app PUBLIC |
1 | <?xml version="1.0" encoding="UTF-8"?> |
1 | package com.southwind.controller; |
Spring MVC 通过 @RequestMapping 注解将 URL 请求与业务方法进行映射,在 Handler 的类定义处以及方法定义处都可以添加 @RequestMapping ,在类定义处添加,相当于客户端多了一层访问路径。
@Controller 在类定义处添加,将该类交个 IoC 容器来管理(结合 springmvc.xml 的自动扫描配置使用),同时使其成为一个控制器,可以接收客户端请求。
1 | package com.southwind.controller; |
1、value:指定 URL 请求的实际地址,是 @RequestMapping 的默认值。
1 | @RequestMapping("/index") |
等于
1 | @RequestMapping(value="/index") |
2、method:指定请求的 method 类型,GET、POST、PUT、DELET。
1 | @RequestMapping(value = "/index",method = RequestMethod.GET) |
上述代码表示 index 方法只能接收 GET 请求。
3、params:指定请求中必须包含某些参数,否则无法调用该方法。
1 | @RequestMapping(value = "/index",method = RequestMethod.GET,params = {"name","id=10"}) |
上述代码表示请求中必须包含 name 和 id 两个参数,同时 id 的值必须是 10。
关于参数绑定,在形参列表中通过添加 @RequestParam 注解完成 HTTP 请求参数与业务方法形参的映射。
1 | @RequestMapping(value = "/index",method = RequestMethod.GET,params = {"name","id=10"}) |
上述代码表示将请求的参数 name 和 id 分别赋给了形参 str 和 age ,同时自动完成了数据类型转换,将 “10” 转为了 int 类型的 10,再赋给 age,这些工作都是由 HandlerAdapter 来完成的。
Spring MVC 也支持 RESTful 风格的 URL。
传统类型:http://localhost:8080/hello/index?name=zhangsan&id=10
REST:http://localhost:8080/hello/index/zhangsan/10
1 | @RequestMapping("/rest/{name}/{id}") |
通过 @PathVariable 注解完成请求参数与形参的映射。
Spring MVC 通过映射可以直接在业务方法中获取 Cookie 的值。
1 | @RequestMapping("/cookie") |
Spring MVC 会根据请求参数名和 JavaBean 属性名进行自动匹配,自动为对象填充属性值,同时支持及联属性。
1 | package com.southwind.entity; |
1 | package com.southwind.entity; |
1 | <%-- |
1 | @RequestMapping(value = "/save",method = RequestMethod.POST) |
如果出现中文乱码问题,只需在 web.xml 添加 Spring MVC 自带的过滤器即可。
1 | <filter> |
Spring MVC 默认是以转发的形式响应 JSP。
1、转发
1 | @RequestMapping("/forward") |
2、重定向
1 | @RequestMapping("/redirect") |
数据绑定:在后端的业务方法中直接获取客户端 HTTP 请求中的参数,将请求参数映射到业务方法的形参中,Spring MVC 中数据绑定的工作是由 HandlerAdapter 来完成的。
1 | @RequestMapping("/baseType") |
@ResponseBody 表示 Spring MVC 会直接将业务方法的返回值响应给客户端,如果不加 @ResponseBody 注解,Spring MVC 会将业务方法的放回值传递给 DispatcherServlet,再由 DisptacherServlet 调用 ViewResolver 对返回值进行解析,映射到一个 JSP 资源。
1 | @RequestMapping("/packageType") |
包装类可以接收 null,当 HTTP 请求没有参数时,使用包装类定义形参的数据类型,程序不会抛出异常。
@RequestParam
value = “num”:将 HTTP 请求中名为 num 的参数赋给形参 id。
requried:设置 num 是否为必填项,true 表示必填,false 表示非必填,可省略。
defaultValue = “0”:如果 HTTP 请求中没有 num 参数,默认值为0.
1 | @RestController |
@RestController 表示该控制器会直接将业务方法的返回值响应给客户端,不进行视图解析。
@Controller 表示该控制器的每一个业务方法的返回值都会交给视图解析器进行解析,如果只需要将数据响应给客户端,而不需要进行视图解析,则需要在对应的业务方法定义处添加 @ResponseBody。
1 | @RestController |
等同于
1 | @Controller |
Spring MVC 不支持 List 类型的直接转换,需要对 List 集合进行包装。
集合封装类
1 | package com.southwind.entity; |
JSP
1 | <%-- |
业务方法
1 | @RequestMapping("/list") |
处理 @ResponseBody 中文乱码,在 springmvc.xml 中配置消息转换器。
1 | <mvc:annotation-driven> |
自定义封装类
1 | package com.southwind.entity; |
业务方法
1 | @RequestMapping("/map") |
JSP
1 | <%-- |
客户端发生 JSON 格式的数据,直接通过 Spring MVC 绑定到业务方法的形参中。
处理 Spring MVC 无法加载静态资源,在 web.xml 中添加配置即可。
1 | <servlet-mapping> |
JSP
1 | <%-- |
业务方法
1 | @RequestMapping("/json") |
Spring MVC 中的 JSON 和 JavaBean 的转换需要借助于 fastjson,pom.xml 引入相关依赖。
1 | <dependency> |
springmvc.xml 添加 fastjson 配置。
1 | <mvc:annotation-driven> |
JSP 四大作用域对应的内置对象:pageContext、request、session、application。
模型数据的绑定是由 ViewResolver 来完成的,实际开发中,我们需要先添加模型数据,再交给 ViewResolver 来绑定。
Spring MVC 提供了以下几种方式添加模型数据:
将模式数据绑定到 request 对象。
1、Map
1 | @RequestMapping("/map") |
JSP
1 | <%-- |
2、Model
1 | @RequestMapping("/model") |
3、ModelAndView
1 | @RequestMapping("/modelAndView") |
4、HttpServletRequest
1 | @RequestMapping("/request") |
5、@ModelAttribute
1 | @ModelAttribute |
1 | @ModelAttribute |
1 | @ModelAttribute |
1 | @RequestMapping("/modelAttribute") |
将模型数据绑定到 session 对象
1、直接使用原生的 Servlet API。
1 | @RequestMapping("/session") |
2、@SessionAttribute
1 | @SessionAttributes(value = {"user","address"}) |
对于 ViewHandler 中的所有业务方法,只要向 request 中添加了 key = “user”、key = “address” 的对象时,Spring MVC 会自动将该数据添加到 session 中,保存 key 不变。
1 | @SessionAttributes(types = {User.class,Address.class}) |
对于 ViewHandler 中的所有业务方法,只要向 request 中添加了数据类型是 User 、Address 的对象时,Spring MVC 会自动将该数据添加到 session 中,保存 key 不变。
将模型数据绑定到 application 对象
1 | @RequestMapping("/application") |
数据转换器是指将客户端 HTTP 请求中的参数转换为业务方法中定义的形参,自定义表示开发者可以自主设计转换的方式,HandlerApdter 已经提供了通用的转换,String 转 int,String 转 double,表单数据的封装等,但是在特殊的业务场景下,HandlerAdapter 无法进行转换,就需要开发者自定义转换器。
客户端输入 String 类型的数据 “2019-03-03”,自定义转换器将该数据转为 Date 类型的对象。
1 | package com.southwind.converter; |
1 | <!-- 配置自定义转换器 --> |
1 | <%-- |
1 | package com.southwind.controller; |
String 转 Student
StudentConverter
1 | package com.southwind.converter; |
springmvc.xml
1 | <!-- 配置自定义转换器 --> |
JSP
1 | <%-- |
Handler
1 | @RequestMapping("/student") |
REST:Representational State Transfer,资源表现层状态转换,是目前比较主流的一种互联网软件架构,它结构清晰、标准规范、易于理解、便于扩展。
网络上的一个实体,或者说网络中存在的一个具体信息,一段文本、一张图片、一首歌曲、一段视频等等,总之就是一个具体的存在。可以用一个 URI(统一资源定位符)指向它,每个资源都有对应的一个特定的 URI,要获取该资源时,只需要访问对应的 URI 即可。
资源具体呈现出来的形式,比如文本可以用 txt 格式表示,也可以用 HTML、XML、JSON等格式来表示。
客户端如果希望操作服务器中的某个资源,就需要通过某种方式让服务端发生状态转换,而这种转换是建立在表现层之上的,所有叫做”表现层状态转换”。
REST 具体操作就是 HTTP 协议中四个表示操作方式的动词分别对应 CRUD 基本操作。
GET 用来表示获取资源。
POST 用来表示新建资源。
PUT 用来表示修改资源。
DELETE 用来表示删除资源。
Handler
1 | package com.southwind.controller; |
StudentRepository
1 | package com.southwind.repository; |
StudentRepositoryImpl
1 | package com.southwind.repository.impl; |
单文件上传
底层是使用 Apache fileupload 组件完成上传,Spring MVC 对这种方式进行了封装。
1 | <dependency> |
1 | <%-- |
1、input 的 type 设置为 file。
2、form 的 method 设置为 post(get 请求只能将文件名传给服务器)
3、from 的 enctype 设置为 multipart-form-data(如果不设置只能将文件名传给服务器)
1 | package com.southwind.controller; |
1 | <!-- 配置上传组件 --> |
1 | <servlet-mapping> |
多文件上传
pom.xml
1 | <dependency> |
JSP
1 | <%-- |
Handler
1 | @PostMapping("/uploads") |
下载
1 | <%-- |
1 | @GetMapping("/download/{name}") |
1 | @GetMapping("/get") |
1 | <%-- |
1、JSP 页面导入 Spring MVC 表单标签库,与导入 JSTL 标签库的语法非常相似,前缀 prefix 可以自定义,通常定义为 from。
1 | <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> |
2、将 form 表单与模型数据进行绑定,通过 modelAttribute 属性完成绑定,将 modelAttribute 的值设置为模型数据对应的 key 值。
1 | Handeler:modelAndView.addObject("student",student); |
3、form 表单完成绑定之后,将模型数据的值取出绑定到不同的标签中,通过设置标签的 path 属性完成,将 path 属性的值设置为模型数据对应的属性名即可。
1 | 学生ID:<form:input path="id"/><br/> |
1 | <form:from modelAttribute="student"/> |
渲染的是 HTML 中的<form></from>
,通过 modelAttribute 属性绑定具体的模型数据。
1 | <form:input path="name"/> |
渲染的是 HTML 中的 <input type="text"/>
,from 标签绑定的是模型数据,input 标签绑定的是模型数据中的属性值,通过 path 属性可以与模型数据中的属性名对应,并且支持及联操作。
1 | <from:input path="address.name"/> |
1 | <form:password path="password"/> |
渲染的是 HTML 中的 <input type="password"/>
,通过 path 属性与模型数据的属性值进行绑定,password 标签的值不会在页面显示。
1 | <form:checkbox path="hobby" value="读书"/> |
1 | student.setFlag(false); |
1 | checkbox:<form:checkbox path="flag" value="flag"></form:checkbox><br/> |
渲染的是 HTML 中的 <input type="checkbox"/>
,通过 path 与模型数据的属性值进行绑定,可以绑定 boolean、数组和集合。
如果绑定 boolean 值,若该变量的值为 true,则表示该复选框选中,否则表示不选中。
如果绑定数组或者集合,数组/集合中的元素等于 checkbox 的 value 值,则选中。
1 | student.setHobby(Arrays.asList("读书","看电影","玩游戏")); |
1 | 爱好:<form:checkbox path="hobby" value="摄影"></form:checkbox>摄影<br/> |
1 | <form:checkboxes items=${student.hobby} path="selecHobby"/> |
渲染的是 HTML 中的一组 <input type="checkbox"/>
,是对 <form:checkbox/>
的一种简化,需要结合 items 和 path 属性来使用,items 绑定被遍历的集合或数组,path 绑定被选中的集合或数组,可以这样理解,items 为全部可选集合,path 为默认的选中集合。
1 | student.setHobby(Arrays.asList("摄影","读书","听音乐","看电影","旅游","玩游戏")); |
1 | 爱好:<form:checkboxes path="selectHobby" items="${student.hobby}"/><br/> |
需要注意的是 path 可以直接绑定模型数据的属性值,items 则需要通过 EL 表达式的形式从域对象中获取数据,不能直接写属性名。
1 | <from:radiobutton path="radioId" value="0"/> |
渲染的是 HTML 中的一个 <input type="radio"/>
,绑定的数据与标签的 value 值相等则为选中,否则不选中。
1 | student.setRadioId(1); |
1 | radiobutton:<form:radiobutton path="radioId" value="1"/>radiobutton<br/> |
1 | <form:radiobuttons itmes="${student.grade}" path="selectGrade"/> |
渲染的是 HTML 中的一组 <input type="radio"/>
,这里需要结合 items 和 path 两个属性来使用,items 绑定被遍历的集合或数组,path 绑定被选中的值,items 为全部的可选类型,path 为默认选中的选项,用法与 <form:checkboxes/>
一致。
1 | Map<Integer,String> gradeMap = new HashMap<>(); |
1 | 学生年级:<form:radiobuttons items="${student.gradeMap}" path="selectGrade"/><br/> |
1 | <form:select items="${student.citys}" path="selectCity"/> |
渲染的是 HTML 中的一个 <select/>
标签,需要结合 items 和 path 两个属性来使用,items 绑定被遍历的集合或数组,path 绑定被选中的值,用法与 <from:radiobuttons/>
一致。
1 | Map<Integer,String> cityMap = new HashMap<>(); |
1 | 所在城市:<form:select items="${student.cityMap}" path="selectCity"></form:select><br/> |
form:select
结合 form:options
的使用,from:select
只定义 path 属性,在 form:select
标签内部添加一个子标签 form:options
,设置 items 属性,获取被遍历的集合。
1 | 所在城市:<form:select path="selectCity"> |
option
form:select
结合 form:option
的使用,from:select
定义 path 属性,给每一个 form:option
设置 value 值,path 的值与哪个 value 值相等,该项默认选中。
1 | 所在城市:<form:select path="selectCity"> |
渲染的是 HTML 中的一个 <textarea/>
,path 绑定模型数据的属性值,作为文本输入域的默认值。
1 | student.setIntroduce("你好,我是..."); |
1 | 信息:<form:textarea path="introduce"/><br/> |
处理错误信息,一般用在数据校验,该标签需要结合 Spring MVC 的验证器结合起来使用。
Spring MVC 提供了两种数据校验的方式:1、基于 Validator 接口。2、使用 Annotation JSR - 303 标准进行校验。
基于 Validator 接口的方式需要自定义 Validator 验证器,每一条数据的验证规则需要开发者手动完成,使用 Annotation JSR - 303 标准则不需要自定义验证器,通过注解的方式可以直接在实体类中添加每个属性的验证规则,这种方式更加方便,实际开发中推荐使用。
基于 Validator 接口
1 | package com.southwind.entity; |
1 | package com.southwind.validator; |
1 | package com.southwind.controller; |
1 | <bean id="accountValidator" class="com.southwind.validator.AccountValidator"></bean> |
1 | <%-- |
Annotation JSR - 303 标准
使用 Annotation JSR - 303 标准进行验证,需要导入支持这种标准的依赖 jar 文件,这里我们使用 Hibernate Validator。
1 | <!-- JSR-303 --> |
1 | package com.southwind.entity; |
1 | @GetMapping("/register") |
1 | <mvc:annotation-driven /> |
1 | <%-- |
校验规则详解:
@Null 被注解的元素必须为null
@NotNull 被注解的元素不能为null
@Min(value) 被注解的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value) 被注解的元素必须是一个数字,其值必须小于于等于指定的最大值
@Email 被注解的元素必须是电子邮箱地址
@Pattern 被注解的元素必须符合对应的正则表达式
@Length 被注解的元素的大小必须在指定的范围内
@NotEmpty 被注解的字符串的值必须非空
Null 和 Empty 是不同的结果,String str = null,str 是 null,String str = “”,str 不是 null,其值为空。
Writing by Tor小黑 —-心中藏之,无日忘之
tag:
缺失模块。
1、请确保node版本大于6.2
2、在博客根目录(注意不是yilia根目录)执行以下命令:
npm i hexo-generator-json-content --save
3、在根目录_config.yml里添加配置:
jsonContent: meta: false pages: false posts: title: true date: true path: true text: false raw: false content: false slug: false updated: false comments: false link: false permalink: false excerpt: false categories: false tags: true