
AJAXJS Framework
文章平均质量分 85
sp42a
What the web can be
展开
-
简明 JDBC 数据访问操作库:JdbcHelper(一)
综观后台开发,大多数的开发工作就是数据库的开发。怎么跟数据库打好交道与我们的开发体验息息相关。业界典型的讨论“对象关系阻抗不匹配”正是问题的症结所在:既然都是两种不同的“编程世界观”——一个数据库、一个编程语言,各自有各自的方法论、甚至思维都不太一样,怎么可以做到“和衷共济”呢?所以问题的关键就是如何解决这个“阻抗不匹配”难题,数据库模型和编程语言模型之间的差异所导致的“难题”。原创 2023-05-01 09:58:07 · 874 阅读 · 0 评论 -
通用 DAO 接口设计
数据访问对象 DAO(Data Access Object)本质是个名词,但我们更多语境中不是作名词用,需要的是一套通用的接口去使用,至于返回的对象是什么,可以是 Java Bean 或者 Map 键对值。假设我们背后有一套数据访问机制,是 MyBatis、原生 JDBC 无所谓,只要能提供数据就可以了,那么目前需要设计一套标准的 DAO 接口,会是这样的。我们的目的是尽量可能简单衔接底层的据访问机制,提供常见的 `findById`、`findList`、`create`、`update` 等的操原创 2022-04-04 10:58:07 · 3967 阅读 · 0 评论 -
实战微信支付 APIv3 接口(小程序的)
官方 SDK 不错,只是依赖 Apache-httpclient,可是我连 Apache-httpclient 都不想用啊,于是就自行接入。其实官方文档也很详尽,只是有点乱(否则就没有我写本文的需要啦)。官方文档如是说。原创 2022-03-31 11:50:47 · 9960 阅读 · 0 评论 -
AJ 组件库之通用数据字典 DataDict
数据字典(Data Dictionary)是一种用户可以访问的记录数据库和应用程序元数据的目录。数据字典在系统也是必备的组件,对此我们想想要怎么做原创 2022-03-28 18:56:33 · 2674 阅读 · 0 评论 -
利用免费的必应 Bing 自定义搜索打造站内全文搜索
百度的站内搜索不做了,唉,果然免费的不永久。我们看看 Bing 的,每个月有 1000 次免费的调用 bing search api 的次数。不同客户可以多申请几个就行了。原创 2022-03-25 19:22:10 · 15190 阅读 · 1 评论 -
微博、QQ、微信第三方登录 Java 实现实录
第三方账号登录流程"首先, 每个第三方账号(QQ/微博/微信等)都有产生一个唯一性的 openID, 首次登录是这个 openID, 第二次登录也是这个 openID,每次登录都是这个不会变的原创 2020-05-31 11:32:28 · 2038 阅读 · 0 评论 -
AJAXJS MVC 使用教程(下)
控制器处理完业务后会返回结果数据给前端:要么在前后端分离的情况下直接返回JSON数据,无须经过视图层;要么返回HTML则要在View层进行转化。传统Servlet做法是对request进行`setAttribute()/getAttribute()`的操作,它实质是一个`Map<String, Object>`的读写。MVC新框架下独立出来这个中介媒介map为`ModelAndView`对象,用于存储页面所要显示的数据,穿梭于控制器与视图层之间。在控制器方法中加入ModelAndView参数即可,它本身就是原创 2021-07-17 20:22:15 · 220 阅读 · 2 评论 -
AJAXJS MVC 使用教程(中)
HTTP是文本协议,传递到服务端的请求参数最初之类型皆是字符串。Java中通过request的`getParameter()`方法返回字符串类型的请求参数,可那实在太简陋了,故任何一款MVC框架都力求提供强大的参数绑定功能,将网页参数自动转化为Java可直接读取的对象而不再是普通的字符串。应该采取什么策略来转换Java里面可读的类型呢?首先可明确一点,请求参数出现的地方将变成控制器的方法的输入参数,即每个Java参数映射着HTTP请求参数;然后控制器方法执行后返回的结果就是响应客户端的结果。原创 2021-07-17 20:16:30 · 246 阅读 · 2 评论 -
AJAXJS MVC 使用教程(上)
我们利用MVC来建立一个`Hello World!`的Web应用程序。首先在项目`pom.xml`添加ajaxjs-web的JAR包依赖。原创 2021-07-17 18:46:51 · 280 阅读 · 2 评论 -
学写一个 Java Web MVC 框架(五)
对控制器的方法进行分析,看需要哪些参数,将得到的参数签名和请求过来的参数相匹配,再传入到控制器方法中去执行,这就是`RequestParam`类的任务(取得控制器方法执行时候所需要的参数)。如下例子所示,我们看看典型的一个控制器方法,可能出现的参数类型。原创 2021-07-17 18:26:21 · 144 阅读 · 5 评论 -
学写一个 Java Web MVC 框架(四)
当客户端发送一个请求,被自定义的过滤器MvcDispatcher拦截,解析请求地址和参数对象跳转到一个控制器的方法中,然后执行进行逻辑处理后返回响应内容给MvcDispatcher输出,这样MVC逻辑就走完了。原创 2021-07-17 18:22:00 · 233 阅读 · 3 评论 -
学写一个 Java Web MVC 框架(三)
之所以要解析控制器,是因为Controller类定义了各种URL映射的规则。在初始化阶段我们要获取这套规则具体如何,以便每次请求访问过来的时候可以执行具体的控制器方法。从某个角度讲这些控制器类相当于一个个配置文件,配置规则利用Java注解来参与完成。很多场合下注解发挥了配置的作用。原创 2021-07-17 18:14:36 · 200 阅读 · 3 评论 -
学写一个 Java Web MVC 框架(二)
在进入实质工作之前,首先要获取配置内容。Servlet过滤器标准方法`init(FilterConfig fConfig)`在Tomcat启动的时候执行,且在生命周期中只执行一次,如下代码所示是MvcDispatcher的`init()`。其中参数`FilterConfig`是读取`web.xml`中的配置信息对象。原创 2021-07-17 18:02:49 · 205 阅读 · 3 评论 -
学写一个 Java Web MVC 框架(一)
当前我们介绍的是一个简单的MVC,用8个类即实现完整Spring MVC核心功能,外加其他实用的小功能。它是怎么实现的呢?让我们来一探究竟!原创 2021-07-17 17:55:53 · 300 阅读 · 1 评论 -
关于工具包(Utils)的重新思考
工具包/助手包(英文多见于 Utils、Helpers、Tools)是框架的基础构成部分。随着时间的推移,我们的软件代码写得越来越多,API 中两次或两次以上使用到代码,可视为通用的逻辑,可考虑将其抽出来,封装形成公共调用的方法。至于出现多少次才能归纳到工具库,开发者必须有一个清醒的认识:如果出现少但也重构到公共库 API,那么这些所谓重用的 API 会显得非常琐碎,举一个反模式的例子:但凡是出现两次都算,那么是不是都要抽取到工具包里面呢?可以预见,这种“包罗万有”导致不但维护费力且调用者也觉得烦琐,少封装原创 2021-06-13 23:32:51 · 1801 阅读 · 0 评论 -
AJAXJS 框架用到的核心算法
做了那么多年,我通常还是被认为是一个“厉害”的前端,——那说明我一直在原地踏步,没有进步:(。难道就不能突破“全栈”的天花板吗?我想了想,其实是大家没有关注我另一面后端的缘故,后端也是干活的满满的。其实同行交流呢,都逃不过层层“鄙视链”的影响,说这个工具、那个框架,一旦不是自己的心头好,或者存在信息不对称的地方,立马否定对方。所以呢,为避免这种情况发生,谈一些有点“技术深度”而不是泛泛而谈的表面东西,就有所必要了,最好能拉高一些门槛的。比如谈“算法”就是一个比较好的例子了,难怪一般面试都会考算法题。原创 2021-04-12 11:19:08 · 406 阅读 · 2 评论 -
用 TypeScript 写一个轻量级的 UI 框架之十四:Tree 树组件(上)
我们知道 JSON 是 JavaScript 里面的一大利器,特别是构建复杂的树状结构,简单不失强大。可见对于不同类型的树,事前应该要确定清楚何种数据结构。通过 TypeScript 强大的类型系统,可以轻松地为我们去表述那些复杂的 JSON 结构。一旦确定好结构如何,剩下的解析、转换工作就简单多了。总的来说,解析树结构无非遍历工作。而遍历来说大概也不会太难,比较多使用到的是函数的递归而已。还有一点就是离不开栈(Stack)、队列(Queen)的应用。原创 2021-04-01 02:54:29 · 1388 阅读 · 0 评论 -
用 TypeScript 写一个轻量级的 UI 框架之十三:Grid 表格组件(下)
Grid 的多行数据,修改后要提交到后台。如果大批量的数据一次性提交到后台恐怕不大合理。如果只是修改过那行的数据才提交过去,是比较合理的方式。这些修改的数据,我们称为“脏数据(Dirty data)”。脏数据本质也是一个 map、一个 json。原创 2021-03-29 22:33:33 · 538 阅读 · 0 评论 -
用 TypeScript 写一个轻量级的 UI 框架之十二:Grid 表格组件(上)
Grid 其实就是表格 Table,不过窃以为英文中 Grid 比 table 来得高大上。最开始认识 Grid 控件是 ExtJS UI 库,它有很成熟的设计模型支持着,缺点就是性能不太好,使用比较繁琐。如今笔者也想学着来设计一个 Grid,发现也没想象中的困难,主要还是发挥来自 Vue.js 的威力。原创 2021-03-24 16:53:32 · 1031 阅读 · 0 评论 -
用 TypeScript 写一个轻量级的 UI 框架之十一:列表组件综述
大量结构化数据的一种主要输出形式就是列表,——本文就打算介绍列表组件的设计与使用。原创 2021-03-23 15:46:12 · 600 阅读 · 0 评论 -
如何打造一个文件上传组件
文件上传(File Upload)在 Web 项目中广泛应用,都少不了这样一个的组件。有见及此 Servlet 3.0 将文件上传纳入 JSR 标准,通过几个注解便能配置好上传的功能,无须依赖其他组件。不过本着专研学习之目的,还是自制一款简单的文件上传组件。原创 2019-01-29 18:06:51 · 795 阅读 · 0 评论 -
JDK JavaScript 引擎的使用
本来,JavaScript 顾名思义就是 Java 之脚本,大抵就是精简化后的 Java,但从语言特性来说,却是“雷锋与雷峰塔”之间没有半毛钱的关系。不管如何 JavaScript 关系密切,从 JDK6 开始它们就绑定在一起,并制定了 JSR-223 规范,对应的包是 javax.script。早期基于整合 Mozilla Rhino,是个纯 Java 的 JavaScript 实现。Rhino 性能一般,于是 Oracle JDK 到了 v1.8 更换为自家的 Nashorn 引擎,性能不可同日而语。原创 2013-06-11 19:10:34 · 2526 阅读 · 0 评论 -
JDBC 数据库连接池的单元测试
如何模拟 JNDI 对象以便单元测试呢?首先需要加入 tomcat-juli.jar,这个包位于 `tomcat/bin` 目录下,需要手动复制到 Classpath 中;然后生成初始化上下文对象 InitialContext,下面就封装了一个方法 JdbcConnection.initIc();最后绑定实际数据源对象DataSource。原创 2013-12-10 16:49:26 · 1872 阅读 · 0 评论 -
100 行代码写一个图片验证码组件
验证码(Captcha)的作用是防止别有用心的人通过编写“自动注册机”这类手段来大量发送非法的请求。这类请求通常涉及数据库写的操作,因此要在后台设立一道防线来识别是否自然人的访问还是机器的操作。典型的一种方法就是图片验证码,如下图所示是一个加入干扰码的数字验证图片原创 2021-03-02 18:04:26 · 10262 阅读 · 21 评论 -
AJAXJS 全栈框架学习资源索引
AJAXJS 全栈框架学习资源索引原创 2021-03-02 13:48:20 · 436 阅读 · 4 评论 -
用 TypeScript 写一个轻量级的 UI 框架之十:表单控件之日历组件
开门见山,先说明一下这日历组件的核心算法不是笔者原创,而是来自于早期大神 cloudgamer 的作品,在这里向前辈致敬! 组件本身的原理不算复杂难懂,也就寥寥 140 行代码(原 JavaScript),足以展现日历渲染的原理。原创 2021-02-25 00:04:25 · 957 阅读 · 2 评论 -
用 TypeScript 写一个轻量级的 UI 框架之九:表单控件之文件上传
文件上传,无论前端还是后端,笔者都重写过好几次了,一直不太满意。这次前端的用 TypeScript 再写一次,发现旧的问题不少,——幸好在这次重构中,找到比较理想的办法来处理。原创 2021-02-24 18:37:06 · 780 阅读 · 0 评论 -
用 TypeScript 写一个轻量级的 UI 框架之八:表单控件之富文本编辑器
在很多开发者看来,富文本编辑器的编写是一件很神秘或者复杂的事情。神秘倒没有,复杂的话——也大可不必那样认为——它的基本原理并不复杂,可是说十分简单。网上有不少的教程和资源,参考一些也不错,至于源码,大多写得比较复杂,不利于说明原理。于是我想在本文中逐步演示一个“羽量级”富文本编辑器的产生,来简单勾勒其实现的过程和原理。原创 2021-02-23 14:02:12 · 1396 阅读 · 0 评论 -
用 TypeScript 写一个轻量级的 UI 框架之七:表单的处理
表单(Form)首先是一些零散的样式、布局 CSS 之类的问题,其次包含表单验证、序列化的功能,最后就是“无刷新”表单(即 AJAX 提交)。至于围绕表单的各种千变万化的控件,如日历控件、HTML 编辑器和文件上传等组件,它们篇幅较大,另文再述。原创 2021-02-15 10:59:52 · 1153 阅读 · 0 评论 -
用 TypeScript 写一个轻量级的 UI 框架之六:widget 篇
JavaScript 最初的使命是什么?就是搞“动态页面 DHTML(Dynamic HTML)”。DHTML 是个上古的词汇,widget 也不年轻了,不过还是能达意,就把它作为包名吧——意思为页面用的小控件。原创 2021-02-02 23:02:48 · 587 阅读 · 1 评论 -
用 TypeScript 写一个轻量级的 UI 框架之五:xhr 模块
关于 XHR(XMLHttpRequest),就是 AJAX程序。既然为 AJAXS程序,自然少不了 XHR 的调用。在我之前的累积基础上,升级代码到 ts。《用 XHR + curl.exe 制作 ddns 客户端札记》(https://blog.csdn.net/zhangxin09/article/details/6740558)《简易封装 XHR:支持 GET/POST/PUT/DELETE/JSONP/FormData》(https://blog.csdn.net/zhangxin09/ar原创 2021-01-18 22:16:25 · 634 阅读 · 0 评论 -
用 TypeScript 写一个轻量级的 UI 框架之四:base 模块
Base 模块是框架的底层基础库,主要三大模块 prototype.ts 原型扩展、aj.ts 基础工具函数、xhr.ts Ajax 远程请求,下面我们分别探讨。原型扩展虽然说 Vue 框架下应该远离 DOM 操作,但也不是说一丁点的也不用写,我们还是可以精简出几个较为常用的 DOM 方法,安排在对象原型(prototype)的扩展中。源码在 https://gitee.com/sp42_admin/ajaxjs/blob/master/aj-ts/src/base/prototype.ts。Css原创 2021-01-18 16:49:19 · 545 阅读 · 0 评论 -
用 TypeScript 写一个轻量级的 UI 框架之三:库描述文件与 namespace
TypeScript 倡导我们使用类型,顾名思义“类型的(Type)”、“脚本(Script)”。一般而言脚本语言追求轻便快捷,多数是无类型或弱类型的。然而在 ts 中要贯彻类型的思想,不仅是语言本身的一个飞跃,也是我们开发者自身要适应和理解必由之路。ts 在添加新特性的同时,仍向下兼容旧有的方式。最简单地说,你可以把旧的 js 代码一行不改,复制到 ts 文件中进行编译,编译器不会因为其中的错误中止编译(会提示或者警告,可忽略的)。并不是说我们忽略那些编译警告,不做 js 代码的升级,而是那样子允许了我们原创 2021-01-18 13:17:16 · 616 阅读 · 0 评论 -
用 TypeScript 写一个轻量级的 UI 框架之二:项目结构、构建
模块管理一个框架或者库,自然有些纲领性的内容先要谈谈,这里就展开为大家介绍。用不用包管理?答案是否定的。对此,我们沿用老一套的做法,浏览器直接 <script src="xxx.js"> 引入 *.js 文件。但不代表不使用模块化管理,一个 ts 文件就是一个类,一个小模块,一个文件夹就是一个大模块。对于页面引用,你要确保所依赖的模块有哪些,然后通过 <script src="xxx.js"> 引入。这听上去很落后,也很原始,也可能会吓跑初来乍到想了解的朋友,但请君少安毋躁,且原创 2021-01-15 21:40:01 · 812 阅读 · 2 评论 -
用 TypeScript 写一个轻量级的 UI 框架之一、开篇
导言最近感觉单纯 JavaScript 越来越不能胜任稍大型一点的项目,原因在于 JS 缺乏强类型支持,等于在代码层面少了一个辅助提示的功能,不能说明那个变量或者对象具体是什么,当然你可以通过为其添加注释或者,起一个更好的变量名,来给予代码维护者更多的信息。但是,这不是严格的约束,对于工程性而言简直不能称得上是有效的模式。于是很自然地我们青睐于类似 Java 那般类型安全语言实现强类型要求,不仅获得编码阶段的类型检查,而且在编译的时候能够减少错误,更有价值的在处于维护阶段的代码,强类型会使得代码更健壮和可原创 2021-01-11 10:54:53 · 1593 阅读 · 2 评论 -
简单实现 Bean 字段校验
关于 Bean 字段校验,我之前曾用 Apache BVal 探讨过,现在连这货都不想用,少一个依赖是一个。自己做,若完全按照 JSR 303 规范来实现会非常麻烦,没有那个必要。于是取舍一下,还是沿用 JSR 303 的注解作为约束条件,参考这位仁兄的基于反射的做法,自己实现一套 Bean 校验。原理总的来说是,反射+自定义函数接口(Java 8)+Map 关联注解与验证实现,比较简单,顶多 100 行代码搞定,都是本着咱够用就行的要求,其他的不想 BB 那么多,要是真有问题,到时再说。首先写个单测,原创 2020-08-01 00:02:13 · 906 阅读 · 0 评论 -
AJAXJS MVC 使用教程之五:过滤器
过滤器的主要目的是拦截每次请求之前和之后的一些操作。有别于 Servlet 标准过滤器,这是 MVC 框架中重写的过滤器。为简化概念,框架中不单独另设 AOP 机制,但可把过滤器当作 AOP 的代替品。其发挥如下作用:初始化数据库连接、日志记录、权限校验等等。如下例子中注解 @MvcFilter 引入了数据库连接过滤器 DataBaseFilter,通过过滤器before()方法在list()执行之前调用了数据库连接的逻辑。除此之外,@Authority也是过滤器注解,引入 PrivilegeFilter原创 2020-07-30 17:33:04 · 401 阅读 · 0 评论 -
部署时决定-插件机制
什么是插件如果我们的项目依赖了一个接口,但是我们在开发时,真的没办法确定,部署的时候,到底采用哪个实现。比如 Nutz 的 Log。 它在运行时,会判读当前运行环境 log4j 是否可用(有 log4j 的org.apache.log4j.Logger类), 如果没有,那么它就把日志信息输出到控制台上。它的实现,就是依靠的方式。但是,同复杂强大的 OSGI 插件体系不同,这里的插件只是强调,在部署时决定采用什么实现。在运行时,它是没 办法更改的。因此 Nutz 虽然在编译时依赖了 Log4j,但是在运行时转载 2020-06-29 12:47:17 · 380 阅读 · 0 评论 -
简单封装 HTTP 请求
简单封装 Java 类库里面的 HttpURLConnection 来完成日常的 HTTP 请求,如 GET、HEAD、POST 等的请求。原创 2016-07-06 10:30:14 · 6676 阅读 · 0 评论 -
实施 ORM 的两项要旨:泛型和反射
鄙人认为,实施 ORM 的两项要旨乃泛型和反射。开始的时候 DAO 并没有实现 ORM,下面就看看怎么为 DAO 层添砖加瓦。原创 2015-09-04 15:05:22 · 10730 阅读 · 0 评论