目录
一、JSR303
1.1 什么是JSR303
JSR303的定义:
1.2 为什么要使用JSR303
JSR303是Java Validation API的规范,它提供了一种简单易用的验证框架,帮助我们在实体类属性上进行验证,对于确保数据的正确性和完整性非常有用。 使用JSR303可以带来以下好处:
1.3 常用注解
JSR303是Java中的Bean Validation规范,其中定义了许多注解用于对JavaBean中的属性进行验证。以下是常用的JSR303注解及其解释:
以上是常用的JSR303注解及其解释,开发者可以根据实际情况选择需要的注解。
注@Validated与@Valid区别 ::
1.4 快速入门
1.4.1 导入依赖
<!-- JSR303 -->
<hibernate.validator.version>6.0.7.Final</hibernate.validator.version>
<!-- JSR303 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>${hibernate.validator.version}</version>
</dependency>
1.4.2 配置校验规则
校验属性是否为空:
@NotNull(message = "歌曲编号不能为空")
private Integer mid;
@NotBlank(message = "歌曲名称不能为空")
private String mname;
@NotBlank(message = "歌曲专辑不能为空")
private String mtype;
@NotBlank(message = "歌曲歌词不能为空")
private String minfo;
@NotBlank(message = "歌曲图片不能为空")
private String mpic = "暂无图片";
1.4.3 入门案例
在MusicController类中添加以下方法:
// 给数据添加服务端校验
@RequestMapping("/valiAdd")
public String valiAdd(@Validated Music music, BindingResult result, HttpServletRequest req){
// 如果服务端验证不通过,有错误
if(result.hasErrors()){
// 服务端验证了实体类的多个属性,多个属性都没有验证通过
List<FieldError> fieldErrors = result.getFieldErrors();
Map<String,Object> map = new HashMap<>();
for (FieldError fieldError : fieldErrors) {
// 将多个属性的验证失败信息输送到控制台
System.out.println(fieldError.getField() + ":" + fieldError.getDefaultMessage());
map.put(fieldError.getField(),fieldError.getDefaultMessage());
}
req.setAttribute("errorMap",map);
}else {
this.musicBiz.insertSelective(music);
return "redirect:list";
}
return "mic/edit";
}
在服务端中进行校验,校验的模型的属性中出现错误,则将错误信息的属性进行遍历添加到map集合中并保存起来回显到前端,需要注意的是,注解@validated保存的是校验时的参数,最终校验的结果保存在BindingResult中.
1.4.4 结果测试
在没有进行后端效验前应该会报空指针异常。
但是在进行后端效验之后,就会将我们的错误信息反馈到前端的展示界面,如下:
控制台效果:
二、Java三大器之拦截器
2.1 什么是拦截器
2.1.1 定义
2.1.2 作用领域
2.2 Java三大器之过滤器
2.2.1 定义
2.2.2 作用领域
2.3 拦截器与过滤器的区别
图解如下:
拦截器和过滤器都是在Java Web开发中对请求进行拦截处理的一种工具,但是它们有以下区别:
总的来说,过滤器更加通用,可以实现一些基本的请求过滤和处理操作,而拦截器则更加灵活,可以根据业务需求实现更加复杂的操作。在实际应用中,需要根据具体的需求选择使用过滤器还是拦截器。
2.4 应用场景
2.5 拦截器工作原理
2.6 用户登录权限控制
基本拦截器配置(在Java目录下新建一个interceptor包,创建拦截器类):
OneInterceptor:
package com.Kissship.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class OneInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("【OneInterceptor】:preHandle...");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("【OneInterceptor】:postHandle...");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("【OneInterceptor】:afterCompletion...");
}
}
TwoInterceptor:
package com.Kissship.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class TwoInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("【TwoInterceptor】:preHandle...");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("【TwoInterceptor】:postHandle...");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("【TwoInterceptor】:afterCompletion...");
}
}
然后在Spring-mvc.xml中配置多拦截器,添加代码如下:
<!--! 用户权限的请求拦截-->
<mvc:interceptors>
<bean class="com.Kissship.interceptor.LoginInterceptor"></bean>
</mvc:interceptors>
<mvc:interceptors>
<!--2) 多拦截器(拦截器链)-->
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.Kissship.interceptor.OneInterceptor"/>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/mic/**"/>
<bean class="com.Kissship.interceptor.TwoInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
然后接下来创建一个名为LoginInterceptor的拦截器,如下:
package com.Kissship.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("【implements】:preHandle...");
StringBuffer url = request.getRequestURL();
if (url.indexOf("/login") > 0 || url.indexOf("/logout") > 0){
// 如果是 登录、退出 中的一种
return true;
}
// 代表不是登录,也不是退出
// 除了登录、退出,其他操作都需要判断是否 session 登录成功过
String mname = (String) request.getSession().getAttribute("mname");
if (mname == null || "".equals(mname)){
response.sendRedirect("/page/login");
return false;
}
return true;
}
@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 {
}
}
接着创建一个新的jsp页面用来充当登录界面进行效果测试,login.jsp代码如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>用户登入</title>
</head>
<body>
<form action="${pageContext.request.contextPath }/login" method="post" enctype="multipart/form-data">
<label>用户名称:</label><br/>
<input type="text" name="mname"/><br/>
<input type="submit" value="登入"/>
</form>
</body>
</html>
最后进行测试,效果如下:
最后SpringMVC之JSR303和拦截器就到这里,祝大家在敲代码的路上一路通畅!
感谢大家的观看 !