`
successfulroof
  • 浏览: 72962 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Velocity 分析

阅读更多

 

 

       Velocity是什么?这里就不做分析了!重点写一写velocity的工作机制,如果文章中哪里有问题还请各位指出,以防误人子弟

其实简单的说,velocity分两大块:

一、资源加载

         使用velocity,我们可以通过一次编写模板而达到多次复用的效果,运用起来也十分的方便,相应速度也比较理想,因为velocity本身也提供模板的缓存功能,对比每次读取文件来说也是要快很多!而且模板缓存原理也是根据文件的修改时间来判断的,如果缓存lastModified < modifiedTime缓存失效,重新加载文件载入缓存!

        1.资源加载器初始化

//主要工作类:VelocityEngine
获取模板方法:
/**
*@param templateName 模板名称
*@param encoding 加载文件编码,默认:ISO-8859-1
**/
velocityEngine.getTemplate(templateName,encoding);

        主要加载VM文件类:ResourceManagerImpl ,manager初始化方法分析

    

 public synchronized void initialize(final RuntimeServices rsvc)
        throws Exception
    {
        if (isInit) //是否初始化,防止重入
        {
            log.debug("Re-initialization of ResourceLoader attempted and ignored.");
            return;
        }
	//资源加载器
        ResourceLoader resourceLoader = null;
       
        // runtimeService 主要用来存储加载文件的一些参数的KEY。如:加载路    径
        this.rsvc = rsvc;
        log = rsvc.getLog();

        log.trace("Default ResourceManager initializing. (" + this.getClass() + ")");
       //组装资源加载器,主要就从runtimeservice中拿出配置的加载器,
       //如果没有配置资源加载器,默认是使用 
     // org.apache.velocity.runtime.resource.loader.FileResourceLoader
       //现在是junit单元测试,使用的是:ClasspathResourceLoader
      /**加载器支持放入List,你同时可以使用多个资源加载器,
         *在一个资源加载器加载不到资源的时候,会使用下一个加载器去加载 
        * 资源加载器都会放入sourceInitializerList
        **/
        assembleResourceLoaderInitializers();
       
        for (Iterator it = sourceInitializerList.iterator(); it.hasNext();)
        {
            /**
             *
             * in as an instance.扩展属性,如:具体文件加载目录,加载器。个人
             *绝对velocity的参数设置比较繁琐,又支持多个类里面设置,容易搞混
             */
            ExtendedProperties configuration = (ExtendedProperties) it.next();
          //从配置冲获取 资源加载器
            String loaderClass = StringUtils.nullTrim(configuration.getString("class"));
            ResourceLoader loaderInstance = (ResourceLoader) configuration.get("instance");

            if (loaderInstance != null)
            {
                resourceLoader = loaderInstance;
            }
            else if (loaderClass != null)
            {
                resourceLoader = ResourceLoaderFactory.getLoader(rsvc, loaderClass);
            }
            else
            {
                String msg = "Unable to find '" +
                          configuration.getString(RESOURCE_LOADER_IDENTIFIER) +
                          ".resource.loader.class' specification in configuration." +
                          " This is a critical value.  Please adjust configuration.";
                log.error(msg);
                throw new Exception(msg);
            }

            resourceLoader.commonInit(rsvc, configuration);
            resourceLoader.init(configuration);
            resourceLoaders.add(resourceLoader);
        }

        /*
         * now see if this is overridden by configuration
         */

        logWhenFound = rsvc.getBoolean(RuntimeConstants.RESOURCE_MANAGER_LOGWHENFOUND, true);

        /*
         *  获取 资源缓存器默认ResourceCacheImpl
         */

        String cacheClassName = rsvc.getString(RuntimeConstants.RESOURCE_MANAGER_CACHE_CLASS);

        Object cacheObject = null;

        if (org.apache.commons.lang.StringUtils.isNotEmpty(cacheClassName))
        {

            try
            {
                cacheObject = ClassUtils.getNewInstance(cacheClassName);
            }
            catch (ClassNotFoundException cnfe)
            {
                String msg = "The specified class for ResourceCache (" + cacheClassName +
                          ") does not exist or is not accessible to the current classloader.";
                log.error(msg, cnfe);
                throw cnfe;
            }

            if (!(cacheObject instanceof ResourceCache))
            {
                String msg = "The specified resource cache class (" + cacheClassName +
                          ") must implement " + ResourceCache.class.getName();
                log.error(msg);
                throw new RuntimeException(msg);
            }
        }

        /*
         *  if we didn't get through that, just use the default.
         */
        if (cacheObject == null)
        {
            cacheObject = new ResourceCacheImpl();
        }

        globalCache = (ResourceCache) cacheObject;
        //初始化资源缓存器的参数,包括缓存文件个数,使用LRUMap缓存
        globalCache.initialize(rsvc);

        log.trace("Default ResourceManager initialization complete.");
    } //上面是资源加载器的初始化

        2.资源加载器加载文件

       

 String resourceKey = resourceType + resourceName;
     //缓存中取资源
        Resource resource = globalCache.get(resourceKey);

        if (resource != null)
        {
            try
            {  //防止重入
                if (resource.requiresChecking())
                {
                   //刷新资源文件,判断修改时间是否有变化
                    resource = refreshResource(resource, encoding);
                }
            }
            catch (ResourceNotFoundException rnfe)
            {
               //文件找不到重新加载,清理缓存
                globalCache.remove(resourceKey);

                return getResource(resourceName, resourceType, encoding);
            }
            catch (ParseErrorException pee)
            {//...
            }
            catch (RuntimeException re)
            {//...
            }
        }
        else
        {
            try
            {
                //去磁盘加载vm文件
                resource = loadResource(resourceName, resourceType, encoding);
             //缓存功能是否开启 
            //REOURCE_LOADER_NAME.resource.loader.cache 通过这个key
            //来设置,REOURCE_LOADER_NAME 是设置resource loader 时候的key
          //engine.setProperty(Velocity.RESOURCE_LOADER,REOURCE_LOADER_NAME 
                if (resource.getResourceLoader().isCachingOn())
                {
                    globalCache.put(resourceKey, resource);
                }
            }
            catch (ResourceNotFoundException rnfe)
            { //...            }
        }

        return resource;

   //先保存一下

 

/** 整理一下初始化资源加载器的参数**/
参数可以直接velocityEngine.setProperties(key,value);
也可以extendedProperties = new ExtendedProperties();然后放入这个扩展属性中,然后把扩展属性设置到引擎属性velocityEngine.setExtendedProperties
如果两个都设置,底层会做两个properties的合并,当然也没必要两个一起弄了,让出出问题。
下面都是properties中需要添加的属性的key和value
1. resource.loader = reourceLoader (资源加载器名称,名字随便取)
2. reourceLoader.resource.loader.class =ClasspathResourceLoader.class.getName(); //junit 资源加载器
3. reourceLoader.cache=true (是否缓存资源文件)
4. reourceLoader.modificationCheckInterval=0 (检查文件修改时间,默认为0,每次都检查)

 

         

二、文件渲染

 首先值得注意的是SimplePool 性能值得考究,RuntimeConstants.PARSER_POOL_SIZE大小值得思考。RuntimeConstants.PARSER_POOL_CLASS 可以替换原有的池,底层inputStream转换为char[]

 有关渲染过程找到了两篇比较好的文章:

http://jiangbo.me/blog/2011/08/19/velocity_overview/

http://www.khotyn.com/2011/07/22/velocity_sourcecode/

 

 上传了一篇淘宝关于velocity优化的文章

 

分享到:
评论

相关推荐

    Seurat-to-RNA-Velocity:将Seurat对象与RNA Velocity结合使用的指南

    本指南将演示如何结合RNA Velocity分析使用已处理/标准化的Seurat对象。 请记住,尽管Seurat是基于R的,但是所有可用的RNA Velocity软件/软件包都是Python,因此我们将在两者之间来回移动。 我们将使用以下程序: ...

    JavaScript模板引擎Velocity.js.zip

    Velocity.js 是velocity... 语法分析和模板渲染分离 基本完全支持velocity语法 浏览器使用支持模板之间相互引用,依据kissy模块加载机制 三个Helper,友好的数据模拟解决方案 Vim Syntax 标签:Velocity

    当前流行的模板引擎效率分析(velocity,freeMarker,Smarty4j,httl)

    NULL 博文链接:https://dada-fangfang.iteye.com/blog/1622934

    Laravel开发-velocity

    Laravel开发-velocity Velocity是Laravel4的URL分析器。

    巴巴运动网velocity_ppt文档

    黎活明老师巴巴运动网velocity_ppt文档

    Velocity-crx插件

    简单,强大的asana报告,仪表板和分析 功能强大,自定义报告ASANA 选择数百个预设asana报告或构建您自己的自定义报告。 通过受让人,项目,部分,标签,团队,自定义字段筛选! Velocity Chrome扩展显示关于您在...

    javaweb开发JSP资料大全

    JSP安全编程实例浅析、JSP编程进度条设计实例、JSP的运行内幕、JSP和IIS的最佳解决方案实例分析、jsp内置对象--session对象和out对象、JSP中request属性的用法、用WebWork、JSP、Velocity建立注册页面、在JSP中使用...

    大数据分析资源合集完整版

    大数据可以概括为5个V, 数据量(Volume)、速度快(Velocity)、类型多(Variety)、价值(Value)、真实性(Veracity) 。大数据作为时下最火热的IT行业的词汇,随之而来的数据仓库、数据安全、数据分析、数据挖掘等等...

    互联网行业大数据分析报告项目信息分析.pptx

    大数据可以概括为5个V, 数据量大(Volume)、速度快(Velocity)、类型多(Variety)、价值(Value)、真实性(Veracity) 大数据分析 Hadoop HDFS、Hadoop MapReduce, HBase、Hive、Spark、Flink 渐次诞生,早期Hadoop...

    DynamicsResponse.rar_dynamics_velocity position

    这个函数估计轴的速度和加速度,主要用于分析实测数据, 但也可用于模拟结果。

    数据分析方法与技术.pptx

    Volume 海量的数据规模 Variety 多样的数据类型 Value Velocity 快速的数据流转 发现数据价值 要解决的问题 大数据技术被设计用于在成本可承受的条件下,通过非常快速(velocity)地采集、发现和分析,从大量...

    什么叫大数据分析.pdf

    大数据可以概括为 4 个 V, 数据量大(Volume) 、速度快(Velocity) 、类型多(Variety) 、价值 (Value) 。 大数据作为时下最火热的 IT 行业的词汇,随之而来的数据仓库、数 据安全、数据分析、数据挖掘等等...

    Spring+JPA+Velocity+Ehcache 商城系统是采用Java语言开发的多用户商城系统.zip

    ,使用Spring+JPA+Velocity+Ehcache作为基础开发架构,应用SpringSecurity框架管理系统权限,结合URL重写技术静态化商城前台页面。 毕业设计是高等教育阶段学生在完成学业前所进行的一项重要学术任务,旨在检验学生...

    物联网数据分析平台介绍.pptx

    Variety(类型) 大 多 Velocity(速度) 快 Value(价值) 低 Visualization (可视) 物联网数据分析平台介绍全文共12页,当前为第3页。 面临问题 物联网数据分析平台介绍全文共12页,当前为第4页。 风格多样 设计流畅 ...

    深入分析Java Web技术内幕高清PDF版.zip

    《深入分析Java Web技术内幕》围绕JavaWeb相关技术从三方面全面深入地进行阐述。首先介绍前端知识,主要介绍JavaWeb开发中涉及的一些基本知识,包括Web请求过程、HTTP协议、DNS技术和CDN技术。其次深入介绍Java技术...

    wave-equation migration velocity analysis by DSO

    利用DSO来进行地震速度分析。Shen(2004)博士论文。

    大数据与专利分析.doc

    "大数据"相对于传统"小数据"的特点,传播非常广泛的是Gartner集团分析师L aney所总结出的三个"V",即容量(Volume)、种类(Variety)、速度(Velocity)。 以此为基础,IBM进一步将其扩充到四个"V",即:1、容量...

    大数据分析一体机.pptx

    大数据技术将被设计用于在成本可承受(economically)的条件下,通过非常快速(velocity)的采集、发现和分析,从大量化(volumes)、多类别(variety)的数据中提取价值(value),属于IT 领域新一代的技术与架构 ...

    聊聊JS动画库 Velocity.js的使用

    前言 又到了炎热的7月,很久没有更新技术文章了,原因是上月月底实习结束,从公司离职。...既然我们大概了解了这两类动画,那么我们来分析下他们不同的优点 css动画 由于css3可以根据css属性自定义动画 所以

Global site tag (gtag.js) - Google Analytics