JSR303
关于JSR303
JSR-303 是JAVA EE 6 中的一项子规范,叫做Bean Validation,Hibernate Validator 是 Bean Validation 的参考实现 . Hibernate Validator 提供了 JSR 303 规范中所有内置 constraint 的实现,除此之外还有一些附加的 constraint。
简单的介绍
Hibernate Validator 附加的注解
代码实现
1.先在pom.xml里导入依赖
<!-- https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator -->
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.16.Final</version>
</dependency>
2.给要校验的javaBean上标注校验注解
3. 在请求处理方法中,使用@Validated或@Valid注解要验证的对象,并根据BindingResult判断校验是否通过另外,验证参数后必须紧跟BindingResult参数,否则spring会在校验不通过时直接抛出异常
4.如过需要在jsp中显示错误提示,则需要在后端实例化对象 ,然后在页面中加入:
<%@taglib prefix="fmt" uri="http://www.springframework.org/tags/form" %>
后端:
前端页面:
SpringMVC拦截器
什么是拦截器
SpringMVC的处理器拦截器,类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后 处理。依赖于web框架,在实现上基于Java的反射机制,属于面向切面编程(AOP)的一种运用。由于拦截器是基于web框架的调用,因此可以使用Spring的依赖注入(DI)进行一些业务操作,同时一个拦截器实例在一个 controller生命周期之内可以多次调用
拦截器工作原理图
过滤器(file)和拦截器(interceptor)区别(重要)
过滤器(file):file属于Servlet技术,只要是web项目都可以使用
file主要是对所有请求的过滤
file在interceptor先执行
拦截器(interceptor): interceptor输出springMVC技术,必须要有springMVC环境才能使用
interceptor通常只对处理器Controller进行拦截 、
interceptor只拦截DIspatcherServlet的处理请求
.拦截器链(多拦截器)
拦截器链的概念:如果多个拦截器能够对相同的请求进行拦截,则多个拦截器会形成一个拦截器链,主要理解拦截器链中各个拦截器的执行顺序。拦截器链中多个拦截器的执行顺序,根拦截器的配置顺序有关,先配置的先执行。
它拦截的顺序是从上往下执行拦截器
案例:.用户登录权限控制
1.在spring-mvc.xml里配置拦截器
2.建一个LoginInterceptor拦截器类并实现HandlerInterceptor接口实现其方法
package com.zking.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String requestURI = request.getRequestURI();
System.out.println(requestURI);
System.out.println(requestURI.indexOf("/out"));
//登陆页面可以访问
if(requestURI.indexOf("/login")>0)
return true;
//跳转到登陆页面也可以访问
if(requestURI.indexOf("/out")>0)
return true;
//获取session
HttpSession session= request.getSession();
Object userName = session.getAttribute("userName");
if(userName!=null){
return true;
}else {
session.setAttribute("msg","您还没登陆,请先登陆");
request.getRequestDispatcher("WEB-INF/jsp/book/login.jsp").forward(request,response);
return false;
}
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
HandlerInterceptor接口的三个方法和执行时机
preHandle方法
作用:用于对拦截到的请求进行预处理,方法接收布尔(true,false)类型的返回值,返回true:放 行,false:不放行。
执行时机:在处理器方法执行前执行
方法参数:
1)request请求对象
2)response响应对象
3)handler拦截到的方法处理
postHandle方法
作用:用于对拦截到的请求进行后处理,可以在方法中对模型数据和视图进行修改
执行时机:在处理器的方法执行后,视图渲染之前
方法参数:
1)request请求对象
2)response响应对象
3)handler拦截到的处理器方法
4)ModelAndView处理器方法返回的模型和视图对象,可以在方法中修改模型和视图
afterCompletion方法
作用:用于在整个流程完成之后进行最后的处理,如果请求流程中有异常,可以在方法中获取 对象
执行时机:视图渲染完成后(整个流程结束之后)
方法参数:
1)request请求参数
2)response响应对象
3)handler拦截到的处理器方法
4)ex异常对象