edyang

我干了什么 究竟拿了时间换了什么
技术分享时间线软件开发、设备接入、视觉与运维实践

Velocity:宏、公共布局与模板缓存

多个页面复制同一段导航,改动时容易漏一处。

多个页面复制同一段导航,改动时容易漏一处。模板复用可以减少重复,也需要控制隐藏依赖。 本文使用Velocity 1.7、Java 7 与 UTF-8 模板,代码为模板片段。模板引擎负责把模型渲染成文本,不应该直接承担下单、数据库查询或权限判断。模板上下文只放页面真正需要的数据,可以减少隐式依赖。 1. 从现象推到机制 宏适合封装小段展示结构,公共布局负责页面骨架。模板缓存减少重复加载和...

Velocity:输出编码要按 HTML 上下文处理

用户输入经过模板渲染后仍可能成为浏览器脚本。

用户输入经过模板渲染后仍可能成为浏览器脚本。模板替换变量不等于自动完成安全输出。 本文使用Velocity 1.7、Java 7 与 UTF-8 模板,代码为模板片段。模板引擎负责把模型渲染成文本,不应该直接承担下单、数据库查询或权限判断。模板上下文只放页面真正需要的数据,可以减少隐式依赖。 1. 从现象推到机制 HTML 文本、属性、URL 和脚本字符串需要不同编码规则。简单替换尖括...

Velocity:页面模型与空值约定

模板输出了变量名或空白,可能是模型缺字段,也可能是模板把空值与有效值混在一起。

模板输出了变量名或空白,可能是模型缺字段,也可能是模板把空值与有效值混在一起。 本文使用Velocity 1.7、Java 7 与 UTF-8 模板,代码为模板片段。模板引擎负责把模型渲染成文本,不应该直接承担下单、数据库查询或权限判断。模板上下文只放页面真正需要的数据,可以减少隐式依赖。 1. 从现象推到机制 模板引用的属性来自上下文对象及其访问方法。静默引用可以减少未解析文本,却也...

Hibernate:分页查询与 N+1 不能只改 fetch

第一页只有十张订单,SQL 却执行很多次;直接把明细一起抓取,又可能破坏分页结果。

第一页只有十张订单,SQL 却执行很多次;直接把明细一起抓取,又可能破坏分页结果。 本文使用Hibernate ORM 4.3、JDK 7 与独立关系数据库,代码为映射或调用片段。ORM(对象关系映射)连接对象生命周期与数据库行,但不会取消事务、索引和并发约束。观察对象属性的同时,也需要查看真正发出的 SQL 与提交边界。 1. 从现象推到机制 逐条访问关联会触发额外查询,形成 N+1...

Hibernate:版本字段怎样避免覆盖别人的修改

两个人先后打开同一订单,各自保存,后保存者可能把前一个人的修改覆盖掉。

两个人先后打开同一订单,各自保存,后保存者可能把前一个人的修改覆盖掉。版本字段用于发现这种竞争。 本文使用Hibernate ORM 4.3、JDK 7 与独立关系数据库,代码为映射或调用片段。ORM(对象关系映射)连接对象生命周期与数据库行,但不会取消事务、索引和并发约束。观察对象属性的同时,也需要查看真正发出的 SQL 与提交边界。 1. 从现象推到机制 乐观锁把读取时版本带到更新...

Hibernate:flush 与 commit 为什么不是同一个动作

SQL 日志已经出现 UPDATE,另一个连接却还看不到变化,这是事务可见性而非日志矛盾。

SQL 日志已经出现 UPDATE,另一个连接却还看不到变化,这是事务可见性而非日志矛盾。 本文使用Hibernate ORM 4.3、JDK 7 与独立关系数据库,代码为映射或调用片段。ORM(对象关系映射)连接对象生命周期与数据库行,但不会取消事务、索引和并发约束。观察对象属性的同时,也需要查看真正发出的 SQL 与提交边界。 1. 从现象推到机制 flush 将持久化上下文的变更...

Hibernate:一对多映射中谁维护外键

集合里加入了明细,数据库外键却没有按预期变化,需要检查关联维护方而不是只看对象结构。

集合里加入了明细,数据库外键却没有按预期变化,需要检查关联维护方而不是只看对象结构。 本文使用Hibernate ORM 4.3、JDK 7 与独立关系数据库,代码为映射或调用片段。ORM(对象关系映射)连接对象生命周期与数据库行,但不会取消事务、索引和并发约束。观察对象属性的同时,也需要查看真正发出的 SQL 与提交边界。 1. 从现象推到机制 双向关联有两边的对象引用,但数据库外键...

Hibernate:懒加载异常为什么发生在页面渲染时

服务层已经查到订单,模板访问明细时却抛错,往往因为懒加载发生在会话关闭之后。

服务层已经查到订单,模板访问明细时却抛错,往往因为懒加载发生在会话关闭之后。 本文使用Hibernate ORM 4.3、JDK 7 与独立关系数据库,代码为映射或调用片段。ORM(对象关系映射)连接对象生命周期与数据库行,但不会取消事务、索引和并发约束。观察对象属性的同时,也需要查看真正发出的 SQL 与提交边界。 1. 从现象推到机制 懒加载代理推迟关联读取,访问未初始化属性时需要...

Hibernate:瞬时、持久与游离对象的区别

对象里有一个数据库编号,不代表它当前正在被会话管理。

对象里有一个数据库编号,不代表它当前正在被会话管理。实体状态决定了修改如何进入数据库。 本文使用Hibernate ORM 4.3、JDK 7 与独立关系数据库,代码为映射或调用片段。ORM(对象关系映射)连接对象生命周期与数据库行,但不会取消事务、索引和并发约束。观察对象属性的同时,也需要查看真正发出的 SQL 与提交边界。 1. 从现象推到机制 新建对象尚未与持久化上下文关联,持久...

Spring MVC:文件上传先划清存储和访问边界

上传成功不只是收到一个文件。

上传成功不只是收到一个文件。还要决定文件放在哪里、谁能访问,以及错误中断后留下什么。 本文使用JDK 7、Spring Framework 3.2.6 与 Servlet 容器,代码为结构片段。把请求入口、业务服务和数据访问拆开,是为了明确依赖与事务归属。容器能够装配对象,但应用仍须负责业务规则、异常含义和外部资源生命周期。 1. 从现象推到机制 浏览器提供的文件名和类型不能直接信任。...