首页 文章 精选 留言 我的

精选列表

搜索[VSCode扩展],共10000篇文章
优秀的个人博客,低调大师

JFinal 参数校验插件扩展,让后台参数校验像js一样方式好用

一、插件实现 插件的功能就是加载校验规则,实现代码如下 package com.nmtx.plugins.validation; import java.util.Properties; import com.jfinal.core.Const; import com.jfinal.kit.Prop; import com.jfinal.kit.PropKit; import com.jfinal.plugin.IPlugin; public class ValidationPlugin implements IPlugin{ protected Prop prop = null; public ValidationPlugin(String fileName) { prop = PropKit.use(fileName, Const.DEFAULT_ENCODING); } public ValidationPlugin(String fileName, String encoding) { prop = PropKit.use(fileName, encoding); } /** * 初始化校验规则 */ public boolean start() { Properties properties = prop.getProperties(); for (Object object : properties.keySet()) { String key = (String) object; String rule[] = properties.getProperty(key).split(","); ValidationRules.ruleMap.put(key, rule[0]); ValidationRules.ruleErrorMessageMap.put(key,rule[1]); } return true; } public boolean stop() { return true; } } package com.nmtx.plugins.validation; import java.util.HashMap; import java.util.Map; import java.util.regex.Pattern; import com.jfinal.kit.StrKit; public class ValidationRules { static Map<String, String> ruleMap = new HashMap<String,String>(); static Map<String, String> ruleErrorMessageMap = new HashMap<String,String>(); public static boolean isMatch(String rule, String value) { boolean matchResult; if(rule.equals("required")){ matchResult = StrKit.notBlank(value); }else { if(StrKit.notBlank(value))matchResult = Pattern.compile(ruleMap.get(rule)).matcher(value).matches(); else matchResult = true; } return matchResult; } public static String getErrorMessage(String rule){ return ruleErrorMessageMap.get(rule); } } 规则加载后就是如何拦截校验了,这里用拦截器实现大概如下 package com.nmtx.plugins.validation; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; import com.jfinal.aop.Duang; import com.jfinal.aop.Interceptor; import com.jfinal.aop.Invocation; import com.jfinal.core.Controller; import com.jfinal.kit.StrKit; import com.nmtx.common.ErrorCode; import com.nmtx.common.MessageResp; import com.nmtx.controller.para.IParaFormat; import com.nmtx.controller.para.impl.HumpToMiddleScoreFormat; public class ValidatorInterceptor implements Interceptor { private IParaFormat humpParaFormat = Duang.duang("humpParaFormat", HumpToMiddleScoreFormat.class); public void intercept(Invocation inv) { String methodName = inv.getMethodName(); Controller controller = inv.getController(); Method[] methods = controller.getClass().getDeclaredMethods(); boolean matchResult = true; for (Method method : methods) { if (method.getName().equals(methodName)) { boolean hasAnnotation = method.isAnnotationPresent(Validation.class); if (hasAnnotation) { Validation anno = method.getAnnotation(Validation.class); Map<String, String> ruleMap = dealRule(anno.rules()); for (String key : ruleMap.keySet()) { String value = controller.getPara(humpParaFormat.paraToFormat(key)); String rule = ruleMap.get(key); matchResult = ValidationRules.isMatch(rule, value); MessageResp<String> message = new MessageResp<String>(); message.setCode(ErrorCode.ERROR); if (!matchResult) { message.setMessage(humpParaFormat.paraToFormat(key)+ValidationRules.getErrorMessage(rule)); message.setData(""); controller.renderJson(message); break; } } } } } if (matchResult) inv.invoke(); } public Map<String, String> dealRule(String rules) { Map<String, String> map = new IdentityHashMap<String, String>(); if (StrKit.notBlank(rules)) { String[] paraRules = rules.split(";"); for (String paraRule : paraRules) { String[] para = paraRule.split("="); map.put(para[0], para[1]); } } return map; } } 有了拦截器,拦截的方法肯定需要注解了,注解实现如下 package com.nmtx.plugins.validation; import java.lang.annotation.*; /** * 定义Validator规则的注解 * @author lianghao * */ @Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface Validation { String rules (); } 这样拦截插件构造就完成了 二,使用篇 添加插件 /** * 定义插件,如数据库连接等一些插件 */ @Override public void configPlugin(Plugins me) { me.add(new ValidationPlugin("validation.properties")); } 添加全局拦截 /** * 必须按这种顺序,不允许改,不得在新增新的全局拦截器 */ @Override public void configInterceptor(Interceptors me) { me.add(new ValidatorInterceptor()); } 只需一个注解就搞定参数校验,demo如下 @Validation(rules = "userName=required;password=required") public void login() { } 需要什么规则还可以自己加在配置文件里,附上一些常用的校验 email=^\w+([-+.]\w+)@\w+([-.]\w+)\.\w+([-.]\w+)*$,"邮箱格式不正确" chinese=^[\u4e00-\u9fa5]+$,"不是中文" number=^[0-9]*$,"只能输入数字" phone=^1+[0-9]{10}$,"号码格式不正确" idcard=^(\d{15}|\d{18})$,"身份证号码不正确"//15或18位 postCode=^[0-9]{6}$,"邮政编码格式不正确" url=[a-zA-z]+://[^\s]*,"url格式不对" date=[0-9]{4}-[0-9]{2}-[0-9]{2},"时间格式不对(yyyy-mm-dd)" creditcard=^((?:4\d{3})|(?:5[1-5]\d{2})|(?:6011)|(?:3[68]\d{2})|(?:30[012345]\d),"信用卡格式不正确" acceptImg=[.](jpg|gif|bmp|png)$,"图片后缀名格式不正确" acceptFile=[.](xls|xlsx|csv|txt)$,"文件后缀名格式不正确" required=required,"参数不能为空"

优秀的个人博客,低调大师

Istio on ACK集成生态(2): 扩展AlertManager集成钉钉助力可观测性监控能力

阿里云容器服务Kubernetes(简称ACK)支持一键部署Istio,可以参考文档在ACK上部署使用Isito。Istio on ACK提供了丰富的监控能力,为网格中的服务收集遥测数据,其中Mixer是负责提供策略控制和遥测收集的Istio组件。使用Prometheus进行监控是Istio提供的监控能力之一。 告警能力在Prometheus的架构中被划分成两个独立的部分:Prometheus负责产生告警,而Alertmanager负责告警产生后的后续处理。如下所示,通过在Prometheus中定义告警规则,Prometheus会周期性的对告警规则进行计算,如果满足告警触发条件就会向Alertmanager发送告警信息。 Alertmanager作为一个独立的组件,负责接收并处理来自Prometheus Server(也可以是其它的客

优秀的个人博客,低调大师

Airbnb 是如何通过 balanced Kafka reader 来扩展 Spark streaming 实时流处理能力的

Airbnb 日志事件获取 日志事件从客户端(例如移动应用程序和 Web 浏览器)和在线服务发出,其中包含行为或操作的关键信息。每个事件都有一个特定的信息。例如,当客人在 Airbnb.com 上搜索马里布的海滨别墅时,将生成包含位置,登记和结账日期等的搜索事件。 在 Airbnb,事件记录对于我们理解客人和房东,然后为他们提供更好的体验至关重要。它为业务决策提供信息,并推动工程功能(如搜索,实验,付款等)中的产品开发。例如,日志事件是训练机器学习模型以进行列表搜索排名的主要来源。 日志事件近实时地摄取到数据仓库中,并作为许多 ETL 和分析作业的数据来源。事件从客户和服务商发布到 Kafka。Spark streaming 作业(建立在 Airstream 之上,Airbnb 的流处理框架)不断从 Kafka 读取并将事件写入 HBa

优秀的个人博客,低调大师

微博每日数十亿级业务下的计数器如何扩展Redis?

在Feed系统中,有简单数据类型的缓存,有集合类数据的。还有一些个性业务的缓存。比如大量的计数器场景,存在性判断场景等。微博解决存在性判断业务的缓存层叫EXISTENCE 缓存层,解决计算器场景的缓存叫COUNTER缓存。 EXISTENCE 缓存层主要用于缓存各种存在性判断的业务,诸如是否已赞(liked)、是否已阅读(readed)这类需求。 Feed系统内部有大量的计数场景,如用户维度有关注数、粉丝数、feed发表数,feed维度有转发数、评论数、赞数以及阅读数等。前面提到,按照传统Redis、Memcached计数缓存方案,单单存每日新增的十亿级的计数,就需要新占用百G级的内存,成本开销巨大。因此微博开发了计数服务组件CounterService。下面以计数场景来管中窥豹。 提出问题 对于计数业务,经典的构建模型有两种:1 db+

优秀的个人博客,低调大师

<转载>客户案例:Docker 为 ADP 提供安全性和扩展性

背景 ADP 是基于云的人力资本管理 (HCM) 解决方案的最大全球性供应商。ADP 拥有超过 63 万家客户,惠及 100 多个国家或地区的 3500 多万用户。ADP 为其客户提供的解决方案不仅包括薪资服务,还全方位涵盖了 HCM 的完整范畴,在其中每个领域都有针对 SMB、中型市场和大型企业量身定制的版本。 挑战 ADP 面临三个重大挑战。 第一个是安全性。在 ADP,安全性是重中之重,因为他们处理的是很敏感的信息。美国政府将 ADP 视作“关键基础架构”,因为它们存储着包括 5500 多万社保号码以及各种薪资处理信息在内的数据,去年通过 ADP 系统流动的资金约有 1.8 兆美元。美国的国民生产总值约有 10% 经 ADP 系统流动了四次。正在阅读这篇博文的读者请注意,你们的大部分社保号码正存储在某个 ADP 数据中心里。 第二个是

优秀的个人博客,低调大师

HPE扩展Cloudline产品线 最大容量由72TB升至640TB

ZD至顶网服务器频道 03月10日 新闻消息:9倍?是的,9倍。HPE将富士康制造的Cloudline服务器产品的存储容量增至CL5200的640TB,是CL2200的 72TB的9倍(其实准确地说是8.89倍)。 同时,HPE还更新了服务提供商用的Altoline交换机,并推出了OpenStack Swift 用的Helion私有云参考架构。 HPE全球超大规模企业副总裁兼总经理Reaz Rasul说:“服务供应商要的是操作灵活性和更快的可部署开放基础架构的数据中心整合能力,而其他客户则更看重行业标准产品的综合管理和成熟的部署能力。” 他表示,HPE提供的产品可以是标准的,也可以是开放的基础架构产品,而Cloudline是一款开放的基础架构产品。 Cloudline服务器是由富士康制造,目标客户是云计算和超大规模数据中心领域的开放计算型客户。 到目前为止,Cloudline有三款服务器:CL1100、CL2100和CL2200。前两款是1U机箱,CL2200是2U机箱。其最大磁盘容量各异,CL1100的最大容量为12TB,CL2100的最大容量为24TB,CL2200的最大容量为72TB。 新款CL5200是4U机箱,含80个8TB的3.5英寸磁盘驱动器,总容量高达640TB,容量大幅提升。 下面的表概括了这些服务器的规格,其中CL5200规格的细节还不多,HPE尚未提供其全部的规格: HPE Cloudline规格一览,CL5200规格细节不详 HPE号称CL5200是开放的、针对云优化过的存储服务器,是一个高密度、多节点存储机箱,其设计目标是为“服务提供商”提供 “一个进取型的单位GB成本更低,用于运行云存储和数据分析应用的设备”。 HPE Cloudline 1U、2U和4U服务器 据说CL5200的设计是简约式的、裸黑金式的,CL5200支持一个或两个计算节点,即单一的双插槽版本或两个双插槽产品的集合。 HPE与Scality及其RING对象存储软件有合作关系,而且Scality为CL5200提供认证支持。 有关Altoline和Helion 新的Altoline 6900交换机有四款,其中一款提供25/100GbitE端口。现有的6940 Altolines提供40GbitE端口。 新款交换机支持的网络操作系统为Openswitch Cumulus和Pica8,今年晚些时候会提供对OpenSwitch的支持。 HPE的私有云Helion现在有一个OpenStack版本,含“参考架构优化过的OpenStack Swift对象存储项目,支持超大规模、多数据中心运作”。 Helion规格里用的是9代ProLiant服务器。 据悉,Swift 版Helion OpenStack已经上架。 HPE Cloudline CL5200服务器和Altoline 6900系列交换机接受全球直接订购,服务供应商可与自己的HPE客户经理联系。一个名为“超级专用HPE数据中心客户中心”的支持服务也已经面向全球开放。 原文发布时间为:2016-03-10 本文作者:于泽 本文来自云栖社区合作伙伴至顶网,了解相关信息可以关注至顶网。

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册