帮助
如果使用过程中遇到问题,可以
- BUG和需求请提交到:https://github.com/httl/httl/issues
- 即时讨论请加QQ群:184287288
- 有疑问请发邮件到:httl-user A googlegroups D com
- - 订阅发邮件到:httl-user+subscribe A googlegroups D com
- - 取消订阅发邮件到:httl-user+unsubscribe A googlegroups D com
- - 在线访问邮件列表:https://groups.google.com/forum/#!forum/httl-user
成员
创建者 (Founder)
- 梁飞 (天猫-平台架构 高级技术专家) 杭州
- 邮箱:liangfei0201 (At) gmail (Dot) com
- 博客:http://javatar.iteye.com
- 微博:http://weibo.com/liangfei0201
- 贡献:框架设计,引擎实现,SPI实现。
提交者 (Committer)
- 李鼎 (阿里云-技术专家) 杭州
- 邮箱:oldratlee (At) gmail (Dot) com
- 博客:http://oldratlee.com
- 微博:http://weibo.com/oldratlee
- 贡献:配置加载,异常改进,问题修复。
贡献者 (Contributor)
- 李飞 (朗华 - 技术主管) 西安
- 邮箱:myaniu (At) gmail (Dot) com
- 博客:http://my.oschina.net/myaniu/blog
- 贡献:JFinal和HTTL整合:#115
- 豆豆熊 (Freeborders - 数据库管理员) 成都
- 邮箱:xwinie (At) gmail (Dot) com
- 博客:http://my.oschina.net/xwinie/blog
- 贡献:Nutz和HTTL整合:#59
- 邮箱:zqq_90 (At) 163 (Dot) com
- 贡献:类型问题修复:#64
- 贡献:移除指令空白行实现:#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调试器,测试查看器等等。