前言

上一篇文章分享了,上传和下载。本片文章将分享的内容是 JSR303 以及 拦截器


一、JSR303

JSR-303 是 JAVA EE 6 中的一项子规范,叫做 Bean Validation,官方参考实现是Hibernate Validator。

简单的说,JSR-303就是用来做表单验证的

我们之前用jsjQuery做表单验证,JS属于前端的脚本验证(只作用于客户端的浏览器中,可以被屏蔽)

JSR303属于服务端验证

1、导入pom

<dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>6.0.7.Final</version></dependency>

2、Clazz

package com.zhw.model;import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;/*** @NotNull :作用于基本数据类型* @NotEmpty    作用于集合* @NotBlank    作用于字符串*/
public class Clazz {@NotNull(message = "班级编号不能为空")protected Integer cid;@NotBlank(message = "班级名不能为空")protected String cname;@NotBlank(message = "班级教员老师不能为空")protected String cteacher;protected String pic;public Clazz(Integer cid, String cname, String cteacher, String pic) {this.cid = cid;this.cname = cname;this.cteacher = cteacher;this.pic = pic;}public Clazz() {super();}public Integer getCid() {return cid;}public void setCid(Integer cid) {this.cid = cid;}public String getCname() {return cname;}public void setCname(String cname) {this.cname = cname;}public String getCteacher() {return cteacher;}public void setCteacher(String cteacher) {this.cteacher = cteacher;}public String getPic() {return pic;}public void setPic(String pic) {this.pic = pic;}
}

3、ClazzController

package com.zhw.web;import com.zhw.biz.ClazzBiz;
import com.zhw.model.Clazz;
import com.zhw.model.dto.ClazzDto;
import com.zhw.util.PageBean;
import org.apache.commons.io.FileUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** @author louis* @create  2022-08-17 18:39*/
@Controller
@RequestMapping("/clz")
public class ClazzController {@Autowiredprivate ClazzBiz clazzBiz;@RequestMapping("/list")public String list(HttpServletRequest req, Clazz clazz){PageBean pageBean = new PageBean();pageBean.setRequest(req);List<Clazz> lst = this.clazzBiz.listPager(clazz, pageBean);req.setAttribute("lst",lst);req.setAttribute("pageBean",pageBean);return "clzList";}@RequestMapping("/add")public String add(HttpServletRequest req, Clazz clazz){this.clazzBiz.insertSelective(clazz);return "redirect:/clz/list";}@RequestMapping("/edit")public String edit(HttpServletRequest req, Clazz clazz){this.clazzBiz.updateByPrimaryKeySelective(clazz);return "redirect:/clz/list";}@RequestMapping("/del")public String del(HttpServletRequest req, Clazz clazz){this.clazzBiz.deleteByPrimaryKey(clazz.getCid());return "redirect:/clz/list";}@RequestMapping("/toEdit")public String toEdit(HttpServletRequest req, Clazz clazz){if(clazz.getCid() != null){List<Clazz> lst = this.clazzBiz.listPager(clazz, null);req.setAttribute("b",lst.get(0));}return "clzEdit";}@RequestMapping("/upload")public String upload(HttpServletRequest request, ClazzDto clazzDto){try {String diskPath = "D:/Temp/images/";String reqPath = "/upload/mvc/";MultipartFile picFile = clazzDto.getPicFile();
//            完成文件上传FileUtils.copyInputStreamToFile(picFile.getInputStream(),new File(diskPath+picFile.getOriginalFilename()));
//            保存到数据库中Clazz clz = new Clazz();clz.setCid(clazzDto.getCid());clz.setPic(reqPath + picFile.getOriginalFilename());this.clazzBiz.updateByPrimaryKeySelective(clz);} catch (IOException e) {e.printStackTrace();}return "redirect:/clz/list";}//    给数据添加服务端校验@RequestMapping("/valiAdd")public String valiAdd(@Validated Clazz clazz, 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.clazzBiz.insertSelective(clazz);return "redirect:/clz/list";}return "clzEdit";}@RequestMapping("/download")public ResponseEntity<byte[]> download(Clazz clazz, HttpServletRequest req){try {//先根据文件id查询对应图片信息Clazz clz = this.clazzBiz.selectByPrimaryKey(clazz.getCid());String diskPath = "D:/Temp/images/";String reqPath = "/upload/mvc/";String realPath = clz.getPic().replace(reqPath,diskPath);String fileName = realPath.substring(realPath.lastIndexOf("/")+1);//下载关键代码File file=new File(realPath);HttpHeaders headers = new HttpHeaders();//http头信息String downloadFileName = new String(fileName.getBytes("UTF-8"),"iso-8859-1");//设置编码headers.setContentDispositionFormData("attachment", downloadFileName);headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);//MediaType:互联网媒介类型  contentType:具体请求中的媒体类型信息return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers, HttpStatus.OK);}catch (Exception e){e.printStackTrace();}return null;}
}

4、clzEidt.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>博客的编辑界面</title>
</head>
<body>
<form action="${pageContext.request.contextPath }/clz/${empty b ? 'valiAdd' : 'edit'}" method="post">id:<input type="text" name="cid" value="${b.cid }"><span style="color: red;">${errorMap.cid}</span><br>cname:<input type="text" name="cname" value="${b.cname }"><span style="color: red;">${errorMap.cname}</span><br>cteacher:<input type="text" name="cteacher" value="${b.cteacher }"><span style="color: red;">${errorMap.cteacher}</span><br><input type="submit">
</form>
</body>
</html>

效果展示

二、拦截器

1、什么是拦截器

Spring MVC中的拦截器(Interceptor)类似于ServLet中的过滤器(Filter),它主要用于拦截用户请求并作出相应的处理。例如通过拦截器可以进行权限验证、记录请求信息的日志、判断用户是否登录等。

2、拦截器的初识

2.1、OneHandlerInterceptor

package com.zhw.intercept;import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/*** @author louis* @create  2022-08-19 20:51*/
public class OneHandlerInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//        预处理System.out.println("[OneHandlerInterceptor] . preHandle");return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
//       后处理System.out.println("[OneHandlerInterceptor] . postHandle...");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
//        完成后执行System.out.println("[OneHandlerInterceptor] . afterCompletion...");}
}

2.2、HelloController

package com.zhw.web;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;/*** @author louis* @create  2022-08-19 20:47*/
@Controller
public class HelloController {@RequestMapping("/hello")public String hello(){System.out.println("come in ...");return "index";}
}

2.3、springmvc-servlet的配置

 <mvc:interceptors><!--针对于所有的请求进行拦截--><bean class="com.zhw.intercept.OneHandlerInterceptor"></bean></mvc:interceptors>

3、拦截器链

3.1、TwoHandlerInterceptor

package com.zhw.intercept;import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/*** @author louis* @create  2022-08-19 21:11*/
public class TwoHandlerInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//        预处理System.out.println("[TwoHandlerInterceptor] . preHandle");return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
//       后处理System.out.println("[TwoHandlerInterceptor] . postHandle...");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
//        完成后执行System.out.println("[TwoHandlerInterceptor] . afterCompletion...");}
}

3.2、springmvc-servlet的配置

<mvc:interceptors><mvc:interceptor><mvc:mapping path="/**"/><bean class="com.zhw.intercept.OneHandlerInterceptor"></bean></mvc:interceptor><mvc:interceptor><mvc:mapping path="/clz/**"/><bean class="com.zhw.intercept.TwoHandlerInterceptor"></bean></mvc:interceptor></mvc:interceptors>

三、案例

1、login.jsp

<%--Created by IntelliJ IDEA.User: zhwDate: 2022/8/20Time: 21:28To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
登录界面
</body>
</html>

2、LoginController

package com.zhw.web;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;import javax.servlet.http.HttpServletRequest;/*** @author louis* @create  2022-08-20 21:29*/
@Controller
public class LoginController {@RequestMapping("/login")public String login(HttpServletRequest request){
//        登录成功需要保存用户信息String uname = request.getParameter("uname");if("zhangsan".equals(uname)){request.getSession().setAttribute("uname",uname);}return "index";}@RequestMapping("/loginout")public String loginout(HttpServletRequest request){request.getSession().invalidate();return "index";}
}

http://localhost:8080/clz/list 不能访问,因为session被过滤掉
http://localhost:8080/login 不能访问,因为用户未成功登录被过滤掉
http://localhost:8080/login?uname=zs 可以访问
http://localhost:8080/loginout 清除掉session

 http://localhost:8080/clz/list

http://localhost:8080/login

 http://localhost:8080/login?uname=zs

http://localhost:8080/loginout

JSR 303 以及 拦截器相关推荐

  1. Spring MVC-07循序渐进之验证器 下 (JSR 303验证)

    概述 JSR 303 Validator Demo 测试 总结 源码 概述 JSR303"Bean Validation" 和 JSR349 "Bean Validati ...

  2. jsr 303_使用Spring和JSR 303进行方法参数验证

    jsr 303 Spring提供了一种使用JSR 303 bean验证来验证方法参数的简便方法. 在这篇文章中,我们将看到如何使用此功能. 设定 首先,我们需要通过创建MethodValidation ...

  3. jsr303 spring_使用Spring和JSR 303进行方法参数验证

    jsr303 spring Spring提供了一种使用JSR 303 bean验证来验证方法参数的简便方法. 在这篇文章中,我们将看到如何使用此功能. 建立 首先,我们需要通过创建MethodVali ...

  4. 使用Spring和JSR 303进行方法参数验证

    Spring提供了一种使用JSR 303 bean验证来验证方法参数的简便方法. 在这篇文章中,我们将看到如何使用此功能. 设定 首先,我们需要通过创建MethodValidationPostProc ...

  5. 让Spring 3中jsp的数据对象使用懒加载(FetchType.LAZY)与Controller的JSR 303并存

    本文出处:http://blog.csdn.net/chaijunkun/article/details/9083171,转载请注明.由于本人不定期会整理相关博文,会对相应内容作出完善.因此强烈建议在 ...

  6. Day75.Ajax、拦截器Interceptor、异常映射、自动|手动类型转换、类型校验

    目录 一.Ajax ★ 1. 基本类型参数传递  @ResponseBody响应体 2. Ajax传递实体类 3.Ajax传递实体类带级联属性 (非json 普通参数) @DateTimeFormat ...

  7. java与java ee_Java EE拦截器

    java与java ee 历史 我认为重要的是要看一下Java EE中Interceptor的发展,因为它是从EJB特定的项目开始的,后来又演变成一个单独的规范,现在可供其他Java EE规范扩展,这 ...

  8. Java EE拦截器

    历史 我认为重要的是要看一下Java EE中的Interceptor的发展,因为它是从EJB特定的项目开始的,后来又演变成一个单独的规范,现在可供其他Java EE规范扩展,这一事实很简单. 版本1. ...

  9. spring拦截器-过滤器的区别

    1.  理解 拦截器 :是在面向切面编程的时候,在你的 service 或者一个方法前调用一个方法,或者在方法后调用一个方法:比如动态代理就是拦截器的简单实现,在你调用方法前打印出字符串(或者做其它业 ...

最新文章

  1. 练习2:课工场响应式导航条_作业帮直播课APP下载最新版入口
  2. 关于debug.keystore文件用法以及错误处理
  3. css3替代图片的尖角圆角效果
  4. LED和LCD的区别
  5. Exchange 2007迁移2010后部分手机邮箱不能使用解决办法
  6. 递归神经网络预测股票好文章
  7. 为Windows git 配置比较工具为beyond compare
  8. Object 转 String
  9. 郑州升达经贸管理学院计算机专业学费,郑州升达经贸管理学院学费
  10. 4am永远 鼠标按键设置_4AM称霸PCL和PEL 绝地求生与和平精英的双端冠军 | 电玩巴士...
  11. 效果好,速度快!DenseNAS:密集连接搜索空间下的高灵活度网络结构搜索
  12. 制作第一个HTML网页,2制作第一个HTML网页.ppt
  13. python3基础(九)内置函数
  14. rubygems 安装mysql时出错_Ruby gem install mysql 错误解决
  15. VC获得本机网络连接状态
  16. 2006年考研数学一解析pdf
  17. Make sure that libnvrtc-builtins.so.11.1 is installed correctly.
  18. java实现大文件切割分片
  19. matlab解韩信点兵问题,小学数学题目巧解—韩信点兵问题
  20. 【vue3】关于ref、toRef、toRefs那些事

热门文章

  1. 移动营业厅称部分SIM卡无法用于iPhone4S
  2. 成吉思汗大都会灯谜答题器
  3. 大型计算机变形,ShellCode编码变形大法 -电脑资料
  4. Qt QLabel行、列间距控制
  5. IE浏览器安装Activex插件
  6. 搭建在线帮助中心,轻松帮助客户解决问题
  7. AK F.*ing leetcode 流浪计划之线段树
  8. raid的种类和区别
  9. android 闪烁效果,Android 微光闪烁效果之更强Shimmer-android
  10. WinCC flexible 2008项目移植到博途WinCC的具体方法