12 张鑫

广州活映信息技术有限公司 - CTO/CIO/技术总监

我要认证

热爱 Web 开发

等级
TA的排名 685

简单实现 Bean 字段校验

关于 Bean 字段校验,我之前曾用 Apache BVal 探讨过,现在连这货都不想用,少一个依赖是一个。自己做,若完全按照 JSR 303 规范来实现会非常麻烦,没有那个必要。于是取舍一下,还是沿用 JSR 303 的注解作为约束条件,参考这位仁兄的基于反射的做法,自己实现一套 Bean 校验。原理总的来说是,反射+自定义函数接口(Java 8)+Map 关联注解与验证实现,比较简单,顶多 100 行代码搞定,都是本着咱够用就行的要求,其他的不想 BB 那么多,要是真有问题,到时再说。首先写个单测,

2020-08-01 00:02:13

AJAXJS MVC 使用教程之五:过滤器

过滤器的主要目的是拦截每次请求之前和之后的一些操作。有别于 Servlet 标准过滤器,这是 MVC 框架中重写的过滤器。为简化概念,框架中不单独另设 AOP 机制,但可把过滤器当作 AOP 的代替品。其发挥如下作用:初始化数据库连接、日志记录、权限校验等等。如下例子中注解 @MvcFilter 引入了数据库连接过滤器 DataBaseFilter,通过过滤器before()方法在list()执行之前调用了数据库连接的逻辑。除此之外,@Authority也是过滤器注解,引入 PrivilegeFilter

2020-07-30 17:33:04

AJAXJS MVC 使用教程之四:模板和返回响应数据

控制器处理完业务后会返回结果数据给前端:要么在前后端分离的情况下直接返回 JSON 数据,无须经过视图层;要么返回 HTML 则要在 View 层进行转化。输出 HTMLAJAXJS Web 提供中介媒介 ModelAndView 对象,用于存储页面所要显示的数据。在控制器方法中加入 ModelAndView 参数即可,它本身就是 HashMap 的子类。以下例子是输出不同类似的数据到页面中。package com.demo.mvc;import java.util.ArrayList;im

2020-07-30 17:30:49

AJAXJS MVC 使用教程之三:处理请求参数

请求参数出现的地方将变成控制器的方法的输入参数,即每个 Java 参数映射着 HTTP 请求参数;然后控制器方法执行后返回的结果就是响应客户端的结果。原生请求响应对象原生对象指的是 HttpServletRequest、HttpServletResponse 这类由 Servlet 提供的接口。只要方法定义了这些接口的参数,即可送入,不管参数名具体如何。请看下面的例子。@GETpublic String get(HttpServletRequest request, HttpServletRespo

2020-07-30 17:28:59

AJAXJS MVC 使用教程之二:定义路由路径

写一个控制器很简单,但有下面注意的事项需要遵守的。每个控制器类必须要实现IController接口,才能表明为控制器组件,否则不被视为控制器。至少要一个@Path路径的注解定义在类声明上。控制器的类名推荐以Controller结尾,比如ApplicationController, HelloController等。控制器必须在配置site_config.json指定的System.scanPackage包名之中,也就是上述定义搜索的包名,否则不能登记该控制器。可以多个URL绑定对应一个控制器类

2020-07-28 10:48:50

AJAXJS MVC 使用教程之一:创建第一个 Hello World! 路由控制器

我们利用MVC来建立一个Hello World!的Web应用程序1。首先在项目pom.xml添加ajaxjs-web的JAR包依赖。<dependency> <groupId>com.ajaxjs</groupId> <artifactId>ajaxjs-web</artifactId> <version>1.2.0</version></dependency>把多个路由封装起来的

2020-07-27 23:57:57

OO之美:好代码和坏代码

本节将介绍以下内容:编码的规范面向对象指导引言好的代码,是练出来的。坏的代码,是惯出来的。那么,代码是写给计算机的吗?不是,代码其实是写给人的。Martin Fowler说:任何一个傻瓜都可以写出计算机可以理解的代码。唯有写出人类容易理解的代码,才是优秀程序员。那么,本文要探讨的其实是写出给人看的好代码,不涉及具体的代码技巧,只关注泛化的代码实践,通过一系列条款来过滤应该关注的好代码和坏代码。好代码、坏代码命名很重要,让代码告诉你它自己命名到底有多重要呢?重要到这几乎是很多软件项目成

2020-07-27 19:53:00

OO之美:面向对象和基于对象

本节将介绍以下内容:基于对象的澄清面向对象的差别引言这是一个常常被问起的话题,对于面向对象(Object-Oriented)我们可能有清晰的概念,对于基于对象(Object-Based)我们可能有模糊的认知,而对于二者一词之差的细节,又有多少概念值得深究呢?关于面向对象的论述,本书第1章“OO的智慧”已经有相对全面的介绍,对于继承、封装和多态这些基本要素,已经有了较为深入浅出的了解,基于如此背景,就先从关注基于对象开始。基于对象所谓基于对象,就是一种对数据类型的抽象,封装一个结构包含了数据

2020-07-27 19:43:51

OO之美:依赖的哲学

依赖的哲学本节将介绍以下内容:关于依赖和耦合面向抽象编程依赖倒置原则控制反转依赖注入工厂模式Unity框架应用引言“不要调用我们,我们会调用你”是对DIP最形象的诠释。作为5大设计原则之一的DIP原则,有了2.4节“依赖倒置原则”由概念而实例的单纯讨论,还不能全面阐释清楚:什么是依赖倒置?为什么依赖倒置?如何依赖倒置?这几个关键的问题,不单纯地通过DIP而DIP,而是从依赖这个最原始的概念讲起,来了解在面向对象软件设计体系中,关于“关系的处理”,也就是“依赖的哲学”。对,

2020-07-27 19:19:02

OO 之美:设计的分寸

本节将介绍以下内容:设计的由来浅谈重构设计的分寸引言有了前面两章“OO 大智慧”和“OO 大原则”的铺垫,相信读者已经有了对面向对象的基本认知。而本章将继续深入关于面向对象和设计问题的讨论,挑起设计与架构的话题。在高级语言横行的今天,对于静态语言的设计都源于面向对象思想,重构与设计都基于这些简单的标准。然而,对于设计,还有很多看似“惯常”的法则与经验广泛存在于软件系统中,例如除了经典的 23 种设计模式,还有很多模式之外的模式,按照粒度的大小、系统的特点、规模的大小,而形成的架构规则。对

2020-07-27 18:06:40

解耦设计手法小结

设计是一个平衡的产物,需要在各个约束条件下(组织目标,业务目标,开发流程,技术能力,学习及维护成本等)不断地进行演进。 我们虽然不提倡做大而全的设计,但会坚持进行基础性设计,以保证我们的设计一直在正确的方向上演进。设计演进的过程既可以是自上而下的,也可以是自下而上的。基本设计原则业界普遍被接受的设计原则不再赘述。这里特别针对基于开源项目的软件,其总体主旋律将是:跟随,扩展,贡献,其中跟随将是一个基本能力,反观深度定制的方式会遭遇越来越多的尴尬。落实在设计上,其最核心的设计原则:隔离自有业务。相较于模块

2020-07-27 15:13:22

JDBC和数据库事务详解

现在还在写 JDBC 事务的文章,我觉得我一定是相当的 Out 了,现在主流的 java 应用,框架都是分布式的,各种分布式的事务,或者容器事务才是需要学习的重点,在这里谈 JDBC 确实有点不合时宜,但任何的 java 开发人员,如果不能够深入的理解数据库的事务,那在做数据处理的方面就一定是有所欠缺的,另外确实很少有文章能够谈到 JDBC 和数据库事务的精髓,希望这里能够让你深度的了解到什么是 JDBC 的事务以及它和数据库的关系。事务事务应该说是数据库最核心的能力之一,对于任何和数据打交道的开发人员

2020-07-27 12:15:12

支付系统经验谈

支付系统各接口总结接口:同步调用, 重试调用(框架自动重试),自己定时任务自动重试、主动查询、主动查询后自动重试,异步回调,对账,网关层处理对后续逻辑。定时关闭正常支付:正常获取支付签名.重试调用(框架自动重试): 支付宝普通支付不交互,支付宝app支付交互可重试,微信支付交互,可重试,返回新的可用的预支付id.定时任务自动重试,无.主动查询:回调延迟, 需要客户端协作,把支付成功的回调通知回来.定时任务主动查询这些.主动查询后重试,无必要.异步回调. 只有成功回

2020-07-27 11:52:45

自然而然的设计

设计,似乎有点高深莫测! 一堆的模式、模型,让人无所适从。学了记不住,记住又用不上。我觉得设计应当是自然而然的事,从实际问题出发找出实际的解决方案就可以了。其实难点在于能不能看到问题。回想起 12 年前的 2000 年,当时刚进入一家 ERP 公司,被安排为一家灯饰公司"客制"(所谓客制就是定制的意思!)人事系统。当时系统总被客户抱怨薪资结算太慢,四千人的工资要跑一晚上。下班时开始结算,第二天看结果。刚上系统,难免出现数据遗漏,那又要重算一遍。好在那个时代对软件有些迷信,这边说没办法,系统架构所致,客户也

2020-07-27 11:31:34

用 Java 8 lambda 优化 JDBC

首先创建一个函数接口 ResultSetProcessor :@FunctionalInterfacepublic interface ResultSetProcessor { public void process(ResultSet resultSet, long currentRow) throws SQLException;}下面做个简单查询案例,使用这个接口遍历public static void select(Connection connection, String sql

2020-07-27 10:33:48

权限设计算法基础

权限管理在一个系统中是不可或缺的,总的来说还是一个数学的问题。最笨的方法之前这个系统的权限管理是通过配置文件来处理的,大概流程是这样的,把用户分成多个用户组,然后每个用户组对应着多个用户的 id,每次访问页面的时候,都会读取这个配置文件的信息,判断登录用户的 id 属于哪个用户组,然后在页面判断这个用户组是否有访问这个链接的权限。配置文件的格式是这样的:{"adm" : [1,2,34], "dev" : [5,6,1]}这样会带来什么问题呢?有以下几个:权限管理混乱,一个用户 id 可能会在多个权

2020-07-23 10:25:41

聊聊数据库表结构设计心得

本文讨论是一般表的设计,有一定的普遍性和通用性,当然对于特殊性的考量则不在本文讨论之列。自增 idJava 层的 CRUD 都是围绕自增 id 的,以这个 id 为依据的,所以自增 id 不可或缺,每张表都应该有。当然其他类型的 id,如 uuid、雪花 id 都可以并存。还有分页、表与表的关联都离不开这个自增 id。createDate & updateDate有了这两个字段,你可以追溯到数据的时间点,创建和修改的时间点,以方便查找问题。MySQL 下类型为 datetime,在 Ser

2020-07-22 12:09:03

六行代码写个 Tab 控件

其实之前的方法都不是太聪明(例如我写过的《Vue Tab 组件再探究》),个人认为这种方法,区区六行代码,搞定!changeTab = function(e) { var old = aj('.show'); old.classList.remove('show'); old.classList.add('hide'); var el = aj('.config-tab-' + e.selectedIndex); el.classList.remove('hide'); el.classL

2020-07-18 22:33:25

Java Web 实现 HTTP Basic 认证

Basic 认证是一种较为简单的 HTTP 认证方式,客户端通过明文(Base64 编码格式)传输用户名和密码到服务端进行认证,通常需要配合 HTTPS 来保证信息传输的安全。界面如下。下面基于 Servlet 标准 Filter 实现一个 HTTP Basic 登录机制,可以用作测试时的临时发布用。部分函数利用了 AJAXJS 库。package com.ajaxjs.web;import java.io.IOException;import javax.servlet.Filter;im

2020-07-03 16:44:55

部署时决定-插件机制

什么是插件如果我们的项目依赖了一个接口,但是我们在开发时,真的没办法确定,部署的时候,到底采用哪个实现。比如 Nutz 的 Log。 它在运行时,会判读当前运行环境 log4j 是否可用(有 log4j 的org.apache.log4j.Logger类), 如果没有,那么它就把日志信息输出到控制台上。它的实现,就是依靠的方式。但是,同复杂强大的 OSGI 插件体系不同,这里的插件只是强调,在部署时决定采用什么实现。在运行时,它是没 办法更改的。因此 Nutz 虽然在编译时依赖了 Log4j,但是在运行时

2020-06-29 12:47:17

查看更多

CSDN身份
  • 博客专家
勋章 我的勋章
  • 领英
    领英
    绑定领英第三方账户获取
  • GitHub
    GitHub
    绑定GitHub第三方账户获取
  • 图书勋章
    图书勋章
    CSDN技术图书作者专属勋章
  • 签到新秀
    签到新秀
    累计签到获取,不积跬步,无以至千里,继续坚持!
  • 技术圈认证(专家版)
    技术圈认证(专家版)
    博客专家完成年度认证,即可获得
  • 专栏达人
    专栏达人
    授予成功创建个人博客专栏的用户。专栏中添加五篇以上博文即可点亮!撰写博客专栏浓缩技术精华,专栏达人就是你!
  • 持之以恒
    持之以恒
    授予每个自然月内发布4篇或4篇以上原创或翻译IT博文的用户。不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
  • 勤写标兵Lv2
    勤写标兵Lv2
    授予每个自然周发布4篇到6篇原创IT博文的用户。本勋章将于次周周三上午根据用户上周的博文发布情况由系统自动颁发。