Fork me on GitHub

模板引擎

  • 简洁友好的模板语法
  • 精益求精的性能优化
  • 高质量的设计与实现

帮助

如果使用过程中遇到问题,可以

  1. BUG和需求请提交到:https://github.com/httl/httl/issues
  2. 即时讨论请加QQ群:184287288
  3. 有疑问请发邮件到:httl-user A googlegroups D com
    1. - 订阅发邮件到:httl-user+subscribe A googlegroups D com
    2. - 取消订阅发邮件到:httl-user+unsubscribe A googlegroups D com
    3. - 在线访问邮件列表:https://groups.google.com/forum/#!forum/httl-user

成员

创建者 (Founder)

liangfei

提交者 (Committer)

liding

贡献者 (Contributor)

liding Xwinie ZQQ9
  • 邮箱:zqq_90 (At) 163 (Dot) com
  • 贡献:类型问题修复:#64
Subchen
  • 贡献:移除指令空白行实现:#89

用户

淘宝网

京东商城

大麦网

团博网

北京互联新网

收集中,如果你在使用HTTL,欢迎提供公司名...

解答

为什么要用#set声明变量类型?

强制要求声明变量#set定义,是为了明确模板的输入,这样可以强类型编译,提升性能。

也方便模板的维护,弱类型对长期维护运营的互联网应用极为不利,上千个工程师对模板修修补补。

谁还记得a对象有哪些属性,翻代码翻文档,有人改了a对象的某个属性,不会关联,也不提示。

就算开发IDE编辑器,也不能自动提示,也不能报错,等运行时检测,是很影响开发效率的。

阿里内部在给Velocity开发IDE编辑器就遇到了很大阻力,不得不通过注释给模板增加了类型定义。

参见:http://www.infoq.com/cn/articles/hk-semi-static-language

如何实现像JSP自定义标签的功能?

HTTL为防止模板复杂化,保持最简指令集,所以不允许用户扩展指令集,而通过扩展函数来实现相同功能。

自定义标签:<hasPrivilege resource="foo"> ... </hasPrivilege>

可替换为方法扩展:#if(hasPrivilege("foo")) ... #end

只需配置:import.methods+=com.your.YourPrivilegeStaticMethodClass

出现编译失败异常怎么办?

HTTL在编译失败后,会自动开启-Xlint:unchecked参数重新编译, 所以用户得到的异常信息中,已经包含了详细的JDK编译失败信息。

如果分析不出异常原因,HTTL同时会将生成的Java的代码打印在日志中, 你可以将代码复制出来,放到IDE中,看IDE的错误提示。

出现类或包找不到异常怎么办?

请检查httl,以及你所使用的类,是否在classpath下。

请检查import.packages的包名是否正确。

因为JdkCompiler必须用JDK运行,JRE不行,JDK比JRE多编译工具包, 只有JRE时请用JavassistCompiler,参见配置:模板编译器

出现找不到属性或方法怎么办?

如果出现以下异常信息:

No such property xxx in class java.lang.Object

No such method xxx() in class java.lang.Object

通常是变量的类型没有定义,请在模板中加入变量类型声明:#set(Xxx xxx)

出现改模板后不能生效怎么办?

HTTL在启动时会打印INFO日志显示配置的加载路径,如:

INFO: Load httl config from /home/foo/httl.properties in classpath.

你可以看下你的配置是否是日志打印位置上的那份,避免有多份httl.properties配置时,加载错了配置文件。

如果有多份配置,HTTL会打印WARN日志提醒用户,如:

WARN: Multi httl config in classpath, conflict configs: [/home/foo/httl.properties, /home/foo/conf/httl.properties]. Please keep only one config.

并且,HTTL在加载第一个模板时,会打印INFO日志显示模板所在绝对路径,如:

INFO: Load httl template from RELOADABLE directory /home/foo/templates by ClasspathLoader.

你可以看下你的模板是否在日志打印的模板目录下,避免修改的模板不在加载目录下,其中RELOADABLE表示开启了热加载,在没有开启热加载时修改模板需要重启。

模板渲染出现乱码怎么办?

如果出现乱码问题,请检查HTTL的编码配置:

input.encoding=UTF-8

output.encoding=UTF-8

缺省值都为file.encoding,即本地操作系统文件编码。

另外,MVC集成,缺省会将output.encoding的值写入response.setEncodingCharset()中,

当然,你也可以通过配置response.encoding=null关闭对response编码的自动设置,

如果使用OutputStream输出模板,请一定要确保response.encoding和output.encoding一致,否则输出内容会乱码。

请注意,input.encoding指的是从磁盘加载模板的编码,和request.getEncodingCharset并无关联,可以使用不同编码。

指令名和文本相接怎么办?

如:#elseTEXT,可用无参括号隔开,如:#if(x)AAA#else()BBB#end()CCC

${}占位符能否嵌套?

HTTL不支持占位符嵌套,如:${include("${dir}/file")},占位符内请用加号拼接字符串,如:${include(dir +"/file")}

参与

参与方式

你可以通过github pull将你的变更发给我们。

你也可以直接将代码,发邮件给我们:liangfei0201 (At) gmail (Dot) com

参与内容

文档补充

如果你发现有缺少的文档,或解答过的FAQ,使用心得,以及你对细节的理解,都可以发邮件给我们,我们将贴在此网站上,供其他人交流学习。

模板测试

你也可以帮忙测试更多场景的模板,只需提供测试模板和预期的结果文件即可,如:

已有测试模板:src/test/resources/comment/templates

已有测试结果:src/test/resources/comment/results

可运行httl.test.TemplateTest测试类,它会自动扫描和执行templates下的所有模板,并用results下的同名加.txt后缀的文件内容断言输出。

问题修复

你可以帮忙修复github issues上的问题。

核心改进

如果你有兴趣花较多时间参与HTTL,并且有一定开发实力,可以加入核心的改进:

  • 解释执行与编译执才的自动切换,类似于JVM的JIT。
  • 完整的泛型推导,和Java的泛型推导相同。
  • 生成字节码细节上的优化,比如减少instanceof,减少反射,减少装箱。
  • 异常信息友好性提示,比如运行时业务报错,提示在模板中的位置。
  • 在热加载时,支持卸载之前编译的模板类。
  • 支持磁盘缓存字节码,减少重启时编译。
  • 重构AST树,使之可扩展。

扩展实现

你也可以实现HTTL的扩展点,包括:

  • Static,静态方法
  • Loader,模板加载
  • Resolver,变量决策
  • Formatter,输出格式化
  • Filter,输出过滤
  • Converter,渲染参数转换
  • Interceptor,渲染过程拦截
  • Listener,渲染过程监听

框架集成

你也可以帮忙集成各种MVC框架,以及其它需要使用模板的场景。

辅助工具

你也可以帮忙实现Eclipse, IDEA等模板开发插件,以及Debug调试器,测试查看器等等。