Velocity是一个基于java的模板引擎(template engine)。它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象。

当Velocity应用于web开发时,界面设计人员可以和java程序开发人员同步开发一个遵循MVC架构的web站点,也就是说,页面设计人员可以只 关注页面的显示效果,而由java程序开发人员关注业务逻辑编码。Velocity将java代码从web页面中分离出来,这样为web站点的长期维护提 供了便利,同时也为我们在JSP和PHP之外又提供了一种可选的方案。

在我们使用velocity的过程中,使用方式有二种

闭包是指有权访问另一个函数作用域中的变量的函数。创建闭包的创建方式,就是在一个函数的内部创建另外一个函数。


createComparisonFunction (propertyName){  
    return function (object1,object2) {  
        var value1 = object1[propertyName];//*  
        var value2 = object1[propertyName];//*  
        if (value1 < value2) {
                return -1;
 

许多OO语言都支持二种继承方式:

  • 接口继承和实现继承。
  • 接口继承只继承方法签名,而实现继承则继承实际的方法。

由于JavaScript函数没有签名,在ECMAScript中无法实现接口继承,ECMAScript只支持实现继承,JavaScript中的继承主要是依靠原型链来实现的。

1:原型链

思想:利用原型让一个类型继承另一个引用类型的属性和方法。每个构造函数都有一个原

ThreadLocal本身并没有承担存储每个线程中的数据的职责,它是通过操作每个线程内部的一个“副本”-ThreadLocalMap来实现线程之间的隔离,从而保证了线程安全。

首先我们查看一下Thread类的源码:

/* ThreadLocal values pertaining to this thread. This map is maintained by the ThreadLocal class. */  
ThreadLocal.ThreadLocalMap threadLocals = null;

Thread类中有一个ThreadLocalMap类

缓存是一个常谈常新的话题,作为一名服务端的技术,如果你入行一年都还没用过memcached类产品,那只能说你的公司实在太小了,或者你干的活实在太边缘了。

说起缓存,可能大家最直接想到的就是:“在数据库前面挡一层”。这是缓存最原始的意义,同时也引申出了缓存最普遍的用法。

原始模式

代码示例1(原始模式):

//从缓存中获取数据[
工厂模式

使用简单的函数创建对象,为对象添加属性和方法,然后返回对象。 这个模式后来被构造函数模式所取代。 缺点: 虽然解决了创建多个相似对象的问题,但没有解决对象识别的问题,还是就是方法不是每个对象共享的。

function createPerson (name,age,job) {  
    var o = new Object ();

最近公司的一个已经完成的项目需要加入用户操作日志的功能,自然而来的想到了使用spring中的aop的方法解决,主要的代码实现如下:

Logger注解:

package com.logger.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 用户操作日志标识注解
 * @auth

在本系列的上一篇文章中,我们讲到了使用动态代理的方式完成事务处理,这种方式将service层的所有public方法都加入到事务中,这显然不是我们需要的,需要代理的只是那些需要操作数据库的方法。在本篇中,我们将讲到如何使用Java注解(Annotation)来标记需要事务处理的方法。

首先定义Transactional注解:

package davenkin.step6_annotation;  
import java.lang.annotation.ElementType;  
import java.lang.annotation.Retention;  
import java.lang.a

在本系列的上一篇文章中,我们讲到了使用Template模式进行事务管理,这固然是一种很好的方法,但是不那么完美的地方在于我们依然需要在service层中编写和事务处理相关的代码

即我们需要在service层中声明一个TransactionTemplate。在本篇文章中,我们将使用Java提供的动态代理(Dynamic Proxy)功能来完成事务处理,你将看到无论是在service层还是DAO层都不会有事务处理代码,即他们根本就意识不到事务处理的存在。使用动态代理完成事务处理也是AOP的一种典型应用。

Java动态代理的基本原理为:被代理对象需要实现某个接口(这是前提),代理对象会拦截对被代理对象的方法调用,在其中可以全然抛弃被代理对象的方法实现而完成另外

在本系列的上一篇文章中,我们讲到了使用TransactionManger和ConnectionHolder完成线程安全的事务管理,在本篇中,我们将在此基础上引入Template模式进行事务管理。

Template模式大家应该都很熟悉,比如Spring就提供了许多Template,像JdbcTemplate和JmsTemplate等。Template模式的基本思想是:在超类里将完成核心功能的方法声明为抽象方法,留给子类去实现,而在超类中完成一些通用操作,比如JMS的Session的建立和数据库事务的准备工作等。

在本篇文章中,我们使用一个Template类来帮助管理事务,定义TransactionTemplate类如下: