如何在iis下建设网站,汽车之家app下载,家居网站建设,黄村网站开发公司#x1f3ac; 艳艳耶✌️#xff1a;个人主页 #x1f525; 个人专栏 #xff1a;《推荐】Spring与Mybatis集成整合》 ⛺️ 生活的理想#xff0c;不断更新自己 ! 1.JSR303
1.1JSR303是什么 JSR 303是Java规范请求#xff08;Java Specification Request#xff09;… 艳艳耶✌️个人主页 个人专栏 《推荐】Spring与Mybatis集成整合》 ⛺️ 生活的理想不断更新自己 ! 1.JSR303
1.1JSR303是什么 JSR 303是Java规范请求Java Specification Request的一部分它定义了一套标准的Java Bean验证规范也被称为Bean验证。它提供了一种简单而强大的方式来验证Java对象的属性的值。 在开发应用程序时数据的验证是非常重要的以确保数据的完整性和一致性。传统的验证方式通常需要大量的手动编码而且容易出错。JSR 303的目标是提供一种通用的验证框架以便开发人员可以在应用程序中轻松地执行输入验证。 JSR 303定义了一套验证规范通过在Java类的属性级别上定义验证规则并通过注解的方式将这些规则与属性关联起来。开发人员可以使用内置的验证注解也可以自定义验证注解以满足特定的验证需求。 内置的验证注解包括NotNull、Size、Min、Max、Pattern、Email等。这些注解可以用于验证属性的值是否满足特定的条件如非空、长度范围、最小值、最大值、正则表达式匹配等。 开发人员还可以通过编写自定义的验证注解和验证器来定义和执行自定义的验证规则。自定义验证注解可以根据具体的业务需求定义而验证器则负责实现具体的验证逻辑。 JSR 303的验证框架可以在Java EE和Java SE环境中使用并且已经被许多Java框架广泛采用。例如Hibernate Validator是一个基于JSR 303规范的验证框架它与Hibernate ORM框架集成提供了强大的数据验证功能。Spring Framework也支持JSR 303规范可以在Spring应用程序中使用注解进行数据验证。 通过使用JSR 303的验证框架开发人员可以简化数据验证的过程减少手动编码的工作量并提高代码的可读性和可维护性。它是Java开发中重要的一部分帮助开发人员构建更健壮和可靠的应用程序。 1.2JSR303作用 JSR 303的具体作用是提供一种通用的验证框架用于验证Java对象的属性的值。它在应用程序开发中的作用有以下几个方面 1. 数据验证JSR 303允许开发人员在Java类的属性级别上定义验证规则并通过注解的方式将这些规则与属性关联起来。通过使用内置的验证注解或自定义的验证注解开发人员可以验证属性的值是否符合特定的条件如非空、长度范围、最小值、最大值、正则表达式等。这样可以确保输入数据的完整性和一致性防止无效或不合法的数据进入应用程序。 2. 错误处理JSR 303提供了一种标准的错误处理机制当验证失败时可以生成详细的错误信息。开发人员可以通过捕获验证异常或检查验证结果来处理验证错误。这样可以帮助开发人员快速定位和解决数据验证问题并向用户提供友好的错误提示。 3. 可读性和可维护性通过使用JSR 303的验证框架开发人员可以将验证规则与属性直接关联起来使代码更加清晰和易于理解。验证规则以注解的形式存在于代码中使得验证逻辑更加直观和可读。此外通过使用注解验证规则与属性的关联性得到了明确的表达使得代码更易于维护和修改。 4. 框架集成JSR 303的验证框架已经被许多Java框架广泛采用。例如Hibernate Validator是一个基于JSR 303规范的验证框架与Hibernate ORM框架集成提供了强大的数据验证功能。Spring Framework也支持JSR 303规范可以在Spring应用程序中使用注解进行数据验证。通过与这些框架的集成开发人员可以更方便地使用JSR 303的验证功能提高开发效率。 总之JSR 303的具体作用是提供一种简单而强大的验证框架用于验证Java对象的属性的值。它可以帮助开发人员确保输入数据的完整性和一致性并提供标准的错误处理机制。通过提高代码的可读性和可维护性以及与其他框架的集成JSR 303可以提高应用程序的质量和开发效率。 1.3JSR303常用注解
注解说明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规范 不支持分组校验 可以用在方法、构造函数、方法参数和成员属性字段上 可以加在成员属性字段上能够独自完成级联校验 1.4JSR303入门使用
小编上一篇写了SpringMvc文件上传下载一条龙服务教会你 就不重复写了。
首先导入依赖
!-- JSR303 --
hibernate.validator.version6.0.7.Final/hibernate.validator.version!-- JSR303 --
dependencygroupIdorg.hibernate/groupIdartifactIdhibernate-validator/artifactIdversion${hibernate.validator.version}/version
/dependency
配置校验规则
在实体类相对应的属性中增加注解用来指定校验 NotNull(message 书籍编号不能为空)private Integer bid;NotBlank(message 书籍名不能为空)private String bname;private String bimage;NotBlank(message 书籍价格不能为空)private Float price;
在需要校验的对象类的控制器中增加要请求处理方法中使用Validated或Valid注解要验证的对象并根据BindingResult判断校验是否通过 // 给数据添加服务端校验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;}在编辑页面的使用代码修改为以下代码 :
% page contentTypetext/html;charsetUTF-8 languagejava %
html
headtitleTitle/title
/head
body%--/book/add--%%--/book/edit--%
form action${pageContext.request.contextPath }/book/${empty b ? valiAdd : edit} methodpostbid:input typetext namebid value${b.bid }span stylecolor: blue;${errorMap.bid}/spanbrbname:input typetext namebname value${b.bname }span stylecolor: blue;${errorMap.bname}/spanbrprice:input typetext nameprice value${b.price }span stylecolor: blue;${errorMap.price}/spanbrinput typesubmit
/form
/body
/html最后 开启服务器到浏览器中请求访问该地址进行测试. 2.拦截器
2.1 是什么 拦截器Interceptor是一种在请求处理过程中对请求进行拦截和处理的机制。它可以在请求到达目标处理器之前、之后或者完全替代目标处理器来执行一些特定的操作。拦截器通常用于实现一些横切关注点Cross-cutting Concerns如日志记录、权限验证、性能监控等。 拦截器可以在整个请求处理过程中对请求进行多次拦截每个拦截器都可以根据自己的需求对请求进行处理并决定是否继续传递给下一个拦截器或目标处理器。拦截器可以形成一个拦截器链按照一定的顺序依次对请求进行处理每个拦截器都可以对请求进行修改或者中断请求处理流程。 在Web开发中拦截器常用于对请求进行预处理和后处理。当一个请求到达服务器时拦截器可以在请求到达目标处理器之前对请求进行一些预处理操作如记录日志、验证权限等在请求处理完成后拦截器可以对响应进行后处理操作如修改响应数据、设置响应头等。 在Java的Web开发中拦截器通常是通过实现javax.servlet.Filter接口来实现的。Filter是Servlet规范中定义的一种用于在请求和响应之间进行拦截和处理的组件。通过在web.xml配置拦截器的URL模式和顺序可以将拦截器应用到特定的URL或URL模式上。 拦截器的优点是可以将一些通用的操作抽离出来避免在每个处理器中重复编写相同的代码。它提供了一种可扩展和可配置的方式来处理请求使得系统的功能更加模块化和可维护。拦截器还可以实现一些与业务逻辑无关的功能如性能监控、日志记录等提高系统的可用性和可靠性。 拦截器工作原理 2.2 拦截器与过滤器的区别 什么是过滤器Filter 过滤器Filter是Java Web开发中的一种组件它主要用于对Servlet请求进行预处理和后处理。过滤器可以在请求到达目标Servlet之前或者之后执行一些特定的操作如对请求参数进行解析、字符编码转换、请求日志记录等。通过过滤器开发人员可以对请求进行统一的处理提高代码的复用性和可维护性。 过滤器是基于Java的Servlet规范实现的它是通过实现Filter接口来定义过滤器并通过在web.xml配置过滤器的URL模式和顺序来应用到特定的请求。在过滤器链中每个过滤器都可以对请求进行修改或者中断请求处理流程。过滤器的执行顺序由web.xml中的配置决定按照配置的顺序依次对请求进行处理。 过滤器的主要作用包括 请求预处理对请求进行预处理如解析请求参数、字符编码转换、请求日志记录等。请求后处理对请求的响应进行后处理如设置响应头、字符编码转换、响应日志记录等。权限验证对请求进行权限验证如用户登录验证、访问权限验证等。缓存控制对请求进行缓存控制如设置缓存过期时间、缓存验证等。异常处理对请求中可能出现的异常进行处理如捕获异常、记录异常日志等。 拦截器的主要作用包括 日志记录拦截器可以记录请求的相关信息如请求的URL、请求参数、请求的处理时间等用于系统的日志记录和分析。权限验证拦截器可以对请求进行权限验证判断用户是否具有访问特定资源的权限如用户登录验证、角色权限验证等。参数校验拦截器可以对请求的参数进行校验确保参数的合法性和有效性如参数的格式、范围、长度等。请求预处理拦截器可以对请求进行预处理如字符编码转换、请求参数解析、请求数据的封装等。请求后处理拦截器可以对请求的响应进行后处理如设置响应头、字符编码转换、响应数据的封装等。异常处理拦截器可以捕获请求处理过程中可能出现的异常并进行相应的处理如异常的日志记录、错误页面的跳转等。性能监控拦截器可以对请求的处理时间进行监控用于系统的性能分析和优化。 2.3 应用场景 日志记录拦截器可以用于记录请求的相关信息如请求的URL、请求参数、请求的处理时间等。通过拦截器记录日志可以方便后续的系统日志记录和分析以及对请求的追踪和排查问题。 权限验证拦截器可以用于对用户进行权限验证判断用户是否具有访问特定资源的权限。例如在用户访问某个需要登录的页面之前拦截器可以检查用户是否已登录并根据用户的角色判断是否有权限访问该页面。 请求预处理拦截器可以用于对请求进行预处理如字符编码转换、请求参数解析、请求数据的封装等。通过拦截器进行预处理可以减轻目标处理器的负担提高请求的处理效率和系统的稳定性。 性能监控拦截器可以用于监控请求的处理时间用于系统的性能分析和优化。例如拦截器可以记录请求的处理时间并根据时间阈值进行性能告警或者对慢请求进行分析和优化。 总之拦截器可以应用于多个场景包括权限验证、日志记录、参数校验、请求预处理、请求后处理、异常处理和性能监控等。通过拦截器开发人员可以对请求进行统一的处理提高代码的复用性和可维护性同时实现系统的安全性、稳定性和性能优化。 2.4 基础使用
创建一个名为 Interceptor 的包存放创建自定义拦截器
创建一个创建自定义拦截器名为 : OneInterceptor代码如下
package com.sy.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...);}
}
在名为 spring-mvc.xml 的配置文件中配置自定义拦截器
!--配置拦截器--mvc:interceptorsbean classcom.sy.interceptor.OneInterceptor/bean/mvc:interceptors
启动项目服务器打开浏览器访问请求地址测试拦截器的拦截效果。
测试结果 拦截器链同时配置多个拦截器可以进行区别拦截
在 Interceptor 的包里创建一个拦截器 TwoInterceptor。
package com.sy.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 {Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println(【TwoInterceptor】preHandle...);return true;}Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println(【TwoInterceptor】postHandle...);}Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println(【TwoInterceptor】afterCompletion...);}
}
在名为 spring-mvc.xml 的配置文件中配置自定义拦截器链 !--2) 多拦截器拦截器链--mvc:interceptormvc:mapping path/**/bean classcom.sy.interceptor.OneInterceptor//mvc:interceptormvc:interceptormvc:mapping path/book/**/bean classcom.sy.interceptor.TwoInterceptor//mvc:interceptor
注意: 这里需要将我们上次配置的拦截器配置进行注释注释以下配置 2.5 用户登录权限控制
创建一个名为 : LoginInterceptor 的拦截器
package com.sy.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 {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 bname (String) request.getSession().getAttribute(bname);if (bname null || .equals(bname)){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 {}
}
创建一个名为 : LoginController 的控制器
package com.sy.web;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;/*** author 谌艳* site www.shenyan.com* create 2023-09-11 22:31*/Controller
public class LoginController {RequestMapping(/login)public String login(HttpServletRequest req){String bname req.getParameter(bname);HttpSession session req.getSession();if (zs.equals(bname)){session.setAttribute(bname,bname);}return redirect:/book/list;}RequestMapping(/logout)public String logout(HttpServletRequest req){req.getSession().invalidate();return redirect:/book/list;}}创建一个 login.jsp 的显示页面进行测试效果
%--Created by IntelliJ IDEA.User: 86177Date: 2023/9/11Time: 22:29To change this template use File | Settings | File Templates.
--%
% page contentTypetext/html;charsetUTF-8 languagejava %
html
headtitleTitle/title
/head
body
h1登录/h1
form action${pageContext.request.contextPath }/login methodpost enctypemultipart/form-datalabel用户名称/labelbr/input typetext namebname/br/input typesubmit value登入/
/form/body
/html在名为 spring-mvc.xml 的配置文件中配置自定义拦截器配置登入的用户。
!--配置拦截器--mvc:interceptors!--单个配置拦截器--bean classcom.sy.interceptor.LoginInterceptor/bean/mvc:interceptors
启动项目服务器打开浏览器访问请求地址测试效果。
测试结果 今日分享到这就结束了