最近心血来潮,开发了一个小工具,为了方便以后定制模板,打算使用模板语言,之前在项目中用过freemark和velocity,对于它们的语法都不喜欢,还是重造个轮子吧,哈哈。

先贴段代码吧:

test

${user.userName}

Hello World!

Hello World!

Hello World!

上面是页面代码, 下面是java代码

public static void main(String[] args)

{

String source = IO.read(new File("debug/test.html"), "UTF-8", 4096);

TemplateCompiler compiler = new TemplateCompiler(source);

System.out.println("source.length: " + source.length());

long t1 = System.currentTimeMillis();

Template template = compiler.compile();

long t2 = System.currentTimeMillis();

System.out.println("compile complete: " + (t2 - t1));

long t3 = System.currentTimeMillis();

for(int i = 0; i < 100; i++)

{

StringWriter writer = new StringWriter();

JspWriter out = new JspWriter(writer);

PageContext pageContext = new PageContext(out);

Map user = new HashMap();

user.put("userName", "xuesong.net");

pageContext.setAttribute("user", user);

template.evaluate(pageContext);

}

long t4 = System.currentTimeMillis();

System.out.println("run time: " + (t4 - t3));

}模板语法采用了jstl语法,是因为我最喜欢jsp的标签语法,简单易用,功能强大无所不能。

因此,采用了完全兼容 jsp标签的方式,用过jstl的对这个语法就不需要学了。支持自定义标签。在性能方面,采用了一次编译,多次运行的方式。

el表达式使用的是ognl。

实现原理:对文档进行编译,编译出一个树形结构的文档,执行过程对每一个节点进行处理,文本节点直接输出,标签节点由具体的java实现进行处理之后决定如何输出。

因此在对整个树形结构进行处理的时候有两种方式,第一种方法是使用递归处理,这种方式最简单,程序易读性也比较强。但是在某些框架下运行可能会对java栈造成比较大的开销。例如在struts下,如果使用了过多的拦截器,页面中又有太多的嵌套,可能很快就会造成StackOverFlow。还有一个缺点就是如果某些标签需要页面执行立即终止,递归操作就需要设置一个局部全局变量,并且处处检查该变量以决定是否立即终止递归。第二种方法,自定义一个栈,将节点压入栈中依次处理,这样递归操作就变成了一个循环操作,如果需要终止处理,只需要简单的break即可。最终要的是即便页面结构很复杂也不会对当前线程的栈造成很大的开销。

目前基本功能已经完成,正在做性能优化。目前的表现有点不太满意,一个50K大小的文档,编译大概需要300毫秒,每次执行大概需要60毫秒。执行已经没有优化的余地了,静态内容的输出基本是纯粹的IO操作,这个是在内存中处理的。动态的内容逻辑是java代码,也不可能优化了。

java语言for模板_java版的模板语言相关推荐

  1. java 抽象属性 设计_Java 抽象类与模板设计模式详解

    抽象类 抽象类是为了方法覆写而提供的类结构,因为其无法自身直接进行对象实例化操作,所以在实际应用中,抽象类主要目的是进行过程操作使用,当你要使用抽象类进行开发的时候,往往都是在你设计中需要解决类继承问 ...

  2. java:8最小镜像_Java:本地最小语言

    java:8最小镜像 在1996年至2002年之间,我用Java编写了成千上万行代码.我用Java 1.0到Java 1.4编写了Web框架,电子表格以及更多内容. 与90年代中期(预模板)的C ++ ...

  3. 安卓下的c语言ide,C语言编译器IDE安卓版下载-C语言编译器IDE下载v1.7 最新版-腾牛安卓网...

    C语言编译器IDE安卓版下载,一款专业实用的C语言编程工具,C语言编译器IDE帮助更多小伙伴们创建C语言项目,进行高效便捷的代码编辑,有需要就来下载. C语言编译器IDE介绍 C语言编译器IDE,是一 ...

  4. java门户网站模板_java门户网站模板.doc

    java门户网站模板 java门户网站模板 篇一:基于Java的快速建站框架实现 1 概述 1.1 课题背景 随着IT技术和互联网应用的蓬勃发展,类似Blog.BBS等类型的个人型网站的需求量也越来越 ...

  5. java excel 模板_java对Excel模板的读取

    java如何读取Excel简单模板 场景:对于经常需要导入Excel模板或数据来解析后加以应用的,使用频率非常之高,做了一个比较稳定的版本,体现在这些地方 工具:org.apache.poi 使用前必 ...

  6. java 实验报告模板_Java实验报告模板.doc.doc

    Java实验报告模板.doc 实 验 报 告 课程名称Java面向对象程序设计实验名称检查危险品姓名吴超益学号201424134114专业年级14物联网一.实验目的: 本实验的目的是让学生掌握try- ...

  7. java excel导出 模板_Java Excel 导出 模板

    上面导出PDF和EXCEL的问题是图片路径出错!!! 数据库中存存的图片路径是"../dishpic/722f464f-3883-42aa-901f-21706da9c582.png&quo ...

  8. java读写word模板_Java操作Word模板插入列表

    Java操作Word模板插入列表 通过poi操作word,插入各种编号的列表,包括数字,字母,罗马字符,自定义任意字符.下面的示例就用了音乐符♬. 1.制作模板,插入列表使用语法*,模板内容为{{*n ...

  9. java pdf 插入图片_java在pdf模板的指定位置插入图片

    个人感觉pdf的操作比word舒心多了 java操作pdf有个非常好用的库itextpdf,maven: com.itextpdf itextpdf 5.5.6 com.itextpdf itext- ...

最新文章

  1. 分割BiSeNet笔记
  2. awk rand函数问题
  3. java数组是否包含某字符串_js判断数组是否包含某个字符串变量的实例
  4. Sqli-labs less 45
  5. IntelliJ IDEA for Mac在MacOS模式下的版本控制/本地历史记录快捷键(VCS and Local History Shortcut)
  6. python中strip是什么意思啊_python中的strip是什么意思
  7. 哈哈~我这个月工资涨了1万5!
  8. Java刘意第八天笔记
  9. python模拟用户数据
  10. html跳转函数,javascript函数里如何实现页面跳转?
  11. Java课程设计- 记事本代码
  12. C#使用oledb连接excel执行Insert Into语句出现“操作必须使用一个可更新的查询”的解决办法
  13. 量化交易 均线、金叉死叉计算与交易策略
  14. android 语音识别文字
  15. pandas模块的统计指标--实现众数和众数的频数
  16. uCOS-II之邮箱
  17. android AudioRecord 音频录制 噪音消除
  18. 如何获取网站的ico图标
  19. 【音乐编程】基础知识一
  20. 2022-2027年中国教育云行业市场调研及未来发展趋势预测报告

热门文章

  1. kafka 配置及常用命令
  2. CMake结合Visual Studio中开发Qt应用程序注意事项
  3. [转载]IPhone之NSFileManager的使用
  4. 120所国家重点建设大学(211工程和教育部直属)[国家一类本科大学]详细情况一览表...
  5. [转]php初级教程(七)一个新闻管理系统(准备工作)
  6. 黑马程序员Linux系统开发视频之产生信号的方法
  7. 安徽省2019年普通高校招生文史、理工类最低控制分数线一览表
  8. word邮件合并一页8个_办公软件小课堂||word邮件合并
  9. java atomicfloat_Java:有没有AtomicFloat或AtomicDouble?
  10. 为什么需要消息队列?