首页
友情链接
精美壁纸
给我留言
更多
关于我
Search
1
uniapp Click点击事件冲突解决
4,587 阅读
2
【插件】UNI APP 实现商米打印机功能支持T1,T2,V2机型
4,002 阅读
3
【测试可用】个人码免签支付系统源码/免签支付系统/微信支付平台
2,042 阅读
4
windows10下docker:给已存在的容器添加端口映射的方法
1,253 阅读
5
Java Validation参数校验注解使用
1,235 阅读
Java
Spring Boot
Spring Mvc
Java基础
进阶知识
前端
uniapp
小程序/公众号
JavaScript
HTML/CSS
Vue
PHP
开源软件
商城
营销工具
开发工具
视频/教程
Discuz主题/插件
typecho主题/插件
SEO杂谈
数据库
MongoDB
MySQL
Redis
单片机
概念说明
电路相关
Python
devops
docker
k8s
linux
职场杂谈
登录
/
注册
Search
标签搜索
python
mysql
人人商城
php
java
docker
typecho
插件
微擎
seo
spring boot
discuz
队列
uni-app
phpcms
教程视频
开源系统
源码
工具
css
哈根达斯
累计撰写
108
篇文章
累计收到
161
条评论
首页
栏目
Java
Spring Boot
Spring Mvc
Java基础
进阶知识
前端
uniapp
小程序/公众号
JavaScript
HTML/CSS
Vue
PHP
开源软件
商城
营销工具
开发工具
视频/教程
Discuz主题/插件
typecho主题/插件
SEO杂谈
数据库
MongoDB
MySQL
Redis
单片机
概念说明
电路相关
Python
devops
docker
k8s
linux
职场杂谈
页面
友情链接
精美壁纸
给我留言
关于我
搜索到
108
篇与
哈根达斯
的结果
2021-08-11
java中xml转移说明
被<![CDATA[]]>这个标记所包含的内容将表示为纯文本,比如<![CDATA[<]]>表示文本内容“<”。 此标记用于xml文档中,我们先来看看使用转义符的情况。我们知道,在xml中,”<”、”>”、”&”等字符是不能直接存入的,否则xml语法检查时会报错,如果想在xml中使用这些符号,必须将其转义为实体,如”<”、”>”、”&”,这样才能保存进xml文档。 在使用程序读取的时候,解析器会自动将这些实体转换回”<”、”>”、”&”。举个例子: <age> age < 30 </age> 上面这种写法会报错,应该这样写: <age> age < 30 </age> 值得注意的是: (1)转义序列字符之间不能有空格; (2) 转义序列必须以”;”结束; (3) 单独出现的”&”不会被认为是转义的开始; (4) 区分大小写。 在XML中,需要转义的字符有: (1) & & (2) < < (3) > > (4) " " (5) ' ' 但是严格来说,在XML中只有”<”和”&”是非法的,其它三个都是可以合法存在的,但是,把它们都进行转义是一个好的习惯。 不管怎么样,转义前的字符也好,转义后的字符也好,都会被xml解析器解析,为了方便起见,使用<![CDATA[]]>来包含不被xml解析器解析的内容。但要注意的是: (1) 此部分不能再包含”]]>”; (2) 不允许嵌套使用; (3)”]]>”这部分不能包含空格或者换行。 最后,说说<![CDATA[]]>和xml转移字符的关系,它们两个看起来是不是感觉功能重复了? 是的,它们的功能就是一样的,只是应用场景和需求有些不同: (1)<![CDATA[]]>不能适用所有情况,转义字符可以; (2) 对于短字符串<![CDATA[]]>写起来啰嗦,对于长字符串转义字符写起来可读性差; (3) <![CDATA[]]>表示xml解析器忽略解析,所以更快。
2021年08月11日
337 阅读
0 评论
0 点赞
2021-08-11
Java 书单:比较全的一篇
健康《程序员健康指南》- 链接:https://pan.baidu.com/s/1hb8xQCE3TrEjazF5ZCe6-w ,提取码:h6fh本书是为程序员量身制作的健康指南,针对头痛、眼部疲劳、背部疼痛和手腕疼痛等常见的问题,简要介绍了其成因、测试方法,并列出了每天的行动计划,从运动、饮食等方面给出详细指导,帮助程序员在不改变工作方式的情况下轻松拥有健康。之所以把这个放到第一位,是因为许多健康问题都是知道的越早越好,这样才能更好地预防Java 基础《Head First Java(第二版)》- 链接:https://pan.baidu.com/s/17LNLb-1s_k9wR1kK__s1eQ ,提取码:v3ae《Java核心技术卷一(第十版)》- 链接:https://pan.baidu.com/s/1l-pDMOkR832ceA5q2CVZ7g ,提取码:v88g《Java编程思想(第四版)》 - 链接:https://pan.baidu.com/s/1NwOrkSadZuL64DH43_5rKA ,提取码:jgorJava 进阶偏实战,需要打好上面的基础《Java8实战》- 链接:https://pan.baidu.com/s/1P6RBXi5PzRm4zuKgUr14sg ,提取码:q3lo《Java 并发编程实战》- 链接:https://pan.baidu.com/s/1m6ts-HSu2SgFVRgJKKPl6Q ,提取码:i7nz《实战Java高并发程序设计(第2版) 》- 链接:https://pan.baidu.com/s/1tSPNtR1CNGea6gKfXnBklA ,提取码:dad3《Java性能权威指南》- 链接:https://pan.baidu.com/s/1OlHlJ4qyPHQe5QMB6qkLmw ,提取码:vwca《深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)》- 链接:https://pan.baidu.com/s/1ZQi72jiqQzHlFhdkMqJtXg ,提取码:h7n7Java 优化下面主要讲解了Java开发常见的一些规范,使代码更加整洁高效《码出高效:Java开发手册》- 链接:https://pan.baidu.com/s/19sttAcC01G0wg1nqkfmprA ,提取码:zemp《Effective Java(第三版)》- 链接:https://pan.baidu.com/s/1RDaiVNViHvTVVunMkpFecg ,提取码:m9qe《嵩山版 Java 开发手册》- 链接:https://pan.baidu.com/s/1Rgh5tA_yPE-nV9MjPE572w ,提取码:62iw《代码整洁之道》《程序员修炼之道 从小工到专家》- 链接:https://pan.baidu.com/s/1lVoRCEr9NJR2I5rPneXK0g ,提取码:fxwe计算机《TCP-IP详解(卷一、二、三)》- 链接:https://pan.baidu.com/s/1D7luuYvEfTjaC7bh8Tm1Hg ,提取码:pmcj《深入理解计算机系统(原书第3版)》- 链接:https://pan.baidu.com/s/15F6MOyryXUI_l7DLoNbgiA ,提取码:7x0u算法《算法图解》- 链接:https://pan.baidu.com/s/1qbJAJbLInXo-rlPBGLOFUA ,提取码:k9nj《算法珠玑(Java版)》- 链接:https://pan.baidu.com/s/1EQj2sQk1Ys-EU8mwHho_MA ,提取码:7fxt《Leetcode 前 300 题算法题解析(Java)》- 链接:https://pan.baidu.com/s/1BGuMZW2ec4P_cyiv6sicww ,提取码:2jty设计模式《Head First 设计模式》- 链接:https://pan.baidu.com/s/1rxH5Ll38VpHl_j6ts6Q-oQ ,提取码:z6xg《Design-Pattern包教不包会(设计模式包教不包会)》- 链接:https://pan.baidu.com/s/1SDIsamZCv7JKY1zTuNLKtg ,提取码:81ci《设计模式 Java版本》- 链接:https://pan.baidu.com/s/1ikneBCgvAoIk5A-M6snIPg ,提取码:7b98《设计模式:可复用面向对象软件的基础》- 链接:https://pan.baidu.com/s/1CPJUAJp_oryQnKxWCbn8tA ,提取码:7qtiSpring 全家桶《Spring实战(第4版)》- 链接:https://pan.baidu.com/s/1CC1mAD4kZ57SmQRA8NEDXg ,提取码:ei6v《Spring Boot实战 》- 链接:https://pan.baidu.com/s/1QPfW43uN1uTJnsdKzUBDog ,提取码:aukv《Spring Boot 2企业应用实战》- 链接:https://pan.baidu.com/s/1s31xMCJ3WIjN2Koc-hSlyg ,提取码:3apd《JavaEE开发的颠覆者 Spring Boot实战》- 链接:https://pan.baidu.com/s/1TOmImwqszUDYmXc9uALaWg ,提取码:blpp《SpringBoot实战系列》- 链接:https://pan.baidu.com/s/1PPvY5goAI8L3SChfYSaAiw ,提取码:j26wMaven 依赖管理《Maven实战 高清》- 链接:https://pan.baidu.com/s/1MUZOKKjv5F7XY32aUIDaog ,提取码:xj6wMySQL 数据库《MySQL技术内幕(第5版)》- 链接:https://pan.baidu.com/s/1Dv6HXvhmyiGA2Gsn7NBo3w ,提取码:d7pj《MySQL技术内幕:InnoDB存储引擎(第2版)》- 链接:https://pan.baidu.com/s/1-dRbRaERiEJGIg3tgg00_A ,提取码:t4rh《高性能MySQL(第3版)》- 链接:https://pan.baidu.com/s/1yjHTlNcJLTaXjUAv2al0HA ,提取码:v037《Effective MySQL之SQL语句最优化》- 链接:https://pan.baidu.com/s/1IVWZw_JfL8y0KQ290gHT6w ,提取码:cbiy《SQL反模式》- 链接:https://pan.baidu.com/s/1C_jnScaSBw72ET_Qkh5phQ ,提取码:qspw《深入MySQL实战》- 链接:https://pan.baidu.com/s/14IP44JpJruedpOilLTiUog ,提取码:ejia《mybatis-plus 实践及架构原理》- 链接:https://pan.baidu.com/s/1bBVCVy6_YRM0aMeNOAveww ,提取码:joexRedis 数据库《redis设计与实现(第二版)》- 链接:https://pan.baidu.com/s/19mtOtYKLFWoY9fpP4v7MsA ,提取码:7cmx《Redis深度历险:核心原理和应用实践》- 链接:https://pan.baidu.com/s/1tVTucPsmwY2M5HJSNvhpCg ,提取码:oyiyRabbitMQ 消息队列《RabbitMQ实战 高效部署分布式消息队列》- 链接:https://pan.baidu.com/s/11btAl5txQLPd6DcT3hX0FA ,提取码:lmz5《深入RabbitMQ》- 链接:https://pan.baidu.com/s/1F4iCPSJGhBBQzaebC_E_BA ,提取码:nhp0架构《架构探险:从零开始写分布式服务框架》- 链接:https://pan.baidu.com/s/1_Eo4pqAekHVyBlJ7EIayZA ,提取码:lc2t《大型网站技术架构 核心原理与案例分析》- 链接:https://pan.baidu.com/s/1zt4Ee4sUnO4H654ZeuRxTg ,提取码:w1rb
2021年08月11日
113 阅读
0 评论
0 点赞
2021-08-05
MybatisPlus LambdaQueryWrapper类方法说明
方法含义对照表
2021年08月05日
244 阅读
0 评论
0 点赞
2021-07-29
Java Validation参数校验注解使用
前言Hibernate Validator 是 Bean Validation 的参考实现 。Hibernate Validator 提供了 JSR 303 规范中所有内置 constraint 的实现,除此之外还有一些附加的 constraint在日常开发中,Hibernate Validator经常用来验证bean的字段,基于注解,方便快捷高效。在SpringBoot中可以使用 @Validated ,注解Hibernate Validator加强版,也可以使用 @Valid 原来Bean Validation java版本内置校验注解Bean Validation 中内置的 constraintHibernate Validator 附加的 constraintmessage支持表达式和EL表达式 ,比如message = "姓名长度限制为{min}到{max} ${1+2}")想把错误描述统一写到properties的话,在classpath下面新建ValidationMessages_zh_CN.properties文件(注意value需要转换为unicode编码),然后用{}格式的占位符hibernate补充的注解中,最后3个不常用,可忽略。主要区分下@NotNull, @NotEmpty ,@NotBlank 3个注解的区别:@NotNull 任何对象的value不能为null@NotEmpty 集合对象的元素不为0,即集合不为空,也可以用于字符串不为null@NotBlank 只能用于字符串不为null,并且字符串trim()以后length要大于0分组校验如果同一个参数,需要在不同场景下应用不同的校验规则,就需要用到分组校验了。比如:新注册用户还没起名字,我们允许name字段为空,但是在更新时候不允许将名字更新为空字符。分组校验有三个步骤:1 .定义一个分组类(或接口)public interface Update extends Default{ }在校验注解上添加groups属性指定分组public class UserVO { @NotBlank(message = "name 不能为空",groups = Update.class) private String name; // 省略其他代码... }Controller方法的@Validated注解添加分组类@PostMapping("update") public ResultInfo update(@Validated({Update.class}) UserVO userVO) { return new ResultInfo().success(userVO); }自定义的Update分组接口继承了Default接口。校验注解(如: @NotBlank)和@validated默认其他注解都属于Default.class分组,这一点在javax.validation.groups.Default注释中有说明/** * Default Jakarta Bean Validation group. * <p> * Unless a list of groups is explicitly defined: * <ul> * <li>constraints belong to the {@code Default} group</li> * <li>validation applies to the {@code Default} group</li> * </ul> * Most structural constraints should belong to the default group. * * @author Emmanuel Bernard */ public interface Default { }在编写Update分组接口时,如果继承了Default,下面两个写法就是等效的:@Validated({Update.class}),@Validated({Update.class,Default.class})如果Update不继承Default,@Validated({Update.class})就只会校验属于Update.class分组的参数字段递归校验如果 UserVO 类中增加一个 OrderVO 类的属性,而 OrderVO 中的属性也需要校验,就用到递归校验了,只要在相应属性上增加 @Valid 注解即可实现(对于集合同样适用)public class OrderVO { @NotNull private Long id; @NotBlank(message = "itemName 不能为空") private String itemName; // 省略其他代码... }public class UserVO { @NotBlank(message = "name 不能为空",groups = Update.class) private String name; //需要递归校验的OrderVO @Valid private OrderVO orderVO; // 省略其他代码... }自定义校验validation 为我们提供了这么多特性,几乎可以满足日常开发中绝大多数参数校验场景了。但是,一个好的框架一定是方便扩展的。有了扩展能力,就能应对更多复杂的业务场景,毕竟在开发过程中,唯一不变的就是变化本身。 Validation允许用户自定义校验实现很简单,分两步:自定义校验注解package cn.soboys.core.validator; import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.*; /** * 日期验证 约束注解类 */ @Target({ElementType.METHOD, ElementType.FIELD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Constraint(validatedBy = {IsDateTimeValidator.class}) // 标明由哪个类执行校验逻辑 public @interface IsDateTime { // 校验出错时默认返回的消息 String message() default "日期格式错误"; //分组校验 Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; //下面是我自己定义属性 boolean required() default true; String dateFormat() default "yyyy-MM-dd"; }注意: message 用于显示错误信息这个字段是必须的, groups和payload也是必须的@Constraint(validatedBy = { HandsomeBoyValidator.class})用来指定处理这个注解逻辑的类编写校验者类package cn.soboys.core.validator; import cn.hutool.core.util.StrUtil; import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; /** * 日期验证器 */ public class IsDateTimeValidator implements ConstraintValidator<IsDateTime, String> { private boolean required = false; private String dateFormat = "yyyy-MM-dd"; /** * 用于初始化注解上的值到这个validator * @param constraintAnnotation */ @Override public void initialize(IsDateTime constraintAnnotation) { required = constraintAnnotation.required(); dateFormat = constraintAnnotation.dateFormat(); } /** * 具体的校验逻辑 * @param value * @param context * @return */ public boolean isValid(String value, ConstraintValidatorContext context) { if (required) { return ValidatorUtil.isDateTime(value, dateFormat); } else { if (StrUtil.isBlank(value)) { return true; } else { return ValidatorUtil.isDateTime(value, dateFormat); } } } }注意这里验证逻辑我抽出来单独写了一个工具类, ValidatorUtilpackage cn.soboys.core.validator; import cn.hutool.core.date.DateUtil; import cn.hutool.core.text.StrFormatter; import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.StrUtil; import java.lang.reflect.Method; import java.math.BigDecimal; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * 验证表达式 */ public class ValidatorUtil { private static final Pattern mobile_pattern = Pattern.compile("1\\d{10}"); private static final Pattern money_pattern = Pattern.compile("^[0-9]+\\.?[0-9]{0,2}$"); /** * 验证手机号 * * @param src * @return */ public static boolean isMobile(String src) { if (StrUtil.isBlank(src)) { return false; } Matcher m = mobile_pattern.matcher(src); return m.matches(); } /** * 验证枚举值是否合法 ,所有枚举需要继承此方法重写 * * @param beanClass 枚举类 * @param status 对应code * @return * @throws Exception */ public static boolean isEnum(Class<?> beanClass, String status) throws Exception { if (StrUtil.isBlank(status)) { return false; } //转换枚举类 Class<Enum> clazz = (Class<Enum>) beanClass; /** * 其实枚举是语法糖 * 是封装好的多个Enum类的实列 * 获取所有枚举实例 */ Enum[] enumConstants = clazz.getEnumConstants(); //根据方法名获取方法 Method getCode = clazz.getMethod("getCode"); Method getDesc = clazz.getMethod("getDesc"); for (Enum enums : enumConstants) { //得到枚举实例名 String instance = enums.name(); //执行枚举方法获得枚举实例对应的值 String code = getCode.invoke(enums).toString(); if (code.equals(status)) { return true; } String desc = getDesc.invoke(enums).toString(); System.out.println(StrFormatter.format("实列{}---code:{}desc{}", instance, code, desc)); } return false; } /** * 验证金额0.00 * * @param money * @return */ public static boolean isMoney(BigDecimal money) { if (StrUtil.isEmptyIfStr(money)) { return false; } if (!NumberUtil.isNumber(String.valueOf(money.doubleValue()))) { return false; } if (money.doubleValue() == 0) { return false; } Matcher m = money_pattern.matcher(String.valueOf(money.doubleValue())); return m.matches(); } /** * 验证 日期 * * @param date * @param dateFormat * @return */ public static boolean isDateTime(String date, String dateFormat) { if (StrUtil.isBlank(date)) { return false; } try { DateUtil.parse(date, dateFormat); return true; } catch (Exception e) { return false; } } }我自定义了补充了很多验证器,包括日期验证,枚举验证,手机号验证,金额验证自定义校验注解使用起来和内置注解无异,在需要的字段上添加相应注解即可校验流程解析使用 Validation API 进行参数效验步骤整个过程如下图所示,用户访问接口,然后进行参数效验 ,如果效验通过,则进入业务逻辑,否则抛出异常,交由全局异常处理器进行处理
2021年07月29日
1,235 阅读
0 评论
0 点赞
2021-07-22
mysql位置距离排序功能实现
再实际的开发中,我们经常需要使用地理经纬度信息来做排序,比如查找附近的门店,或查找离我最近的人的需求等。可直接套用下方mysql查询语句进行数据查询排序sql中latitude为数据库表中的纬度,longitude代表经度{latitude} 代表传入的纬度,{latitude} 代表传入的经度,主要为用户当前位置信息,查询获得结果 distance 单位为米SELECT *, (round(6367000 * 2 * asin(sqrt(pow(sin(((latitude * pi()) / 180 - (${latitude} * pi()) / 180) / 2), 2) + cos((${latitude} * pi()) / 180) * cos((latitude * pi()) / 180) * pow(sin(((longitude * pi()) / 180 - (${longitude} * pi()) / 180) / 2), 2))))) AS distance FROM ec_store WHERE is_show = 1 and is_del = 0 ORDER BY distance asc
2021年07月22日
272 阅读
0 评论
1 点赞
1
...
14
15
16
...
22