泰州建设信息网站,wordpress插件的页面文件,wap网站制作需要多少钱,在word上怎么做网站链接前言#xff1a;
小编阐述了springmvc 中的文件下载#xff0c;以及jrebel的使用和文件下载以及多文件下载!
在本次小编将会介绍JSR303的概念#xff0c;应用场景和在具体实例的使用#xff1b;和拦截器的应用
一.JSR303的介绍
1.什么是JSR303#xff1f; JSR是Java S…前言
小编阐述了springmvc 中的文件下载以及jrebel的使用和文件下载以及多文件下载!
在本次小编将会介绍JSR303的概念应用场景和在具体实例的使用和拦截器的应用
一.JSR303的介绍
1.什么是JSR303 JSR是Java Specification Requests的缩写意思是Java 规范提案。是指向JCP(Java Community Process)提出新增一个标准化技术规范的正式请求。任何人都可以提交JSR以向Java平台增添新的API和服务。JSR已成为Java界的一个重要标准。 JSR-303 是JAVA EE 6 中的一项子规范叫做Bean ValidationHibernate Validator 是 Bean Validation 的参考实现 . Hibernate Validator 提供了 JSR 303 规范中所有内置 constraint约束 的实现除此之外还有一些附加的 constraint。 2.为什么要使用JSR303
前端不是已经校验过数据了吗为什么我们还要做校验呢直接用不就好了草率了假如说前端代码校验没写好又或者是对于会一点编程的人来说直接绕过前端发请求通过类似Postman这样的测试工具进行非常数据请求把一些错误的参数传过来你后端代码不就危险了嘛。
并且验证数据是一项常见任务它发生在从表示层到持久层的所有应用程序层中。通常在每一层都实现相同的验证逻辑这既耗时又容易出错。为了避免重复这些验证开发人员经常将验证逻辑直接捆绑到域模型中将域类与验证代码混在一起而验证代码实际上是关于类本身的元数据
所以我们一般都是前端一套校验后端在一套校验这样安全性就能够大大得到提升了。
3.常用注解
注解说明Null用于验证对象为nullNotNull用于对象不能为null无法查检长度为0的字符串NotBlank只用于String类型上不能为null且trim()之后的size0NotEmpty用于集合类、String类不能为null,且size0。但是带有空格的字符串校验不出来Size用于对象Array,Collection,Map,String长度是否在给定的范围之内Length用于String对象的大小必须在指定的范围内Pattern用于String对象是否符合正则表达式的规则Email用于String对象是否符合邮箱格式Min用于Number和String对象是否大等于指定的值Max用于Number和String对象是否小等于指定的值AssertTrue用于Boolean对象是否为trueAssertFalse用于Boolean对象是否为false
Validated与Valid区别
Validated Spring提供的 支持分组校验 可以用在类型、方法和方法参数上。但是不能用在成员属性字段上 由于无法加在成员属性字段上所以无法单独完成级联校验需要配合Valid
Valid JDK提供的标准JSR-303规范 不支持分组校验 可以用在方法、构造函数、方法参数和成员属性字段上 可以加在成员属性字段上能够独自完成级联校验 4.具体实例展示
4.1导入依赖在pom.xml中
!-- JSR303 --
hibernate.validator.version6.0.7.Final/hibernate.validator.version!-- JSR303 --
dependencygroupIdorg.hibernate/groupIdartifactIdhibernate-validator/artifactIdversion${hibernate.validator.version}/version
/dependency
4.2配置校验规则 NotNull(message 书籍不能为空)// Size(max 1000000,min 1,message 大小必须在10至100之间)protected Integer bid;NotBlank(message 书籍名不能为空)protected String bname;NotBlank(message 书籍价格不能为空)protected Float price;
4.3编写一个新方法用于的校验 RequestMapping(/valiAdd)public String valiAdd(Validated Book book, BindingResult result, HttpServletRequest req){
// 如果服务端验证不通过有错误if(result.hasErrors()){
// 服务端验证了实体类的多个属性多个属性都没有验证通过ListFieldError fieldErrors result.getFieldErrors();MapString,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.bookBiz.insertSelective(book);return redirect:list;}return book/edit;}4.5修改jsp界面的显示 在其中通过加入一个span标签来进行校验的判断显示 % page languagejava contentTypetext/html; charsetUTF-8pageEncodingUTF-8%
!DOCTYPE html PUBLIC -//W3C//DTD HTML 4.01 Transitional//EN http://www.w3.org/TR/html4/loose.dtd
html
headmeta http-equivContent-Type contenttext/html; charsetUTF-8title书籍编辑界面/title
/head
body
form action${pageContext.request.contextPath }/${empty b ? book/valiAdd : book/edit} methodpost书籍编号:input typetext namebid value${b.bid }span stylecolor: red${errorMap.bid}/spanbr书籍名字:input typetext namebname value${b.bname }span stylecolor: red${errorMap.bname}/spanbr书籍价格:input typetext nameprice value${b.price }span stylecolor: red${errorMap.price}/spanbrinput typesubmit
/form
/body
/html
4.6效果展示
1.控制台 2.web界面回显 二.拦截器静态资源不需要
1.什么是拦截器
SpringMVC的处理器拦截器,类似于Servlet开发中的过滤器Filter用于对处理器进行预处理和后处理。依赖于web框架在实现上基于Java的反射机制属于面向切面编程AOP的一种运用。由于拦截器是基于web框架的调用因此可以使用Spring的依赖注入DI进行一些业务操作同时一个拦截器实例在一个 controller生命周期之内可以多次调用。
2.拦截器与过滤器 什么是过滤器Filter 依赖于servlet容器。在实现上基于函数回调可以对几乎所有请求进行过滤但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作比如在过滤器中修改字符编码在过滤器中修改HttpServletRequest的一些参数包括过滤低俗文字、危险字符等。 拦截器与过滤器的区别 过滤器(filter) 1.filter属于Servlet技术只要是web工程都可以使用 2.filter主要由于对所有请求过滤 3.filter的执行时机早于Interceptor 拦截器(interceptor) 1.interceptor属于SpringMVC技术必须要有SpringMVC环境才可以使用 2.interceptor通常由于对处理器Controller进行拦截 3.interceptor只能拦截dispatcherServlet处理的请求
3.拦截器工作原理 preHandle用于对拦截到的请求进行预处理方法接收布尔(true,false)类型的返回值返回true放行false不放行。 执行时机在处理器方法执行前执行 方法参数 参数说明request请求对象response响应对象handler拦截到的方法处理 postHandle用于对拦截到的请求进行后处理可以在方法中对模型数据和视图进行修改 执行时机在处理器的方法执行后视图渲染之前 方法参数 参数说明request请求对象response响应对象handler拦截到的处理器方法ModelAndView处理器方法返回的模型和视图对象可以在方法中修改模型和视图 afterCompletion用于在整个流程完成之后进行最后的处理如果请求流程中有异常可以在方法中获取对象 执行时机视图渲染完成后(整个流程结束之后) 方法参数 参数说明request请求参数response响应对象handler拦截到的处理器方法ex异常对象 4.应用场景
日志记录记录请求信息的日志以便进行信息监控、信息统计、计算PVPage View等。
权限检查如登录检测进入处理器检测是否登录如果没有直接返回到登录页面
性能监控有时候系统在某段时间莫名其妙的慢可以通过拦截器在进入处理器之前记录开始时间在处理完后记录结束时间从而得到该请求的处理时间如果有反向代理如apache可以自动记录
通用行为读取cookie得到用户信息并将用户对象放入请求从而方便后续流程使用还有如提取Locale、Theme信息等只要是多个Controller中的处理方法都需要的我们就可以使用拦截器实现。
5.具体实例
1.创建自定义拦截器
package com.lz.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 {Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println(【OneInterceptor】preHandle...);return true;}Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println(【OneInterceptor】postHandle...);}Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println(【OneInterceptor】afterCompletion...);}
}
3 .在sprinig-mvc.xml中配置拦截器 mvc:interceptorsbean classcom.lz.interceptor.OneInterceptor/bean/mvc:interceptors4.没有拦截的情况默认拦截所有 6.拦截器链
1.配置拦截器链 mvc:interceptors!--2) 多拦截器拦截器链--mvc:interceptormvc:mapping path/**/bean classcom.lz.interceptor.OneInterceptor//mvc:interceptormvc:interceptormvc:mapping path/book/**/bean classcom.lz.interceptor.TwoInterceptor//mvc:interceptor
/mvc:interceptors 2.效果图展示 7.登录的拦截器实例
1.创建拦截器
public class LoginInterceptor implements HandlerInterceptor {Overridepublic 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 uname (String) request.getSession().getAttribute(uname);if (uname null || .equals(uname)){response.sendRedirect(/page/login);return false;}return true;}Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {}Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {}
}
2.配置拦截器(在spring-mvc.xml中) mvc:interceptorsbean classcom.lz.interceptor.LoginInterceptor/bean/mvc:interceptors3.创建登录的contorrl
package com.lz.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;Controller
public class LoginController {RequestMapping(/login)public String login(HttpServletRequest req){String uname req.getParameter(uname);HttpSession session req.getSession();if (zs.equals(uname)){session.setAttribute(uname,uname);}return redirect:/book/list;}RequestMapping(/logout)public String logout(HttpServletRequest req){req.getSession().invalidate();return redirect:/book/list;}
}
4.在创建登录的jsp界面在jsp的包下面
%--Created by IntelliJ IDEA.User: lzzxqDate: 2023/9/12Time: 14:40To change this template use File | Settings | File Templates.
--%
% page contentTypetext/html;charsetUTF-8 languagejava %
html
headtitleTitle/title
/head
body
form action/login methodpost用户名input nameunameinput typesubmit
/form
/body
/html5.展示效果